我有一个perl程序,它将获取一个输入文件并处理它并生成一个输出文件。现在我需要在hadoop上使用这个perl程序。所以perl程序将运行在边缘节点上存储的数据块上,我不应该修改perl代码。我不知道如何开始这个。有人可以给我任何建议吗?
我可以编写一个java程序,在mapper类中使用process builder调用perl程序并将结果合并到reducer类中吗?
还有其他方法可以达到这个目的吗?
答案 0 :(得分: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
(一个大的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。这似乎是使用的共识模块。