本文為 Spark 2.0 源碼分析筆記剧蚣,某些實現(xiàn)可能與其他版本有所出入
上一篇文章介紹了 Spark Storage 模塊的整體架構(gòu)片橡,本文將著手介紹在 Storeage Master 和 Slave 上發(fā)揮重要作用的 BlockManager 是在什么時機以及如何創(chuàng)建以及注冊的。接下來分別介紹 Master 端和 Slave 端的 BlockManager荚虚。
為了方便閱讀,后文中將以 Master 作為 Storage Master(driver) 端的 BlockManager 的簡稱亲善,以 Slave 作為 Storage Slave(executor) 端的 BlockManager 的簡稱傲宜。
BlockManager 創(chuàng)建時機
Master 創(chuàng)建時機
在 driver 端芥吟,構(gòu)造 SparkContext 時會創(chuàng)建 SparkEnv 實例 _env侦铜,創(chuàng)建 _env 是通過調(diào)用 object SparkEnv 的 create 方法,在該方法中會創(chuàng)建 Master钟鸵,即 driver 端的 blockManager钉稍。
所以,簡單來說棺耍,Master 是在 driver 創(chuàng)建 SparkContext 時就創(chuàng)建了贡未。
Slave 創(chuàng)建時機
在 worker 進程起來的的時候,object CoarseGrainedExecutorBackend
初始化時會通過調(diào)用 SparkEnv#createExecutorEnv
,在該函數(shù)中會創(chuàng)建 executor 端的 BlockManager俊卤,也即 Slave嫩挤。這之后,CoarseGrainedExecutorBackend 才向 driver 注冊 executor消恍,然后再構(gòu)造 Executor 實例岂昭。
接下來,我們看看 BlockManager 是如何創(chuàng)建的狠怨。
創(chuàng)建 BlockManager
一圖勝千言约啊,我們還是先來看看 Master 是如何創(chuàng)建的:
結(jié)合上圖我們來進行 Step By Step 的分析
Step1: 創(chuàng)建 RpcEnv 實例 rpcEnv
這一步通過 systemName、hostname佣赖、port 等創(chuàng)建一個 RpcEnv 類型實例 rpcEnv恰矩,更具體的說是一個 NettRpcEnv 實例,在 Spark 2.0 中已經(jīng)沒有 akka rpc 的實現(xiàn)憎蛤,該 rpcEnv 實例用于:
- 接受稍后創(chuàng)建的 rpcEndpoint 的注冊并持有 rpcEndpoint(該 rpcEndpoint 用于接收對應的 rpcEndpointRef 發(fā)送的消息以及將消息指派給相應的函數(shù)處理)
- 持有一個消息分發(fā)器
dispatcher: Dispatcher
外傅,將接收到的消息分發(fā)給相應的 rpcEndpoint 處理
Step2: 創(chuàng)建 BlockManagerMaster 實例 blockManagerMaster
BlockManagerMaster 持有 driverRpcEndpointRef,其包含各種方法通過該 driverRpcEndpointRef 來給 Master 發(fā)送各種消息來實現(xiàn)注冊 BlockManager蹂午、移除 block栏豺、獲取/更新 block、移除 Broadcast 等功能豆胸。
如上圖所示奥洼,創(chuàng)建 BlockManagerMaster 的流程如下:
- 先創(chuàng)建 BlockManagerMasterEndpoint 實例
- 對于 master(on driver),將上一步得到的 blockManagerMasterEndpoint 注冊到 driverRpcEnv晚胡,以供之后driverRpcEnv 中的消息分發(fā)器分發(fā)消息給它來處理特定的消息灵奖,并返回 driverRpcEndpointRef;而對于 slave(on executor)估盘,通過 driverHost瓷患、driverPort 獲取 driverRpcEndpointRef
- 利用上一步構(gòu)造的 driverRpcEndpointRef,結(jié)合 sparkConf 及是否是 driver 標記來構(gòu)造 BlockManagerMaster 實例
Step3: 創(chuàng)建 BlockManager 實例
結(jié)合 Step1 中創(chuàng)建的 rpcEnv遣妥,Step2 中創(chuàng)建的 blockManagerMaster 以及 executorId擅编、memoryManager、mapOutputTracker箫踩、shuffleManager 等創(chuàng)建 BlockManager 實例爱态。該 BlockManager 也就是 Storage 模塊的 Master 或 Slave 了。
BlockManager 運行在所有的節(jié)點上境钟,包括 driver 和 executor锦担,用來存取在本地或遠程節(jié)點上的 blocks,blocks 可以是在內(nèi)存中慨削、磁盤上火對外內(nèi)存中洞渔。
注冊 BlockManager
BlockManager 實例在被創(chuàng)建后套媚,不能直接使用,必須調(diào)用其 initialize
方法才能使用磁椒。對于 Master堤瘤,是在 BlockManager 創(chuàng)建后就調(diào)用了 initialize
方法;對于 Slave衷快,是在 Executor 的構(gòu)造函數(shù)中調(diào)用 initialize
方法進行初始化宙橱。
在 initialize
方法中,會進行 BlockManager 的注冊蘸拔,具體操作時通過 driverRpcEndpointRef 發(fā)送 RegisterBlockManager
消息