迭代MapReduce

时间:2010-12-27 08:18:39

标签: python streaming hadoop mapreduce iteration

我为Hadoop编写了一个简单的k-means聚类代码(两个独立的程序 - mapper和reducer)。代码正在我本地方框上的2d点的小数据集上工作。它是用Python编写的,我打算使用Streaming API。

我想了解如何在Hadoop上运行此程序的最佳建议。

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

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

还有其他更容易,更简单的方法吗?如果集群碰巧使用公平的调度程序,那么在此计算完成之前很长时间?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

你应该结帐Oozie哪个应该为你做的工作: http://yahoo.github.com/oozie/

答案 2 :(得分:0)

以下是一些方法:github.com/bwhite/hadoop_vision/tree/master/kmeans

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

答案 3 :(得分:0)

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

所以,我写了一个有一个循环的主python脚本,在里面调用了我的PIG脚本。 PIG脚本内部调用了UDF。所以,不得不写三个不同的程序。但它很好。

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

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