Spark Storage ② - BlockManager 的創(chuàng)建與注冊

本文為 Spark 2.0 源碼分析筆記,某些實現(xiàn)可能與其他版本有所出入

上一篇文章介紹了 Spark Storage 模塊的整體架構,本文將著手介紹在 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 端,構造 SparkContext 時會創(chuàng)建 SparkEnv 實例 _env,創(chuàng)建 _env 是通過調用 object SparkEnv 的 create 方法,在該方法中會創(chuàng)建 Master,即 driver 端的 blockManager。

所以,簡單來說,Master 是在 driver 創(chuàng)建 SparkContext 時就創(chuàng)建了。

Slave 創(chuàng)建時機

在 worker 進程起來的的時候,object CoarseGrainedExecutorBackend 初始化時會通過調用 SparkEnv#createExecutorEnv,在該函數(shù)中會創(chuàng)建 executor 端的 BlockManager,也即 Slave。這之后,CoarseGrainedExecutorBackend 才向 driver 注冊 executor,然后再構造 Executor 實例。

接下來,我們看看 BlockManager 是如何創(chuàng)建的。

創(chuàng)建 BlockManager

一圖勝千言,我們還是先來看看 Master 是如何創(chuàng)建的:

圖1: 創(chuàng)建 BlockManage

結合上圖我們來進行 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 的流程如下:

  1. 先創(chuàng)建 BlockManagerMasterEndpoint 實例
  2. 對于 master(on driver),將上一步得到的 blockManagerMasterEndpoint 注冊到 driverRpcEnv,以供之后driverRpcEnv 中的消息分發(fā)器分發(fā)消息給它來處理特定的消息,并返回 driverRpcEndpointRef;而對于 slave(on executor),通過 driverHost、driverPort 獲取 driverRpcEndpointRef
  3. 利用上一步構造的 driverRpcEndpointRef,結合 sparkConf 及是否是 driver 標記來構造 BlockManagerMaster 實例

Step3: 創(chuàng)建 BlockManager 實例

結合 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 可以是在內存中、磁盤上火對外內存中。

注冊 BlockManager

BlockManager 實例在被創(chuàng)建后,不能直接使用,必須調用其 initialize 方法才能使用。對于 Master,是在 BlockManager 創(chuàng)建后就調用了 initialize 方法;對于 Slave,是在 Executor 的構造函數(shù)中調用 initialize 方法進行初始化。

initialize 方法中,會進行 BlockManager 的注冊,具體操作時通過 driverRpcEndpointRef 發(fā)送 RegisterBlockManager 消息

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容