【问题标题】:How to execute a perl program inside Map Reduce in Hadoop?如何在 Hadoop 的 Map Reduce 中执行 perl 程序?
【发布时间】:2014-12-05 05:11:10
【问题描述】:

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

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

还有其他方法可以实现吗?

【问题讨论】:

    标签: java perl hadoop mapreduce hadoop-streaming


    【解决方案1】:

    我相信您可以使用 hadoop streaming 做到这一点。

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

    他使用hadoopmapper 的形式执行bash shell 脚本。

    在您的情况下,您需要使用 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
    

    在这两个地方用你的xyz.perl 替换load_ncdc_map.sh(命令的最后两行)。

    ncdc_files.txt 替换为另一个包含要处理的输入文件列表的文本文件。(从底部算起的第5 行)

    假设:您有一个功能齐全的 hadoop 集群正在运行,并且您的 perl 脚本没有错误。

    请尝试告诉我。

    【讨论】:

    • 所以我不想写 Map reduce java 程序??问题是,这是一个持续的过程。我们需要执行 4 或 5 个脚本。对于每个脚本,输入将是前一个脚本的输出。这都是顺序和批处理。
    • @learner ,是的 - 你不需要编写新的 MR 程序。您可以在修改后重用上述 hadoop 查询。我建议编写一个新的 parent.perl 程序,它只包含 4-5 个 child-sequential.perl 程序。因此,您可以将 parent.perl 程序作为映射器提供给 hadoop,hadoop 将在给定节点上将该 perl 程序作为该系统上的独立程序运行。请尝试告诉我。
    • 如果有些脚本在 perl 中,有些在 python 中,有些在 R 中,我该怎么办。如何在 hadoop map 中执行这种场景减少修改脚本
    • @learner ,如果您能够在单个程序中一起运行所有这些程序,例如 shell 脚本,其中包含对这些子程序的调用以及在您的机器中作为独立的输入输出通道的管道(即没有 hadoop),那么可以将一个超级程序作为映射器提供给 hadoop。这个想法是,如果您可以在独立模式下运行任何程序而没有任何问题,那么您也可以在 hadoop 中使用它。这样,您无需更改 perl/python/r 代码即可使用 hadoop。希望这可以澄清。
    • 谢谢@Jagadish。我会试试的。你能给我一些参考例子吗?由于我还没有编写任何 shell 脚本,所以我正在为如何启动它而苦苦挣扎。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      聚会迟到了……

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多