wie verhindert werden kann, dass der Hadoop-Job in einer beschädigten Eingabedatei fehlschlägt

8

Ich führe einen Hadoop-Job für viele Eingabedateien durch. Wenn jedoch eine der Dateien beschädigt ist, schlägt der gesamte Job fehl.

Wie kann ich den Job machen, um die beschädigte Datei zu ignorieren? schreiben Sie vielleicht für mich ein Zähler / Fehlerprotokoll, aber nicht scheitern den ganzen Job

    
Julias 17.02.2013, 10:41
quelle

3 Antworten

6

Es hängt davon ab, wo Ihr Job fehlschlägt - wenn eine Zeile beschädigt ist und irgendwo in Ihrer Map-Methode eine Exception ausgelöst wird, sollten Sie den Body Ihrer Map-Methode einfach mit try / catch umbrechen und einfach loggen können Der Fehler:

%Vor%

Aber wenn der Fehler vom RecordReader Ihres InputFormat ausgelöst wird, dann müssen Sie die Mapper run(..) -Methode ändern - wer ist die Standardimplementierung wie folgt:

%Vor%

Sie könnten dies also ändern, um die Ausnahme beim Aufruf von context.nextKeyValue() abzufangen, aber Sie müssen vorsichtig sein, wenn Sie alle vom Leser geworfenen Fehler ignorieren - eine IOExeption kann beispielsweise nicht "überspringbar" sein, indem Sie einfach ignorieren Fehler.

Wenn Sie Ihr eigenes InputFormat / RecordReader geschrieben haben und Sie eine bestimmte Ausnahme haben, die einen Record-Fehler anzeigt, aber das Überspringen und weitere Parsen erlaubt, dann wird wahrscheinlich so etwas funktionieren:

%Vor%

Aber nur um neu zu iterieren - Ihr RecordReader muss in der Lage sein, bei einem Fehler wiederherzustellen, ansonsten könnte der obige Code Sie in eine Endlosschleife schicken.

Für Ihren speziellen Fall - wenn Sie eine Datei beim ersten Fehler einfach ignorieren wollen, dann können Sie die run-Methode auf etwas viel Einfacheres aktualisieren:

%Vor%

Einige letzte Worte der Warnung:

  • Sie müssen sicherstellen, dass nicht der Mapper-Code die Ausnahme auslöst, sonst ignorieren Sie Dateien aus dem falschen Grund
  • GZip-komprimierte Dateien, die nicht GZip-komprimiert sind, werden bei der Initialisierung des Datensatz-Lesegeräts fehlschlagen - daher wird der obige Typ diesen Fehler nicht erfassen (Sie müssen Ihre eigene Record-Reader-Implementierung schreiben). Dies gilt für alle Dateifehler, die während der Erstellung des Datensatz-Readers ausgelöst werden.
Chris White 17.02.2013, 14:07
quelle
2

Dies ist, was Fehlerfallen für die Kaskadierung verwendet werden:

  

Immer wenn ein Vorgang fehlschlägt und eine Ausnahme auslöst, wird der betreffende Tupel in der Ressource gespeichert, die durch den Trap-Tap angegeben wurde. Dadurch kann der Job ohne Datenverlust weiter verarbeitet werden.

Damit wird Ihr Job im Wesentlichen fortgesetzt und Sie können Ihre beschädigten Dateien später überprüfen

Wenn Sie mit der Kaskadierung in Ihrer Flussdefinition vertraut sind:

%Vor%

Fehlerfallen

    
Engineiro 09.04.2013 21:30
quelle
0

Es gibt auch einen anderen möglichen Weg. Sie könnten die Konfigurationsoption mapred.max.map.failures.percent verwenden. Natürlich könnte diese Art der Lösung dieses Problems auch einige andere Probleme während der Kartenphase verbergen.

    
Marcin Pietraszek 19.04.2013 12:15
quelle

Tags und Links