MapReduce的shuffle过程:这个过程就是输入一个杂乱,毫无规则的数据。在经过MapReduce通过自定义一些规则,分片,分区,在经过合并,归并的操作,最后让其按照这个规则输出来,写入磁盘。
1.输入分片---分片
输入分片(inputSpilt):在进入map之前,需要经过分片,在我们不设置分片的大小时候,有两种规则,一种就是block充满数据,就是分片的大小大约是一个block的大小,hadoop.1是64M,hadoop2.X之后是128M,第二种就是不满block的大小,就是文件本身的大小。当然也是可以自己设置分片的大小的。最后分配给一个map。
2.环形内存缓冲区
数据在经过Map处理过后,会形成一个key-value的键值对,它并不会被立刻写入磁盘,而是会进入内存---也是环形内存缓冲区,它其实本质是一个数组,一个下标从0开始,不断增加,当达到一定的阀值的时候,就像可以容纳100条数据,当达到80条的时候,就会溢出写入磁盘。
3.分区,合并
在经历过环形缓冲区的数据,在经过partition,会按照自定义的规则进行排序,按照key值经行分区,在把具有相同key的经过合并,产生新的key-value。
在这次小合并会用到Mapper中的Combiner,正是这Combiner才会使他们合并。
无Combiner:
有Combiner:
同一个prititioner数据必然shuffle到同一个Reduce,将合并后的数据发送到相应的Reduce,prititioner必定会与Reduce tack个数保持一致。
4.归并
当MapTask完成任务达到总数的5%之后,就会执行ReduceTask任务,每个ReduceTask默认启动5个copy数据从MapTask任务节点分别copy属于自己的数据,在经行Combiner,最后经过Merge生成最终的文件。
5,shuffle过程结束