个人总结,以官网为准
如有错误,欢迎指出

主要步骤:
- 在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方法,在这个方法中使用下载回调,然后写入一个临时文件。



-
在哪里写入数据

本文深入剖析Spark Shuffle过程中,包括ShuffleMapTask执行、数据读取与写入的详细流程。讲解了SortShuffleWriter如何通过ExternalSorter进行数据排序,ShuffleBlockFetcherIterator如何获取并读取本地与远程数据块,以及MapOutputTracker在数据地址与大小获取中的作用。同时阐述了BlockManager在读取与写入数据中的关键角色。
1666

被折叠的 条评论
为什么被折叠?



