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
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:
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:
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% 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.