将所有映射器中的数据发送到所有reducer

时间:2013-10-10 21:33:14

标签: hadoop hadoop-partitioning

在此问题被标记为重复之前,请仔细阅读。

这已被多次询问,没有明确的答案。让我们说我的任务是为数百万个文件中的每个单词计算unigram概率。我可以从映射器发出字数,减少器可以聚合每个字的计数。但是,为了计算概率,我们需要总的字数。一种方法是使用特殊键将每个映射器的字数发送到每个缩减器,并对键进行排序,使得这些计数比单个计数更早到达。减速器可以简单地将从映射器接收的计数加起来以获得总字数。

但是如何让映射器向所有reducer发送计数?

我可以从工作属性中找出减速器的总数,比如n。有没有办法从每个映射器调用Context.write() n次,并依次从0n-1指定分区号,以便数据到达所有reducer?

1 个答案:

答案 0 :(得分:1)

您可以为此目的使用自定义Partitioner

根据缩减器n的数量,您可以使用映射器中的键n1,... 2发出wordcount n次。自定义Partitioner类将确保缩减器i仅获取具有键i的值。