【问题标题】:Call mapper when reducer is donereducer 完成时调用 mapper
【发布时间】:2016-02-07 04:32:24
【问题描述】:

我正在执行这项工作:

hadoop/bin/./hadoop jar /home/hadoopuser/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar  -D mapred.reduce.tasks=2 -file kmeans_mapper.py    -mapper kmeans_mapper.py -file kmeans_reducer.py \
-reducer kmeans_reducer.py -input gutenberg/small_train.csv -output gutenberg/out

当两个减速器完成后,我想对结果做点什么,所以理想情况下我想调用另一个文件(另一个映射器?),它将接收减速器的输出为它的输入。如何轻松做到这一点?

我检查了这个 blog,它有一个 Mrjob 示例,没有解释,我不知道该怎么做。

MapReduce tutorial 声明:

用户可能需要链接 MapReduce 作业来完成无法通过单个 MapReduce 作业完成的复杂任务。这相当容易,因为作业的输出通常会发送到分布式文件系统,而输出又可以用作下一个作业的输入。

但它没有给出任何例子......

这里是some code in Java 我可以理解,但我正在写Python! :/


这个问题揭示了一些Chaining multiple mapreduce tasks in Hadoop streaming

【问题讨论】:

  • 您指定了输出到 hdfs 目录,对吧?您需要将其作为您的输入进行另一项 mapreduce 工作
  • 是的@cricket_007,我不确定如何通过一个电话来做到这一点。我的意思是我可以像我的回答一样执行该作业,然后执行另一个作业,该作业只会调用一个映射器。但这似乎很奇怪,我不能按一次 ENTER 键吗? :)
  • 我很确定您正在阅读的教程(对于您链接到的页面已经超过 2 年)是说 Java MapReduce api 允许将作业串在一起。蒸汽 mapreduce 只经过标准输入和标准输出。您可能能够通过彼此通过管道传输命令,但前提是您输出到标准输出
  • @cricket_007 是的,我使用sys.stdin 输入,print 输出。
  • 对,在你的 python 代码中,因为这是流 api 的工作方式,但它被捆绑在一个 jar 文件中,并发送到 hdfs。您将无法将作业的标准输出返回到本地终端以将其通过管道传输到新命令,这就是将输出写入 HDFS 的原因

标签: python hadoop mapreduce cluster-computing distributed-computing


【解决方案1】:

您可以按照您找到的示例使用 Java API 完成您的要求。

但是,您使用的是流式 API,它只是读取标准输入并写入标准输出。除了 hadoop jar 命令的完成之外,没有回调可以说明 mapreduce 作业何时完成。但是,因为它完成了,并不代表真正的“成功”。话虽如此,如果没有围绕流 API 的更多工具,这确实是不可能的。

如果输出被写入本地终端而不是 HDFS,则可以将该输出通过管道传输到另一个流式作业的输入,但不幸的是,流式处理 jar 的输入和输出需要 HDFS 上的路径。

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 2013-11-05
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多