从hadoop中的多个reducer写入单个文件

时间:2014-04-25 17:06:37

标签: hadoop file-io mapreduce hadoop2

我正在尝试使用Hadoop运行Kmeans。我想将我的Reducer的cleanup方法中计算出的簇的质心保存到某个文件中,例如centroids.txt。现在,我想知道如果多个reducers的清理方法同时启动会发生什么,并且所有这些方法都会尝试同时写入此文件。它会在内部处理吗?如果没有,有没有办法同步这个任务?

请注意,这不是我的reducer输出文件。这是我维护的另一个文件,用于跟踪质心。我正在使用reducer的清理方法中的BufferedWriter来做到这一点。

3 个答案:

答案 0 :(得分:3)

  

是的,你是对的。使用现有框架无法实现这一点。   清理将被多次调用。您无法同步。可能   你可以遵循的方法是

     
      
  1. 成功完成工作后调用合并。

         

    hadoop fs -getmerge <src> <localdst> [addnl]

         

    here

  2.         

    2清楚地指定输出文件的位置。使用此文件夹作为下一个作业的输入。

         

    3链多一个MR。 map和reduce不会更改数据,分区程序会将所有数据分配给单个reducer

答案 1 :(得分:0)

每个reducer都会写入一个单独的文件。多个Reducer永远不能修改同一个文件。

答案 2 :(得分:0)

由于质心相对较少,你可以将它们写入zookeeper。如果你有很高的读/写负载,你可能需要HBase(你也可以在这里使用,但这可能是一种过度杀伤)

另请注意,Hadoop上有几个k-means实现,如Mahout。其中一些实现比map / reduce更有效,例如Apache Hama使用BSP或Spark在内存中运行