2015-11-02 32 views
0

假设我想查找每个单词在某些文本中出现的次数。在MapReduce中,为什么map函数在查找单词出现时输出1?

我的理解是文本被分成几部分,每一部分都被传递给map。然后map会得到字出现的每个部分,并将结果传递到reduce,像这样:

for each word w in document: 
    occurrences[w] += 1 

return occurrences 

然而,根据MapReduce paperwikipediamap只会发出1对每个字,例如:

for each word w in document: 
    emit(w, 1) 

这不就是因为它将不得不遍历每个单词反正直接将文本部分传递到reduce是同样的事情?

此外,只是为了确保。如果我想用MapReduce对大数组进行排序,map是否将其排序为数组的一部分,然后reduce会合并排序后的数组,如mergesort?

回答

1

只是为了回顾一下如何的map-reduce作品:

在字数例子,你引,地图读取分流/节,你提到的。

在扫描单词部分时,地图不会执行发生次数, 地图正在做的是创建一个<"word",1>的键值对。这简化了缩减器对单词的下游聚合。

该映射正在这样做,以便处理该特定处理的reducer可以收集所有发送的<"word",1>元组,然后通过将所有1加在一起来生成计数。

总之,可以说你有一个单词列表如下:

cat 
rat 
mat 
bat 
cat 
sat 
bat 

比方说,我们有3名映射器可处理的文件分割如下:

分割1为mapper1:

cat 
rat 
mat 

Split2为mapper2:

bat 
cat 

Split3为mapper3:

sat 
bat 

的mapper1将发出:

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

Mapper2将发出:

<bat,1> 
<cat,1> 

Mapper3将发出:

<sat,1> 
<bat,1> 

铝尽管现实情况稍微复杂一些,但理想情况下,每个单词都有一个缩减器,并且他们从每个映射器接收元组。

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> 

将减速加起来,它已收到的所有元组和如下得到的总价值:

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

这是如何的map-reduce实现了字计数。这个想法是并行计数操作。

就你的排序问题而言,它比“合并”更像是一种“分水岭”技巧。 map-reduce框架将在内部对数据进行排序,并按照排序顺序将其传输到reducer。

有关更多详细信息,请检查此post

+0

喂,让我们说split1包含'cat','cat','mat'。为什么我不配置地图发出'',''而不是'','',''?谢谢 – mzee99

+1

@ mzee99 - 你可以。但是,这将需要你的地图持续为你的每个单词说明状态。组合器(https://hadooptutorial.wikispaces.com/Custom+combiner)通常用于执行您提到的步骤。 –

+0

单向或双向效率方面是否存在差异? – mzee99

0

如果你想Mapper想做减速机工作通过发射,使用Combiner,这是半减速器。 Combiner在Mapper的输出上工作,并在这里执行reducer作业。

如果您实施客户分区器,Shuffler和Reducer:它会更有效。

分隔器将确保减速器的负载均衡。

洗牌将确保一个特定的键映射器发射到一个特定的减速器。

组合器将做迷你减速机作业和Mapper的组合输出。

排序将在到达Reducer之前对Mapper输出的所有值进行排序。

在组合器的情况下,大部分时间组合器&减速器类将被设置为相同的类。

即使组合器,输出将是W,[1,1]代替W,[2]

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

看一看详细example和这个SE question和这一个SE Question 2

相关问题