概要
上篇文章介绍了MemoryStore对内存数据的管理,DiskStore是BlockStore的另一个实现类,负责管理磁盘数据。
结构
DiskStore继承BlockStore,实现了相关抽象方法,类图如下
DiskStore
DiskStore实现了BlockStore的putBytes、putArray、putIterator等方法,将数据写到磁盘,主要功能包括以下两点
-
序列化
putArray方法输入参数为Array[Any],写入磁盘需要对数据进行序列化操作,类似的,getValues方法需要对数据进行反序列化操作,默认使用JavaSerializer。 -
Java NIO
读写磁盘文件使用的是Java NIO,涉及到的API主要包括java.nio.ByteBuffer、java.nio.channels.FileChannel,更多内容参考Java NIO – Using ByteBuffer,和Spark中用法基本一致。
DiskBlockManager
DiskBlockManager的功能是维护了BlockId和对应的磁盘文件位置的关系,即BlockId对应的数据的存储位置,后面详细介绍。
磁盘文件组织
DiskBlockManager负责组织磁盘文件结构,提供根据blockId(即文件名)返回File对象的getFile方法,如下
如上图注释,DiskBlockManager使用两级目录管理文件,如下
| 目录 | 说明 | 默认值 |
| spark.local.dir | 磁盘文件的存储位置,可以配置多个,以逗号分隔 | /tmp |
| 一级目录 | 在spark.local.dir目录下创建一级目录,由blockmgr前缀加UUID组成 | blockmgr-{UUID} |
| 二级目录 | 在一级目录下创建二级目录,默认64个文件夹,16进制表示 | 00至3f(16进制的0到63) |
| 文件名 | 存储的文件内容可以是RDD、ShuffleData、Broadcast,以ShuffleDataBlockId为例,其格式为 “shuffle_” + shuffleId + “_” + mapId + “_” + reduceId + “.data” | 参考BlockId代码 |
例子
结合上面图表和代码,假设要存储的数据为ShuffleData,那么,这条数据的最终存储路径可以是/tmp/blockmgr-db9f05c5-4e94-47d5-a601-61944a53d345/3e/shuffle_1_9_0.data,也就是上面介绍的/$spark.local.dir/一级目录/二级目录/文件名的格式,其中shuffle_1_9_0.data中的1、9、0分别代表 shuffleId、mapId、reduceId 。
总结
介绍Spark对于磁盘文件的管理及读写。