简介
小黑盒shuffle是用来将数据转换成key-values数组形式,具体思想流程加源码透析如图:
图形解析
首先我们知道①InputFormat接口子类
jdk1.8源码: protected void map(KEYIN key, VALUEIN value, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
context.write(key, value);
}
MapShuffle⑩
图中可以看到多个Mapper并行执行map()方法,多个map并行工作而且相互不影响,每个map工作结束后就会将输出的key-value对先存储在内存的缓存区中,这个③缓存区是环状类似于Hash中的链表<只不过链表首尾呼应而这个环状是上下呼应那种>一样对数据进行放置,但是缓存区是有默认内存的,这时候程序会多开辟一条线程SpillThread对缓存区进行实时监控,
//源码MapTask类
protected class SpillThread extends Thread {
protected SpillThread() {
}
当数据存储过大就会将内存缓存区中的数据溢写到spill到本地磁盘中去
ReduceShuffle⑪
然后开始执行ReduceShuffle,直到这里MapShuffle阶段完成后会出现临近的和相同的key⑤排序着,而且每个key会对应多种多样的value,而ReduceShuffle阶段的目的就是为了让相同的key的所有value合并到一起然后进行上下排序的过程。图中可以看出这是一个MapShuffle的执行原理,当4个Mapper并行执行map()方法的时候,会出现每个map()在执行的过程时⑥,就可能会有相同的key,这个key可能对应相同的value也可能对应不同的value,ReduceShuffle执行会将相同的key就行归并,归并的方式可能是2个或者3个等不定<可以在配置中调节>不同的进行数据合并也就是说key中会对应2个或者多个不同的value⑦,然后在次排序,用同样的方法进行排序,⑧最后的到的就是key-values的数组形式,每个过程排序+合并,最终的结构就是key—values的数组形式并且每个key上下排序着;
排序后生成的大文件放在map程序本机的本地磁盘,⑨并且等待reduce()来拷贝数据;
!!当执行到此处,可以进行以下两个可设置的操作:
-1- Combiner(map端的reduce),文件合并的时候,可以执行reduce端操作(将相同key的value合并在一起),这种操作不是每个reduce程序都可以进行,只有不影响最终结果的情况下,才能够进行Combiner操作。
-2- 压缩:在此处可以将合并后的大文件进行压缩,压缩后可以减少磁盘的占用量,当reduce copy时也可以减少网络IO
这样一个完整的小黑盒shuffle处理就结束了.曹天博客地址