简单来讲,spark存储体系市各个Driver和Excutor实例中的BlockManager所组成的。但是从一个整体出发,把各个结点的BlockManager看程存储体系的一部分,那么存储体系还包含更多衍生的内容,如块传输服务,map任务输出跟踪器,Shuffle管理器等。
在正式介绍储存体系之前,需要对存储体系从整体上有个宏观的认识,浙江有利于我们理解。图1能够从整体上表示存储体系架构。
从图1中我们可以看到,BlockManager包含以下几项组件。
- 1. BlockManegerMaster: 代理BlockManager与Driver上的BlockManagerMasterEndpoint通信。记号①表示Executor节点上的BlockManager通过BockManagerMaster与BlockManagerMasterEndpoint进行通信,记号②表示Driver节点上的BlockManager通过BlockManagerMaster与BlockManagerMasterEndpoint进行通信。这些通信的内容有很多,例如,注册BlockManager、更新Block信息、获取Block的位置(即Block所在的BlockManager)、删除Executor等。BlockManagerMaster之所以能够和BlockManagerMasterEndpoint通信,是因为它持有了BlockManagerMasterEndpoint的RpcEndpointRef。
- 2. BlockManagerMasterEndpoint:由Driver上的SparkEnv负责创建和注册到Driver的RpcEnv中。BlockManagerMasterEndpoint只存在于Driver的SparkEnv中,Driver或Executor上BlockManagerMaster的driverEndpoint属性将持有BlockManagerMasterEndpoint的RpcEndpointRef。BlockManagerMasterEndpoint主要对各个节点上的BlockManager、BlockManager与Executor的映射关系及Block位置信息(即Block所在的BlockManager)等进行管理。
- 3. BlockManagerSlaveEndpoint:每个Executor或Driver的SparkEnv中都有属于自己的BlockManagerSlaveEndpoint,分别由各自的SparkEnv负责创建和注册到各自的RpcEnv中。Driver或Executor都存在各自的BlockManagerSlaveEndpoint,并由各自BlockManager的slaveEndpoint属性持有各自BlockManagerSlaveEndpoint下发的命令。记号③表示BlockManagerMasterEndpoint向Driver节点上的BlockManagerSlaveEndpoint下发命令,记号④表示BlockManagerMasterEndpoint向Executor节点上的BlockManagerSlaveEndpoint下发命令。例如,删除Block、获取Block状态、获取匹配的BlockId等。
- 4. SerializerManager: 序列化管理器。
- 5. MemoryManager: 内存管理器, 负责单个结点上的储存、计算内存的分配与回收。
- 6. MapOutputTracker: map任务输出跟踪器。
- 7. ShuffleManeger: Shuffle管理器。
- 8. BlockTransferServer: 块传输服务。此组件也与Shuffle相关联,用于不同阶段的任务之间的Block数据的传输与读写。例如Shuffle过程中map对应结点给Shuffle的reduce任务提供下载中间输出结果的任务。
- 9. shuffleClinet:Shuffle的客户端。与BlockTransferService配合使用。记号⑤表示Executor上的shuffleClient通过Driver上的BlockTransferService提供的服务上传和下载Block,记号⑥表示Driver上的shuffleClient通过Executor上的BlockTransferService提供的服务上传和下载Block。此外,不同Executor节点上的BlockTransferService和shuffleClient之间也可以互相上传、下载Block。
- 10. SecurityManager:安全管理器
- 11. DiskBlockManager:磁盘块管理器。对磁盘上的文件及目录的读写操作进行管理
- 12. BlockInfoManager:块信息管理器。负责对Block的元数据及锁资源进行
- 13. MemoryStore:内存存储。依赖于MemoryManager,负责对Block的内存存
- 14. DiskStore:磁盘存储。依赖于DiskBlockManager,负责对Block的磁盘存储
2. Block的储存级别: StorageLevel
spark的储存体系包括磁盘存储与内存存储。Spark又将内存分为堆外内存和堆内存,有些支持序列化/反序列化,有的数据块还支持备份与复制。根据以上4点,spark将这些特性抽象为以下的几个存储级别:
object StorageLevel {
val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
val OFF_HEAP = new StorageLevel(true, true, true, false, 1)
}
3. 块信息
BlockInfo用于描述块的元数据信息,包括存储级别、Block类型、大小、锁信息等。