Проблемы потоковой передачи Hadoop - PullRequest
2 голосов
/ 03 августа 2011

Я столкнулся с этими проблемами при использовании потоковой передачи Hadoop. Я пишу код на Python

1) Совокупный пакет библиотеки

Согласно потоковым документам hadoop (http://hadoop.apache.org/common/docs/r0.20.0/streaming.html#Working+with+the+Hadoop+Aggregate+Package+%28the+-reduce+aggregate+option%29), существует встроенный класс Aggregate, который может работать как в качестве картографа, так и редуктора.

Вот команда:

shell> hadoop jar hadoop-streaming.jar -file mapper.py -mapper mapper.py -combiner aggregate -reducer NONE -input input_files -output output_path

Выполнение этой команды завершает работу картографа с этой ошибкой:

java.io.IOException: Cannot run program "aggregate": java.io.IOException: error=2, No such file or directory

Однако, если вы запустите эту команду, используя агрегат в качестве редуктора, а не объединитель, задание будет работать нормально.

shell> hadoop jar hadoop-streaming.jar -file mapper.py -mapper mapper.py -reduce aggregate -reducer NONE -input input_files -output output_path

Значит ли это, что я не могу использовать агрегатный класс в качестве объединителя?

2) Невозможно использовать | в качестве разделителя для общих параметров

Это пример команды по ссылке выше

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
-input myInputDirs \
-output myOutputDir \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-D stream.map.output.field.separator=. \
-D stream.num.map.output.key.fields=4 \
-D map.output.key.field.separator=. \
-D mapred.text.key.partitioner.options=-k1,2\
-D mapred.reduce.tasks=12

Вы не можете использовать | в качестве аргумента для map.output.key.field.separator. Ошибка

-D: command not found
11/08/03 10:48:02 ERROR streaming.StreamJob: Missing required options: input, output

(Обновление) Вы должны выйти из | с \ как это

-D stream.map.output.field.separator=\|

3) Невозможно указать опции -D в конце команды, как в примере. Ошибка

-D: command not found
11/08/03 10:50:23 ERROR streaming.StreamJob: Unrecognized option: -D

Документация неверна или я что-то не так делаю?

Любое понимание того, что я делаю неправильно, приветствуется. Thnx

1 Ответ

0 голосов
/ 06 августа 2014

Этот вопрос был задан 3 года назад, но сегодня у меня все еще возникла проблема с опцией -D, поэтому я добавлю немного информации для других людей, если у них возникнет такая же проблема.

Согласно руководству пользователяпотоковая передача hadoop:

bin/hadoop command [genericOptions] [commandOptions]

-D - это общая опция, поэтому вы должны поставить ее перед любой другой опцией.Так что в этом случае команда должна выглядеть так:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
-D stream.map.output.field.separator=. \
-D stream.num.map.output.key.fields=4 \
-D map.output.key.field.separator=. \
-D mapred.text.key.partitioner.options=-k1,2\
-D mapred.reduce.tasks=12
-input myInputDirs \
-output myOutputDir \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper \
-reducer org.apache.hadoop.mapred.lib.IdentityReducer \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
...