Взломщик Combiner для потоковой передачи Hadoop - PullRequest
2 голосов
/ 27 февраля 2012

Текущая версия hadoop-streaming требует Java-класса для объединителя, но я где-то читал, что мы можем использовать хак, как показано ниже:

hadoop jar ./contrib/streaming/hadoop-0.20.2-streaming.jar  -input /testinput -output /testoutput -mapper "python /code/triples-mapper.py | sort | python /code/triples-reducer.py" -reducer /code/triples-reducer.py 

Однако, похоже, это не работает. Что я делаю не так?

1 Ответ

0 голосов
/ 30 марта 2012

Я подозреваю, что ваша проблема лежит где-то в следующем источнике:

http://svn.apache.org/viewvc/hadoop/common/tags/release-0.20.2/src/contrib/streaming/src/java/org/apache/hadoop/streaming/PipeMapRed.java?view=markup

строка 69 splitArgs() метод, который токенизирует команду, которую вы передали:

python /code/triples-mapper.py | sort | python /code/triples-reducer.py

в команду для запуска: /code/triples-mapper.py (строка 131/132), а затем набор передаваемых аргументов. Все токены передаются в ProcessBuilder (строка 164)

Java Api для ProcessBuilder

Таким образом, ваши каналы не интерпретируются ОС, более передаются в качестве аргументов вашему преобразователю (вы должны быть в состоянии подтвердить это, выгрузив аргументыпередан в код вашего картографа) * ​​1019 *

Это все для 0.20.2, поэтому, возможно, оно было «исправлено» для соответствия вашим целям в более поздней версии hadoop.

...