MapTask shuffle的流程总结

MapTask shuffle的流程

              ①在map()调用context.write()

              ②调用MapoutPutBuffer的collect()

                            调用分区组件Partitionner计算当前这组key-value的分区号

              ③将当前key-value收集到MapOutPutBuffer中

                            如果超过溢写的阀值,在后台启动溢写线程,来进行溢写!

              ④溢写前,先根据分区号,将相同分区号的key-value,采用快速排序算法,进行排序!

                            排序并不在内存中移动key-value,而是记录排序后key-value的有序索引!

              ⑤ 开始溢写,按照排序后有序的索引,将文件写入到一个临时的溢写文件中

                            如果没有定义Combiner,直接溢写!

                            如果定义了Combiner,使用CombinerRunner.conbine()对key-value处理后再次溢写!

              ⑥多次溢写后,每次溢写都会产生一个临时文件

              ⑦最后,执行一次flush(),将剩余的key-value进行溢写

              ⑧MergeParts: 将多次溢写的结果,保存为一个总的文件!

                     在合并为一个总的文件前,会执行归并排序,保证合并后的文件,各个分区也是有序的!

                     如果定义了Conbiner,Conbiner会再次运行(前提是溢写的文件个数大于等于3)!

                     否则,就直接溢写!

              ⑨最终保证生成一个最终的文件,这个文件根据总区号,分为若干部分,每个部分的key-value都已经排好序,等待ReduceTask来拷贝相应分区的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值