Hadoop-Streaming - Entfernen Sie den abschließenden Tab vom Reduziererausgang

Ich habe einen Hadoop-Streaming-Job, dessen Ausgabe keine Schlüssel / Wert-Paare enthält. Sie können sich das als Nur-Wert-Paare oder Nur-Schlüssel-Paare vorstellen.

Mein Streaming Reducer (ein PHP-Skript) gibt Datensätze aus, die durch Zeilenumbrüche getrennt sind. Beim Hadoop-Streaming wird dies als ein Schlüssel ohne Wert behandelt und ein Tabulator vor der neuen Zeile eingefügt. Dieser zusätzliche Tab ist unerwünscht.

Wie entferne ich es?

Ich verwende Hadoop 1.0.3 mit AWS EMR. Ich habe die Quelle von hadoop 1.0.3 heruntergeladen und diesen Code in hadoop-1.0.3 / src / contrib / streaming / src / java / org / apache / hadoop / streaming / PipeReducer.java gefunden:

reduceOutFieldSeparator = job_.get("stream.reduce.output.field.separator", "\t").getBytes("UTF-8");

Also habe ich versucht vorbei zu kommen-D stream.reduce.output.field.separator= als Argument für den Job ohne Glück. Ich habe es auch versucht-D mapred.textoutputformat.separator= und-D mapreduce.output.textoutputformat.separator= ohne glück.

Ich habe natürlich nach Google gesucht und nichts, was ich gefunden habe, hat funktioniert. In einem Suchergebnis wurde sogar angegeben, dass kein Argument übergeben werden konnte, um das gewünschte Ergebnis zu erzielen (obwohl die Hadoop-Version in diesem Fall wirklich sehr, sehr alt war).

Hier ist mein Code (mit zusätzlichen Zeilenumbrüchen zur besseren Lesbarkeit):

hadoop jar streaming.jar -files s3n://path/to/a/file.json#file.json
    -D mapred.output.compress=true -D stream.reduce.output.field.separator=
    -input s3n://path/to/some/input/*/* -output hdfs:///path/to/output/dir
    -mapper 'php my_mapper.php' -reducer 'php my_reducer.php'

Antworten auf die Frage(3)

Ihre Antwort auf die Frage