日期:2014-05-16 浏览次数:20547 次
纯干货:通过WourdCount程序示例:详细讲解MapReduce之Block+Split+Shuffle+Map+Reduce的区别及数据处理流程。
Shuffle过程是MapReduce的核心,集中了MR过程最关键的部分。要想了解MR,Shuffle是必须要理解的。了解Shuffle的过程,更有利于我们在对MapReduce job性能调优的工作有帮助,以及进一步加深我们对MR内部机理的了解。Shuffle到底是什么,自己在参考一位大牛两年前的博客,关于MR系列的文章中,才知道前辈什么时候已经开始相应的工作,真实佩服。这里通过对前辈的概念梳理,加上自己的见解,来尽可能的梳理清楚什么是Shuffle过程,什么是block,什么是split,从此处揭开MR的神秘面纱。
在上篇博客中简单给出了Shuffle的概念,稍提了一下split,但没有谈block。在了解Shuffle之间我们要先了解一下block与split。Shuffle给出的定义是copy,copy一片数据,这里的一片数据你可以理解成一个split数据。但数据上传到HDFS中,数据被分块,被分成一个个的block块,这就引出了什么是block,什么是split,以及split和block的区别是什么?在解决block与split之后,就是重中之中,map和reduce过程,这就开始吧。
你把文件上传到HDFS中,第一步就是数据的划分,这个是真实物理上的划分,数据文件上传到HDFS后,要把文件划分成一块一块,每块的大小可以有hadoop-default.xml里配置选项进行划分。这里默认每块64MB,一个文件被分成多个64MB大小的小文件,最后一个可能于64MB。注意:64MB只是默认,是可以更改的,下面会谈到如何更改。
<property>
<name>dfs.block.size</name>
<value>67108864</value>
<description>The default block size for new files.</description>
</property>
数据的划分有冗余,冗余的概念来自哪儿?为了保证数据的安全,上传的文件是被复制成3份,当一份数据宕掉,其余的可以即刻补上。当然这只是默认。
<property> <name>dfs.replication</name> <value>3</value> <description> Default block replication.The actual number of replications can be specified when the file is created.The default is used if replication is not specified in create time. </description> </property>
Hadoop中,有另一种关于数据的划分。这里定义了一个InputFormat接口,其中一个方法就是getSplits方法。这里就谈到了split。由于Hadoop版本更新换代很快,不同版本中的split的划分是由不同的job任务来完成的。早早先的版本split是有JobTracker端弯沉的,后来的版本是由JobClient完成的,JobClient划分好后,把split.file写入HDFS中,到时候JobTracker端读这个文件,就知道split是怎样划分的了。这种数据的划分其实只是一种逻辑上的划分,目的是为了让Map Task更好的获取数据。
例如:
File1:Block11,Block12,Block13,Block14,Block15 File2:Block21,Block22,Block23
如果用户在程序中指定map tasks的个数,比如说是2,如果不指定maptasks个数默认是1,那么在FileInputFormat(最常见的InputFormat实现)的getSplits方法中,首先会计算totalSize=8(源码中定义,注意getSplits这个函数计算的单位是Block个数,而不是Byte个数,后面有个变量叫bytesremaining表示剩余的 Block个数,不要根据变量名就认为是度byte的字数),然后会计算goalSize=totalSize/numSplits=4,对于File1,计算一个Split 有多少个Block就是这样计算的。