Przesyłanie strumieniowe Hadoop - usuń zakładkę końcową z wyjścia reduktora

Mam zadanie strumieniowania hadoop, którego dane wyjściowe nie zawierają par klucz / wartość. Możesz myśleć o nim jako o parach wartościowych lub parach tylko kluczy.

Mój reduktor strumieniowy (skrypt php) wyświetla rekordy oddzielone znakami nowej linii. Strumieniowanie Hadoop traktuje to jako klucz bez wartości i wstawia kartę przed nową linią. Ta dodatkowa zakładka jest niepożądana.

Jak go usunąć?

Używam hadoop 1.0.3 z AWS EMR. Pobrałem źródło hadoop 1.0.3 i znalazłem ten kod w hadoop-1.0.3 / src / contrib / streaming / src / java / org / apache / hadoop / streaming / PipeReducer.java:

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

Próbowałem więc przejść-D stream.reduce.output.field.separator= jako argument do pracy bez szczęścia. Próbowałem też-D mapred.textoutputformat.separator= i-D mapreduce.output.textoutputformat.separator= bez szczęścia.

Szukałem google oczywiście i nic, co znalazłem, nie działało. Jeden wynik wyszukiwania stwierdził nawet, że nie ma argumentu, który mógłby zostać osiągnięty, aby osiągnąć pożądany wynik (chociaż wersja hadoop w tym przypadku była naprawdę bardzo stara).

Oto mój kod (z dodatkowymi podziałami wierszy dla czytelności):

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'

questionAnswers(3)

yourAnswerToTheQuestion