2010-12-09 3 views
1

Zunächst einmal bin ich ein Neuling von Hadoop.EOFException von einem Hadoop-Programm geworfen

Ich habe ein kleines Hadoop-Pipes-Programm, das java.io.EOFException auslöst. Das Programm nimmt als Eingabe eine kleine Textdatei und verwendet hadoop.pipes.java.recordreader und hadoop.pipes.java.recordwriter. Der Eingang ist sehr einfach wie:

1 262144 42.8084 15.9157 4.1324 0.06 0.1 

jedoch Hadoop wird eine EOFException werfen, die ich nicht den Grund sehen kann. Unten ist der Stack-Trace:

10/12/08 23:04:04 INFO mapred.JobClient: Running job: job_201012081252_0016 
10/12/08 23:04:05 INFO mapred.JobClient: map 0% reduce 0% 
10/12/08 23:04:16 INFO mapred.JobClient: Task Id : attempt_201012081252_0016_m_000000_0, Status : FAILED 
java.io.IOException: pipe child exception 
    at org.apache.hadoop.mapred.pipes.Application.abort(Application.java:151) 
    at org.apache.hadoop.mapred.pipes.PipesMapRunner.run(PipesMapRunner.java:101) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307) 
    at org.apache.hadoop.mapred.Child.main(Child.java:170) 
Caused by: java.io.EOFException 
    at java.io.DataInputStream.readByte(DataInputStream.java:267) 
    at org.apache.hadoop.io.WritableUtils.readVLong(WritableUtils.java:298) 
    at org.apache.hadoop.io.WritableUtils.readVInt(WritableUtils.java:319) 
    at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.run(BinaryProtocol.java:114) 

BTW, ich das verteilte voll-Modus auf einen lief (ein Cluster mit drei Arbeits Knoten).

Jede Hilfe ist willkommen! Danke

Antwort

0

Dieser Stacktrace ist in der Regel bezeichnend für das Auslaufen von verfügbaren Dateideskriptoren innerhalb Ihrer Worker-Maschinen. Dies ist äußerst häufig, dokumentiert spärlich, und genau deshalb habe ich zwei relatedquestions zum Thema.

Wenn Sie Root-Zugriff auf alle Maschinen haben, sollten Sie den Grenzwert für Dateideskriptoren für Hadoop Benutzer erhöhen betrachten /etc/sysctl.conf bearbeite:

(Add) fs.file-max = 4096 

Oder Ausgabe:

ulimit -Sn 4096 
ulimit -Hn 4096 

Ad infinitum . Allgemeine Informationen zum Erhöhen dieses Grenzwerts sind available here.

Aus der Perspektive der langfristigen Planung ist diese Strategie jedoch etwas falsch. Wenn Sie zufällig weitere Informationen zu dem Problem finden, können Sie vielleicht help me help you help us all? [Danke, GLaDOS. -Ed]

(Edit: Kommentar Siehe die folgt.)

+0

Vielen Dank! Leider hat das Erhöhen des Limits für mich nicht funktioniert. Noch mehr Ideen? Unterdessen denke ich, dass ich versuchen werde, diese Frage auf der Hadoop-Mailing-Liste zu posten – peng

+0

Ich würde mich für die Antwort interessieren. Ein Teil des Grundes, dass diese Strategie falsch ist, ist, dass das Hadoop-Framework seine WRT-Verwendung von Dateideskriptoren nicht angibt. Die Angabe einer beliebig hohen Zahl funktioniert offensichtlich nicht, wenn das System das Limit überschreitet. Sie können auch das Limit für Softdeskriptoren auf Ihrem System überprüfen, da Hadoop dies zu respektieren scheint. – MrGomez

+0

Das Problem wurde behoben. Es war total schlecht. Es gab einen Segmentierungsfehler in meinem Pipes-Programm, der die Exception ausgelöst hat. Allerdings denke ich, dass die Ausnahme Neulingen wie mir geheimnisvoll erscheint. Vielleicht können die Hadoop-Leute die Fehlerberichte etwas aufpolieren? – peng

1

Was haben wir gelernt: mit allen Mitteln versuchen, sicherzustellen, dass es keine Fehler in Ihrem eigenen Programm.

Verwandte Themen