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