我正在尝试使用Hadoop运行Kmeans。我想将我的Reducer的cleanup方法中计算出的簇的质心保存到某个文件中,例如centroids.txt。现在,我想知道如果多个reducers的清理方法同时启动会发生什么,并且所有这些方法都会尝试同时写入此文件。它会在内部处理吗?如果没有,有没有办法同步这个任务?
请注意,这不是我的reducer输出文件。这是我维护的另一个文件,用于跟踪质心。我正在使用reducer的清理方法中的BufferedWriter来做到这一点。
答案 0 :(得分:3)
是的,你是对的。使用现有框架无法实现这一点。 清理将被多次调用。您无法同步。可能 你可以遵循的方法是
- 醇>
成功完成工作后调用合并。
hadoop fs -getmerge <src> <localdst> [addnl]
2清楚地指定输出文件的位置。使用此文件夹作为下一个作业的输入。
3链多一个MR。 map和reduce不会更改数据,分区程序会将所有数据分配给单个reducer
答案 1 :(得分:0)
每个reducer都会写入一个单独的文件。多个Reducer永远不能修改同一个文件。
答案 2 :(得分:0)
由于质心相对较少,你可以将它们写入zookeeper。如果你有很高的读/写负载,你可能需要HBase(你也可以在这里使用,但这可能是一种过度杀伤)
另请注意,Hadoop上有几个k-means实现,如Mahout。其中一些实现比map / reduce更有效,例如Apache Hama使用BSP或Spark在内存中运行