【问题标题】:Iterative MapReduce迭代 MapReduce
【发布时间】:2010-12-27 08:18:39
【问题描述】:

我为 Hadoop 编写了一个简单的 k-means 集群代码(两个独立的程序 - 映射器和化简器)。该代码正在处理我本地盒子上的一个二维点的小数据集。它是用 Python 编写的,我打算使用 Streaming API。

我想就如何最好地在 Hadoop 上运行这个程序提出建议。

每次运行 mapper 和 reducer 后,都会生成新的中心。这些中心是下一次迭代的输入。

据我所知,每次 mapreduce 迭代都必须是一个单独的 mapreduce 作业。看起来我必须编写另一个脚本(python/bash)来在每个 reduce 阶段之后从 HDFS 中提取新中心,并将其反馈给 mapper。

还有其他更简单、更简洁的方法吗?如果集群碰巧使用了一个公平的调度器,那么这个计算完成之前会很长吗?

【问题讨论】:

    标签: python streaming hadoop mapreduce iteration


    【解决方案1】:

    你不需要写另一份工作。您可以将同一个作业放在一个循环中(一个while循环)并不断更改作业的参数,这样当mapper和reducer完成它们的处理时,控制从创建一个新配置开始,然后你就自动拥有一个输入文件,它是前一阶段的输出。

    【讨论】:

      【解决方案2】:

      Hadoop 的 Java 接口具有链接多个作业的概念: http://developer.yahoo.com/hadoop/tutorial/module4.html#chaining

      但是,由于您使用的是 Hadoop Streaming,因此您不支持链接作业和管理工作流。

      您应该检查 Oozie,它应该为您完成这项工作: http://yahoo.github.com/oozie/

      【讨论】:

        【解决方案3】:

        这里有几种方法:github.com/bwhite/hadoop_vision/tree/master/kmeans

        也检查一下(有 oozie 支持):http://bwhite.github.com/hadoopy/

        【讨论】:

          【解决方案4】:

          回答我自己的问题感觉很有趣。我使用了 PIG 0.9(尚未发布,但在后备箱中可用)。在这方面,通过允许将 PIG 语句嵌入到 Python 等脚本语言中来支持模块化和流控制。

          所以,我编写了一个主要的 Python 脚本,它有一个循环,在里面称为我的 PIG 脚本。 PIG 脚本反过来调用 UDF。所以,不得不写三个不同的程序。但结果很好。

          您可以在此处查看示例 - http://www.mail-archive.com/user@pig.apache.org/msg00672.html

          为了记录,我的 UDF 也是用 Python 编写的,使用了允许以脚本语言编写 UDF 的这一新功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-08-31
            • 1970-01-01
            • 2017-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-22
            相关资源
            最近更新 更多