MapReduce的源码分析中map端输出的源码分析

分区:

只有一个reduce的情况下,partition号为0

分区大有1的情况下,采用hash的方法:

在输入阶段最核心的类是LineRecorderReader()

在输出阶段最核心的类是MapOutputBuffer()

 

达到80%的时候会溢写磁盘。

mapoutputkey做了三件事:

①:设置缓冲区溢写磁盘的大小80%

②:准备了一个快排比较器,比较器底层看用户定义的,如果用户没有定义,那么就用系统默认的排序算法

③:排序

④:combiner:就是一个微缩版的reduce的实现,combiner实际上集成的是reduce方法

combiner可以设定,必须继承reduce方法

 默认情况下,溢写磁盘三次就会触发一次combiner 去执行,其实在溢写磁盘之前的sort阶段,也有一个比较小的combiner

溢写线程:

 在这里有一个write方法,默认是(k,v)和p的形式。

 在map端的write最终会以序列化的形式溢写在内存缓冲区中。

环形缓冲区:从零的位置开始放key和value,从另一个方向开始放索引,在剩下的部分:

按照赤道分开,继续存放key,value和索引

 

 

 最终完成首位相接。

交换key,value的位置的时候,可以考虑交换索引的位置。

 

当达到80%的时候会溢写磁盘,在溢写磁盘之前会又一次sort排序

 

new map

 输出会有一个刷新

 shuffle有一个sortandsplit

这才触发combiner

 总之:

在map端输出的过程中,首先又一次排序,在排序阶段有一个比较小的combiner,当buffer缓冲区中的大小达到80%的时候,会溢写磁盘,默认3次溢写磁盘之后,会发生combiner,就是在map端的预聚合。

猜你喜欢

转载自blog.csdn.net/wyqwilliam/article/details/82824689
今日推荐