Spark源碼分析:Spark存儲管理
我們在編寫soark程序,總是和rdd打交道,但是rdd僅僅是一個“形”,我們所操作的數(shù)據(jù)放在哪里呢?他和rdd又是怎么映射的呢。shuffle數(shù)據(jù)怎么管理和運行的呢。
1.整體架構(gòu)
從架構(gòu)角度,存儲管理模塊主要分為以下兩層:
- 通信層:存儲管理模塊采用的是主從結(jié)構(gòu)來實現(xiàn)通信層,主節(jié)點和從節(jié)點之間傳輸控制信息、狀態(tài)信息。
- 存儲層:存儲管理模塊需要把數(shù)據(jù)存儲到硬盤或者內(nèi)存中,必要時還需要復(fù)制到遠(yuǎn)端,這些操作由存儲層來實現(xiàn)和提供相應(yīng)接口。
從功能角度,
- RDD緩存
- shuffle數(shù)據(jù)持久化
2.通信層架構(gòu)
首先,讓我們來看一下通信層UML類圖。

blockmanager包裝了blockmanagermaster,通過blockmanagermaster可以進(jìn)行通信。
同時,managermaster也包裝了一系列其他對象。spark會在dirver和executor創(chuàng)建各自的blockmanager。通過blockmanager存儲管理模塊進(jìn)行操作。
由于存儲管理模塊的通信層是主從架構(gòu),每個類都有自己的角色,主節(jié)點or從節(jié)點。

上圖展示了擁有一個主節(jié)點和兩個從節(jié)點的情況下各個類的角色關(guān)系。途中大框表示一個blockmanager,其中作為主節(jié)點的blockmanager包含各個從節(jié)點的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
通信層消息傳遞
通信層主要負(fù)責(zé)控制消息和狀態(tài)消息的傳遞以及處理。本小節(jié)將介紹通信層主要有哪些消息,進(jìn)一步了解通信層的作用及責(zé)任。