Spark源码分析:Spark存储管理
我们在编写soark程序,总是和rdd打交道,但是rdd仅仅是一个“形”,我们所操作的数据放在哪里呢?他和rdd又是怎么映射的呢。shuffle数据怎么管理和运行的呢。
1.整体架构
从架构角度,存储管理模块主要分为以下两层:
- 通信层:存储管理模块采用的是主从结构来实现通信层,主节点和从节点之间传输控制信息、状态信息。
- 存储层:存储管理模块需要把数据存储到硬盘或者内存中,必要时还需要复制到远端,这些操作由存储层来实现和提供相应接口。
从功能角度,
- RDD缓存
- shuffle数据持久化
2.通信层架构
首先,让我们来看一下通信层UML类图。
blockmanager包装了blockmanagermaster,通过blockmanagermaster可以进行通信。
同时,managermaster也包装了一系列其他对象。spark会在dirver和executor创建各自的blockmanager。通过blockmanager存储管理模块进行操作。
由于存储管理模块的通信层是主从架构,每个类都有自己的角色,主节点or从节点。
上图展示了拥有一个主节点和两个从节点的情况下各个类的角色关系。途中大框表示一个blockmanager,其中作为主节点的blockmanager包含各个从节点的blockmanager信息。
Blockmanager
/**
* Manager running on every node (driver and executors) which provides interfaces for putting and
* retrieving blocks both locally and remotely into various stores (memory, disk, and off-heap).
*
* Note that [[initialize()]] must be called before the BlockManager is usable.
*/
private[spark] class BlockManager(
executorId: String,
rpcEnv: RpcEnv,
val master: BlockManagerMaster,
val serializerManager: SerializerManager,
val conf: SparkConf,
memoryManager: MemoryManager,
mapOutputTracker: MapOutputTracker,
shuffleManager: ShuffleManager,
val blockTransferService: BlockTransferService,
securityManager: SecurityManager,
numUsableCores: Int)
extends BlockDataManager with BlockEvictionHandler with Logging
通信层消息传递
通信层主要负责控制消息和状态消息的传递以及处理。本小节将介绍通信层主要有哪些消息,进一步了解通信层的作用及责任。