磁盘存储主要是DiskBlockManager和DiskStore两个类。比较简单。
DiskBlockManager:block和磁盘文件对应关系
DiskStore:将block实际写入磁盘文件
DiskBlockManager
主要类的成员:
localDirs: Array[File] 本地工作目录,参数是spark.local.dir
subDirs: Array[Array[File]] 子目录,spark.local.dir下面创建的子目录
getflie 获取block对应的文件,没有的话会创建
getFile
首先计算hash值,根据hash取余获取第一层目录,hash先整除再取余获取第二层目录。
如果对应的文件存在就直接返回,没有的话就创建一个新的file,放对应位置。
getAllFiles/getAllBlocks
getAllFiles是遍历subDirs的所有子目录下的文件。
getAllBlocks是调用getAllFiles。
createTempLocalBlock/createTempShuffleBlock
创建临时block也是调用getFile方法。
DiskStore
blockSizes:记录block和大小的map结构
put/putBytes:数据写入文件
getBytes:从文件中读取数据
remove:移除block
moveFileToBlock:将文件数据(一般是临时文件)转移到新的文件中
put/putBytes
putBytes是调用put方法。
- diskManager获取对应文件
- 将fileChannel包装成可以计数的CountingWritableChannel,写入的时候可以计数
- 调用writeFunc函数将数据写入
- 更新blockSizes的信息
getBytes
最终是将flie对象封装成DiskBlockData对象。DiskBlockData可以方便转换。