假设我想找出每个单词在某个文本中出现的次数。
我的理解是,文本被分成几个部分,每个部分都被传递给 map
. map
然后获取每个部分的单词出现次数,并将结果传递给 reduce
,如下所示:
for each word w in document:
occurrences[w] += 1
return occurrences
然而,根据mapreduce文件和维基百科, map
只会为每个单词发出1,如下所示:
for each word w in document:
emit(w, 1)
这和将文本部分传递给 reduce
直接因为它必须遍历每个单词?
还有,只是为了确定一下。如果我想用mapreduce对一个大数组进行排序,你会这样做吗 map
排序它是数组的一部分,然后 reduce
会像mergesort那样合并排序的数组吗?
2条答案
按热度按时间wpcxdonn1#
如果Map器希望通过发射来执行缩减器的工作,请使用combiner,它是半缩减器。合路器在Map器的输出上工作,并在这里做一个缩减器的工作。
如果您实现客户分区器、洗牌器和减速机:它将更有效。
分区器将确保减速器负载平衡。
shuffle将确保特定的键表单Map器被发送到特定的reducer。
合路器将完成小型减速机的工作和Map器的组合输出。
排序将在到达reducer之前对Map器输出的所有值进行排序。
在组合器的情况下,大多数情况下,组合器和减速机类将被设置为相同的类。
即使使用组合器,输出也将是w,[1,1],而不是w,[2]
看一看详细的例子,这个se问题和这个se问题2
dzhpxtsq2#
回顾一下map reduce的工作原理:
在您引用的字数计算示例中,Map读取您提到的拆分/节。
在扫描单词部分时,Map不执行出现次数计数,Map所做的是创建一个关键字-值对
<"word",1>
. 这简化了reducer对单词的下游聚合。Map是这样做的,以便处理特定
"word"
可以收集所有的<"word",1>
元组发送它的方式,然后通过将所有1相加来生成计数。简而言之,假设您有一个单词列表,如下所示:
假设我们有3个Map器处理文件拆分,如下所示:
Map器1的拆分1:
Map器2的拆分2:
Map3的拆分3:
Map器1将发出:
mapper2将发出:
mapper3将发出:
虽然实际情况稍微复杂一些,但理想情况下,每个单词都有一个缩减器,它们从每个Map器接收元组。
每个reducer将接收到的所有元组相加,得到一个聚合值,如下所示:
map reduce就是这样实现单词计数的。其思想是并行化计数操作。
至于你关于排序的问题,它更多的是一个“bucketing”技巧,而不是一个“merge”。map-reduce框架将在内部对数据进行排序,并按排序顺序将其流式传输到reducer。
更多详情请查看此帖。