一、任务描述
目标是词频统计,即统计输入文本各单词的出现的次数。

二、可行性分析
并不是所有问题都适合MapReduce来解决。MapReduce的处理策略是“分而治之”,即把大块切分成小块然后放在不同的机器上执行。所以最重要的一点是数据彼此之间不依赖对方输出的结果。词频统计问题显然是满足这个特点的,所以可以用MapReduce来处理。
三、执行过程分步
假设待分析文本如下
Hello World Bye World
Hello Hadoop Bye Hadoop
Bye Hadoop Hello Hadoop
则执行过程如下
1. Split&RR
把原数据拆分为Split,然后RR转换为key-value格式,即可输入Map。对本例,可把行号作为key,把那一行的文本作为value,则Split&RR结果为
<1, "Hello World Bye World">
<2, "Hello Hadoop Bye Hadoop">
<3, Bye Hadoop Hello Hadoop">
2. Map
Split结果也就是Map的输入,而Map函数的逻辑设计为每遇到一个单词,就输出一个此单词为key、1为value的键值对。因此每个Split输入最终输出都是key-value组成的列表,如下图所示

3. Shuffle
对Map输出做Shuffle,结果会得到一个个<key,value-list>,也就是把拥有相同key的value归并起来(注意只发生在每个Map中,Map间不做数据交互)。对于本例子,如果不对Map输出做合并操作,则shuffle的结果如下

4. Reduce
Shuffle后的结果发送给Reduce任务作为输入。本例我们只有一个Reduce任务,它将各Map获得的数据汇总,函数逻辑就是把相同key的value做sum(即每个单词的频率),最终输出一个个key-value,如下图

四、完整执行过程
综上,完整过程如下图

如果在Shuffle时做合并操作,则过程是

即每个value list都先做了求和,但最终Reduce的结果是一样的。
Reference:
https://www.icourse163.org/learn/XMU-1002335004#/learn/content?type=detail&id=1214310154&sm=1