5.1.7 代码数据流
WordCount程序是最简单也是最具代表性的MapReduce框架程序,下面再基于上例给出MapReduce程序执行过程中详细的数据流。
首先在MapReduce程序启动阶段,JobTracker先将Job的输入文件分割到每个Map Task上。假设现在有两个Map Task,一个Map Task一个文件。
接下来MapReduce启动Job,每个Map Task在启动之后会接收到自己所分配的输入数据,针对此例(采用默认的输入方式,每一次读入一行,key为行首在文件中的偏移量,value为行字符串内容),两个Map Task的输入数据如下:
<0,"hello world">
<0,"hello hadoop">
<14,"hello mapreduce">
Map函数会对输入内容进行词分割,然后输出每个单词和其频次。第一个Map Task的Map输出如下:
<"hello",1>
<"world",1>
第二个Map Task的Map输出如下:
<"hello",1>
<"hadoop",1>
<"hello",1>
<"mapreduce",1>
由于在本例中设置了Combiner的类为Reduce的class,所以每个Map Task将输出发送到Reduce时,会先执行一次Combiner。这里的Combiner相当于将结果先局部进行合并,这样能够降低网络压力,提高效率。执行Combiner之后两个Map Task的输出如下:
Map Task1
<"hello",1>
<"world",1>
Map Task2
<"hello",2>
<"hadoop",1>
<"mapreduce",1>
接下来是MapReduce的shuffle过程,对Map的输出进行排序合并,并根据Reduce数量对Map的输出进行分割,将结果交给对应的Reduce。经过shuffle过程的输出也就是Reduce的输入如下:
<"hadoop",1>
<"hello",<1,2>>
<"mapreduce",1>
<"world",1>
Reduce接收到如上的输入之后,对每个<key, value-list>进行处理,计算每个单词也就是key的出现总数。最后输出单词和对应的频数,形成整个MapReduce的输出,内容如下:
<"hadoop",1>
<"hello",3>
<"mapreduce",1>
<"world",1>
WordCount虽然简单,但具有代表性,也在一定程度上反映了MapReduce设计的初衷—对日志文件的分析。希望这里的详细分析能对大家有所帮助。