如何在Hadoop中的Map Reduce中执行perl程序?

时间:2014-12-05 05:11:10

标签: java perl hadoop mapreduce hadoop-streaming

我有一个perl程序,它将获取一个输入文件并处理它并生成一个输出文件。现在我需要在hadoop上使用这个perl程序。所以perl程序将运行在边缘节点上存储的数据块上,我不应该修改perl代码。我不知道如何开始这个。有人可以给我任何建议吗?

我可以编写一个java程序,在mapper类中使用process builder调用perl程序并将结果合并到reducer类中吗?

还有其他方法可以达到这个目的吗?

3 个答案:

答案 0 :(得分:6)

我相信你可以用hadoop streaming来做到这一点。

根据tom whitehadoop definitive guide, 3rd edition的作者。第# 622页,附录C.

他使用hadoop执行bash shell脚本作为mapper

在您的情况下,您需要使用perl script而不是bash shell script

用例:他有一个lot of small files(一个大的tar文件输入),他的shell脚本将它们转换为few big files(一个大的tar文件输出)。

他使用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脚本没有错误。

请尝试让我知道。

答案 1 :(得分:0)

任何java程序中的进程构建器用于调用非Java应用程序或脚本。从mapper类调用时,Process构建器应该可以工作。您需要确保所有映射器都可以使用perl脚本,perl可执行文件和perl库。

答案 2 :(得分:-1)

迟到了派对......

我即将开始使用Hadoop :: Streaming。这似乎是使用的共识模块。