在mapreduce中,为什么map函数在查找单词出现时输出1?

rt4zxlrg  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(371)

假设我想找出每个单词在某个文本中出现的次数。
我的理解是,文本被分成几个部分,每个部分都被传递给 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那样合并排序的数组吗?

wpcxdonn

wpcxdonn1#

如果Map器希望通过发射来执行缩减器的工作,请使用combiner,它是半缩减器。合路器在Map器的输出上工作,并在这里做一个缩减器的工作。
如果您实现客户分区器、洗牌器和减速机:它将更有效。
分区器将确保减速器负载平衡。
shuffle将确保特定的键表单Map器被发送到特定的reducer。
合路器将完成小型减速机的工作和Map器的组合输出。
排序将在到达reducer之前对Map器输出的所有值进行排序。
在组合器的情况下,大多数情况下,组合器和减速机类将被设置为相同的类。
即使使用组合器,输出也将是w,[1,1],而不是w,[2]

//Set Combiner class as WordcounReducer class.
job.setCombinerClass(WordcountReducer.class);
job.setReducerClass(WordcountReducer.class);

看一看详细的例子,这个se问题和这个se问题2

dzhpxtsq

dzhpxtsq2#

回顾一下map reduce的工作原理:
在您引用的字数计算示例中,Map读取您提到的拆分/节。
在扫描单词部分时,Map不执行出现次数计数,Map所做的是创建一个关键字-值对 <"word",1> . 这简化了reducer对单词的下游聚合。
Map是这样做的,以便处理特定 "word" 可以收集所有的 <"word",1> 元组发送它的方式,然后通过将所有1相加来生成计数。
简而言之,假设您有一个单词列表,如下所示:

cat
rat
mat
bat
cat
sat
bat

假设我们有3个Map器处理文件拆分,如下所示:
Map器1的拆分1:

cat
rat
mat

Map器2的拆分2:

bat
cat

Map3的拆分3:

sat
bat

Map器1将发出:

<cat,1>
<rat,1>
<mat,1>

mapper2将发出:

<bat,1>
<cat,1>

mapper3将发出:

<sat,1>
<bat,1>

虽然实际情况稍微复杂一些,但理想情况下,每个单词都有一个缩减器,它们从每个Map器接收元组。

So reducer for cat receives:<cat,1> , <cat,1>
The reducer for rat receives: <rat,1>
The reducer for mat receives: <mat,1>
The reducer for bat receives: <bat,1>,<bat,1>
The reducer for sat receives: <sat,1>

每个reducer将接收到的所有元组相加,得到一个聚合值,如下所示:

<cat,2>
<rat,1>
<mat,1>
<bat,2>
<sat,1>

map reduce就是这样实现单词计数的。其思想是并行化计数操作。
至于你关于排序的问题,它更多的是一个“bucketing”技巧,而不是一个“merge”。map-reduce框架将在内部对数据进行排序,并按排序顺序将其流式传输到reducer。
更多详情请查看此帖。

相关问题