2014-12-05 3 views
0

У меня есть программа perl, которая возьмет входной файл и обработает его и создаст выходной файл в качестве результата. Теперь мне нужно использовать эту программу perl на hadoop. Так что программа perl будет запускаться на кусках данных, хранящихся на граничных узлах, что я не должен изменять код perl. Я не знал, как это начать. Может кто-то, пожалуйста, дайте мне какие-либо советы и предложения.Как выполнить программу perl внутри карты Уменьшить в Hadoop?

Могу ли я написать программу java, в классе сопоставления вызовите программу perl с помощью построителя процессов и объедините результаты в классе редуктора?

Есть ли другой способ достичь этого?

ответ

0

Обработчик процессов в любой программе java используется для вызова приложений или скриптов, отличных от Java. Обработчик процессов должен работать при вызове из класса mapper. Вы должны убедиться, что скрипт perl, исполняемый файл perl и библиотеки perl доступны для всех картографов.

6

Я считаю, вы можете сделать это с помощью hadoop streaming.

Согласно tom white, автор hadoop definitive guide, 3rd edition. Страница # 622, Приложение C.

Он использовал hadoop для выполнения сценария bash shell как mapper.

В вашем случае вам необходимо использовать perl script вместо этого bash shell script.

Использование: Он имеет lot of small files (один большой вход деготь файл), его сценарий оболочки, преобразует их в few big files (один большой выходной файл гудрон).

Он использовал hadoop для обработки их параллельно, указав bash shell script в качестве картографа. Поэтому этот картограф работает с входными файлами параллельно и дает результаты.

пример команды Hadoop: (копия вставили)

hadoop jar $HADOOP_INSTALL/contrib/streaming/hadoop-*-streaming.jar \ 
-D mapred.reduce.tasks=0 \ 
-D mapred.map.tasks.speculative.execution=false \ 
-D mapred.task.timeout=12000000 \ 
-input ncdc_files.txt \ 
-inputformat org.apache.hadoop.mapred.lib.NLineInputFormat \ 
-output output \ 
-mapper load_ncdc_map.sh \ 
-file load_ncdc_map.sh 

Заменить load_ncdc_map.sh с xyz.perl в обоих местах (последние 2 строки в команде).

Заменить ncdc_files.txt с другой текстовый файл, который содержит список входных файлов, подлежащих обработке (5-й линии от дна)

Предположения Выпущено:. У вас есть полностью функциональный ход Hadoop кластера и ваш Perl скрипт ошибка бесплатная.

Пожалуйста, попробуйте и дайте мне знать.

+0

Так что я не хочу писать карту java-программы для сокращения? Дело в том, что это непрерывный процесс. Нам нужно выполнить 4 или 5 скриптов. Для каждого скрипта вход будет результатом предыдущего скрипта. Это все последовательная и пакетная обработка. – learner

+1

@learner, Да - вам не нужно писать новую программу MR. Вы можете повторно использовать описанный выше запрос hadoop с вашими изменениями. Я предлагаю написать нового родителя.perl, которая не содержит ничего, кроме ваших 4-5 child-sequential.perl программ. Поэтому вы можете предоставить программе parent.perl как mapper для hadoop, hasoop будет запускать эту программу perl на данных узлах как отдельную программу в этой системе. Пожалуйста, попробуйте и дайте мне знать. –

+0

Спасибо :) sure :) – learner

-1

бит поздно к партии ...

Я собираюсь начать использовать Hadoop :: Streaming. Это, по-видимому, модуль согласия.