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'