Spark源碼分析:Spark存儲管理

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é)任。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容