10.Spark的存储组件
在学习Spark应用开发的时候,也需要了解Spark相关的底层知识,这一次我们就了解Spark中的存储系统
首先说,Spark中的存储系统主要用于维护暂存在内存或者磁盘中的数据,包括Shuffle,中间文件,RDD Cache以及广播变量
对于这三种数据,分别有着不同的存储地址,首先是Shuffle中间文件,用于Shuffle中的计算过程中,产生了data和index文件,这一部分必然存储在磁盘之上
其次是RDD Cache,是分布式数据集在内存或者磁盘的物化,负责提高计算效率
广播变量则是在以Executors为粒度,进行存储一些变量,从而减少网络和内存开销
在Spark中,存储系统主要由BlockManagerMaster坐镇Driver 端
其次是在各个执行节点上的BlockManager
两者之间信息互换,BlockManagerMaster从BlockManager收集了各个节点上
那么BlockManager的数据来源于哪里,还是要从使用者来进行区分,首先是Shuffle中间文件,必然来源于节点磁盘,广播变量主要占用内存空间,RDD Cache则是既可以使用内存,也可以使用磁盘。
既然有来源于磁盘的,也有来源于内存的,我们就要分开看这两者的管理方式
不过首先说,不论是在磁盘,还是在内存中,数据都是以数据块Blocks为粒度进行存取的,而有了Blocks,就需要去维护这些Blocks的元数据
元数据中大致保存的结构如下
对于内存,则是利用了MemoryStore进行保存Blocks元数据
其中利用了LinkedHashMap进行保存,其中的Key是BlockId,Value是MemoryEntry
BlockId其实就是记录Block元数据的数据结构,保存了名字,所属的RDD,分区,是否是广播变量等信息
对应的MemoryEntry对象则是通往数据实体的地址
就比如RDD Cache,我们在创建缓存的时候,就会先以数据分区为粒度,计算RDD执行结果,然后封装为MemoryEntry,创建BlockId,然后添加到LinkedHashMap
其次是DiskStore 磁盘数据管理
DiskStore是由DiskBlockManager管理的
DiskBlockManager负责了实际的磁盘读取管理,通过BlockId访问磁盘文件
那么总结一下,Spark中的存储系统主要分为两个方面,分别是Driver端和Executors端,对应的组件是BlockManagerMaster和BlockManager
以及管理内存的MemoryStore和DiskStore