Spark Storage之DiskStore

来源:互联网 发布:php 输出正三角形 编辑:程序博客网 时间:2024/06/06 02:24

概要

上篇文章介绍了MemoryStore对内存数据的管理,DiskStore是BlockStore的另一个实现类,负责管理磁盘数据。

结构

DiskStore继承BlockStore,实现了相关抽象方法,类图如下

DiskStore

DiskStore实现了BlockStore的putBytes、putArray、putIterator等方法,将数据写到磁盘,主要功能包括以下两点

  • 序列化
    putArray方法输入参数为Array[Any],写入磁盘需要对数据进行序列化操作,类似的,getValues方法需要对数据进行反序列化操作,默认使用JavaSerializer。
  • Java NIO
    读写磁盘文件使用的是Java NIO,涉及到的API主要包括java.nio.ByteBufferjava.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对于磁盘文件的管理及读写。

原创粉丝点击