我为Hadoop编写了一个简单的k-means聚类代码(两个独立的程序 - mapper和reducer)。代码正在我本地方框上的2d点的小数据集上工作。它是用Python编写的,我打算使用Streaming API。
我想了解如何在Hadoop上运行此程序的最佳建议。
每次运行mapper和reducer后,都会生成新的中心。这些中心是下一次迭代的输入。
从我所看到的,每个mapreduce迭代都必须是一个单独的mapreduce工作。看起来我必须编写另一个脚本(python / bash),以便在每个reduce阶段之后从HDFS中提取新的中心,并将其反馈给mapper。
还有其他更容易,更简单的方法吗?如果集群碰巧使用公平的调度程序,那么在此计算完成之前很长时间?
答案 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的新功能。