一、概述

数据块的迭代器 ShuffleBlockFetcherIterator 可以从本地或远端获取数据块,本地数据块通过 BlockManager 对象进行获取;远端数据块通过数据块传输服务:BlockTransferService 服务来获取。

二、设计

2.1. 结构

2.1.1. 属性

三、初始化

ShuffleBlockFetcherIterator 是读取中间结果的关键。初始化 ShuffleBlockFetcherIterator 的时候会调用到 $initialize()$ 方法~

3.1. 划分本地与远程 Block

$partitionBlocksByFetchMode()$ 方法用于划分哪些 Block 从本地获取,哪些需要远程拉取。

1
2
val remoteRequests = partitionBlocksByFetchMode(
blocksByAddress, localBlocks, hostLocalBlocksByExecutor, pushMergedLocalBlocks)

3.2. 将 FetchRequest 随机排序存入

1
fetchRequests ++= Utils.randomize(remoteRequests)

3.3. 远程请求 Block 中间结果

遍历 fetchRequests 中的所有FetchRequest,远程请求Block中间结果。

3.4. 获取本地 Block

4)调用fetchLocalBlocks获取本地Block。