MapReduce作为一个并行计算框架,MR一共分为三个部分分别是Map->Shuffle->Reduce,我们就从这三个步骤来理解MapReduce。
1.map端
Hadoop将MapReduce的输入数据分成等长的数据块,这个过程叫做input split也就是分片,然后为每一个分片分配一个map任务,然后通过用户自己定义的逻辑来处理这些分片里的数据,这里就有一个问题,分片的大小应该是多大的呢,一般认为split的大小应该趋向于HDFS中一个Block的大小,因为Hadoop在存有输入数据的节点上运行map任务,可以获得最佳的性能(这样可以不占用节点之间的带宽资源也就是传说中的数据本地化优化)。输入完数据后,数据按照用户定义的逻辑办成了一个一个的<key,value>对,然后向reduce端输入。
2.shuffle过程
shuffle可以说是MapReduce的灵魂所在。我们来看一下shuffle的过程。map端不停地输出<key,value>对,这时就有一个问题出现了,他们这些<key,value>对要去哪里呢,map的中间过程需要reduce处理后才是最终结果,所以将中间过程存储到HDFS中显得有点小题大做,所以它们就需要一个去处,这个去处就是本地磁盘,每个map任务都有一个环形内存缓冲区用于存储map的输出,这个缓冲区默认的大小是100MB,可是如果map的输出大于100MB怎么办呢,这就需要设置一个阈值(通常是80%),一旦环形内存缓冲区存储的数据到达阈值,一个后台的线程就会开始把内容溢出到磁盘中。并且在溢出的过程中,map持续向缓冲区中写入数据。在写入磁盘之前,线程首先会根据数据最终要传的reducer来把数据划分成相应的分区(partition),在一个分区中,线程会按照键进行内存中的排序,然后reducer通过HTTP来获得map输出文件的分区。
3.reduce过程
reduce获得的数据是来自许多的map,所有的map不可能同时完成任务,所以在每个任务完成的时候,reduce任务就开始复制他的输出,这个过程叫做reduce的复制阶段,reducer如何知道需要从哪台机器获得输出的,这就需要心跳机制与application master作用了,我会写另一篇来解释。复制完所有的map输出后reduce进入排序阶段(更确切的说是合并阶段,因为排序是在map端进行的)这个过程合并map输出维持顺序,最后传送给reduce函数,reduce函数执行用户定义的逻辑,将最终结果输出到文件系统中(一般为HDFS中)