HDFS LeaseExpiredException
Ich habe eine Anwendung, die soll das kopieren über eine große Anzahl von Dateien von einer Quelle wie S3 in HDFS. Die Anwendung verwendet apache distcp innerhalb und Kopien für jede einzelne Datei aus der Quelle über streaming in HDFS.
Jede einzelne Datei ist etwa ~1GB, hat 1K Spalten von strings.
Wenn ich wählen Sie zum kopieren über alle Spalten, die schreiben schlägt fehl mit der folgenden Fehlermeldung :-
2014-05-20 23:57:35,939 WARN org.apache.hadoop.hdfs.DFSClient: Error Recovery for block null bad datanode[0] nodes == null
2014-05-20 23:57:35,939 WARN org.apache.hadoop.hdfs.DFSClient: Could not get block locations. Source file "/xyz/2014/01/02/control-Jan-2014-14.gz" - Aborting...
2014-05-20 23:57:54,369 ERROR abc.mapred.distcp.DistcpRunnable: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException: No lease on /xyz/2014/01/02/control-Jan-2014-14.gz File does not exist. [Lease. Holder: DFSClient_attempt_201403272055_15994_m_000004_0_-1476619343_1, pendingcreates: 4]
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:1720)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:1711)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:1619)
at org.apache.hadoop.hdfs.server.namenode.NameNode.addBlock(NameNode.java:736)
at sun.reflect.GeneratedMethodAccessor41.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:578)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1393)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1389)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1149)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1387)
Ich glaube, dass es ist, weil es wegen der Einnahme von zu viel Zeit zum schreiben einer großen Datei von der Quelle in HDFS. Wenn ich änderungen an der Anwendung zu kopieren, nur über 50,100 oder 200 Spalten, die Anwendung zum Abschluss ausgeführt. Anwendung schlägt fehl, wenn die Anzahl der Spalten, die kopiert werden, für jede Zeile > 200.
Ich habe keine Kontrolle über die Quelle-Dateien.
Ich kann nicht scheinen, etwas zu finden, um den wachsenden Leasing-Ablauf.
Irgendwelche Hinweise ?
Etwa nach einer minute, wenn die distcp eröffnet hat, den stream mit der source-Datei.
Nur eine minute? Scheint nicht zu sein, weil die Zeit genommen, um zu kopieren. Ich hab das manchmal, wenn die Datei gelöscht wurde, während das kopieren. Sind Sie sicher, einige andere Prozess nicht löschen Sie es?
Ja ich bin mir ziemlich sicher, dass kein anderer Prozess ist, löschen Sie die Dateien.
Bitte beachten Sie, dass es keine solche Fehlermeldung, wenn ich wählen, um zu schreiben, nur bis zu 200 Spalten für jede Zeile in der src-Datei während der Iteration durch den inputStream über bufferedReader. Aber wenn ich darüber hinaus gehen und 200 Reihe, es beginnt zu spucken, dieser Fehler.
InformationsquelleAutor user1084874 | 2014-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, Endlich konnte ich bestimmen, was Los ist. So aus der Quelle, S3, unsere Anwendung war das herunterladen von Dateien wie
/xyz/2014/01/week1/abc
/xyz/2014/01/week1/def
/xyz/2014/01/week2/abc
/xyz/2014/01/week2/def
/xyz/2014/01/week3/abc
/xyz/2014/01/week3/def
Beachten Sie die gleichen Dateinamen in unterschiedlichen Wochen. Und dann jede dieser Dateien werden geschrieben, um HDFS mit dem DFSClient. Also im Grunde genommen mehrere Mapper versucht zu schreiben "gleiche Datei" (wegen der gleichen Datei-Namen wie abc, def), obwohl die Dateien waren tatsächlich anders. Als AUFTRAGGEBER erwerben muss ein Mietvertrag vor dem schreiben der Datei und wie die Kunden schreiben Sie die erste der "abc" - Datei wurde nicht die Freigabe der lease während des Songwriting-Prozesses, die anderen Kunden zu schreiben versucht, die andere "abc" - Datei war das werfen der LeaseExpriedException mit dem Mietvertrag Mismatch Nachricht.
Aber dies immer noch nicht erklären, warum der client die erste erwarb die Pacht für das schreiben war nicht erfolgreich. Ich meine, ich würde erwarten, dass in einem solchen Fall, dass der erste Schriftsteller, der alle diese Dateien erfolgreich zu sein. Irgendeine Erklärung ?
Vielen Dank für diese. Dies geschah zu mir, wenn ein ansible-playbook wurde inadvertedly kopieren den gleichen Satz von Dateien auf mehreren Knoten mit demselben Ziel werden in hdfs. Ändern der Vorgang ausgeführt, sobald das problem behoben.
InformationsquelleAutor user1084874