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
通信層消息傳遞
通信層主要負責控制消息和狀態消息的傳遞以及處理。本小節將介紹通信層主要有哪些消息,進一步了解通信層的作用及責任。