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端的预聚合。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值