在此问题被标记为重复之前,请通读。
这个问题被问了很多次,没有明确的答案。假设我的任务是计算unigram
数百万个文件中每个单词的概率。我可以从映射器发出字数,reducers 可以汇总每个单词的字数。然而,为了计算概率,我们需要单词的总数。一种方法是使用特殊键将每个映射器的单词数发送到每个化简器,并对键进行排序,以使这些计数早于单个计数到达。然后,reducer 可以简单地将从映射器接收到的计数相加,以获得单词总数。
但是如何让映射器向所有减速器发送计数?
我可以从工作属性中找出减速器的总数,比如n
. 有没有办法Context.write()
n
从每个映射器调用次数并依次指定分区号从0
到n-1
,以便数据到达所有减速器?