MapTask 源码解析(DEBUG步骤):
1. context.write() 自定义的map方法的写出,进入
2. output.write() 收集方法,进入两次
3. collector.collect() 收集器
4. HashPartitioner 默认分区器
5. collect() map端所有的kv全部写出后走下面的close方法
6. collector.flush() 溢出刷写方法
7. sortAndSpill() 溢写排序
8. sorter.sort() 溢写排序方法
9. mergeParts() 合并文件
10. collector.close() 收集器关闭,进入ReduceTask
ReduceTask 源码解析(DEBUG步骤):
1. if(isMapOrReduce()) 搜索,提前打断点
2. initialize() 进入
3. init(shuffleContext) 提前给下面打断点
totalMaps = job.getNumMapTasks() ShuffleSchedulerImpl 第120行
merger = createMergeManager(context) Shuffle 第80行
MergeManagerImpl 第232和235行
this.inMemoryMerger = createInMemoryMerger(); 内存合并
this.onDiskMerger = new OnDiskMerger(this); 磁盘合并
4. rIter = shuffleConsumerPlugin.run()
eventFetcher.start(); 抓取数据,Shuffle 107行 提前断点
eventFetcher.shutDown(); 抓取结束,Shuffle 141行 提前断点
copyPhase.complete(); copy阶段完成,Shuffle 151行
5. taskStatus.setPhase(TaskStatus.Phase.SORT) 开始排序阶段,Shuffle 152行
6. sortPhase.complete(); 排序阶段完成,进入reduce阶段 reduceTask 382行
7. reduce(); 调用自定义reduce方法,多次调用
8. cleanup(context); reduce完成之前最后调用一次Reducer里面的cleanup方法