分区:
只有一个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端的预聚合。