个人总结,以官网为准
如有错误,欢迎指出
主要步骤:
- 在excutor线程池里执行ShuffleMapTask时,触发ShufflRdd的compute函数
- ShuffleRdd 使用BlockStoreShuffleReader 给SortShuffleWriter返回一个迭代器。
-SortShuffleWriter 间接通过 ExternalSorter 调用迭代器的next函数开始获取shuffle前一步的数据 - ShuffleBlockFetcherIterator 在初始化的时候,先区分出本地数据块和远程数据块,并通过NettyBlockTransferService获取数据写入文件
- SortShuffleWriter 通过shuffleId, mapId 把数据从临时文件中使用BlockManager写入block块文件中
关于MapOutputTracker的使用
MapOutputTracker 在shuffle过程中用于远程数据地址和大小的获取和上传到MapOutputMaster
-
在哪里获取数据地址和大小
BlockStoreShuffleReader 调用MapOutputTrackerWorker的getMapSizesByExecutorId的方法给ShuffleBlockFetcherIterator
-
在哪里上传数据地址和大小给MapoutputMaster
SortShuffleWriter 使用BlockManager写入数据后,返回一个MapStatus给
excutor的TaskRunner,然后一路返回到DAGScheduler中的handleTaskCompletion方法中调用MapOutputMaster的registerMapOutput注册信息
关于BlockManaer的使用
-
在哪里读取本地数据
在ShuffleBlockFetcherIterator 初始化的方法中initialize
-
在哪里读取远程数据
由于shuffle过程是边读边写所以,读取过程其实是包含写文件的动作的。
也是在ShuffleBlockFetcherIterator 初始化的方法中initialize,发送了fetch请求。
然后沿着调用链,调用到NettyBlockTransferService的fetchBlocks,触发OneForOneBlockFetcher start方法,在这个方法中使用下载回调,然后写入一个临时文件。
-
在哪里写入数据