在此问题被标记为重复之前,请仔细阅读。
这已被多次询问,没有明确的答案。让我们说我的任务是为数百万个文件中的每个单词计算unigram
概率。我可以从映射器发出字数,减少器可以聚合每个字的计数。但是,为了计算概率,我们需要总的字数。一种方法是使用特殊键将每个映射器的字数发送到每个缩减器,并对键进行排序,使得这些计数比单个计数更早到达。减速器可以简单地将从映射器接收的计数加起来以获得总字数。
但是如何让映射器向所有reducer发送计数?
我可以从工作属性中找出减速器的总数,比如n
。有没有办法从每个映射器调用Context.write()
n
次,并依次从0
到n-1
指定分区号,以便数据到达所有reducer?
答案 0 :(得分:1)
您可以为此目的使用自定义Partitioner
。
根据缩减器n
的数量,您可以使用映射器中的键n
,1
,... 2
发出wordcount n
次。自定义Partitioner
类将确保缩减器i
仅获取具有键i
的值。