作为整个Mapreduce中最为神秘,复杂的部分,恰恰是平时业务中最经常接触的地方。仅仅依靠map和reduce阶段的业务代码编辑,是不能满足平时的业务需要的。真正的业务处理中,经常会涉及到自定义partition,sort,groupcomparator等情况。而只有了解清楚了shuffle阶段是怎么运行的,才能更好的帮助我们按需修改mapreduce中的各个组件。
废话不说,直接进入主题!
Shuffle阶段,详细的来说可以分为三个部分:map-shuffle,fetch和reduce-shuffle。整个shuffle阶段的开始是从map输出键值对开始,到reduce阶段接受键值对之前。
name我们就从第一个阶段map-shuffle开始说起。通过查阅maptask的源码,我们知道,context.write方法其实等价于output.write方法,而output.write方法其实是调用了底层的collector的collect方法,该方法有三个参数,分别为:key,value 和getPartition的返回值---reducetask的个数。通过collector对象,我们发现mapOutputCollector的父类mapOutputBuffer实现了一个很复杂的功能,就是我们常说的环形缓冲区。由此可以得出,从maptask出来的数据全部都进入了这个环形缓冲区当中。下面我们来具体聊下这个环形缓冲区的作用。