1. 程式人生 > >Spark Executor內幕徹底解密:Executor工作原理圖、ExecutorBackend註冊源碼解密、Executor實例化內幕、Executor具體工作內幕

Spark Executor內幕徹底解密:Executor工作原理圖、ExecutorBackend註冊源碼解密、Executor實例化內幕、Executor具體工作內幕

ID 註冊 AD https ima .cn ora 成員 其他

本課主題

  • Spark Executor 工作原理圖
  • ExecutorBackend 註冊源碼鑒賞和 Executor 實例化內幕
  • Executor 具體是如何工作的

Spark Executor 工作原理圖

技術分享圖片

  • 第一步:Master 發指令給 Worker 啟動 Executor;
  • 第二步:Worker 接收到 Master 發送過來的指令通過 ExecutorRunner 遠程啟動另外一個線程來運行 Executor;
  • 第三步:通過發送 RegisterExecutor 向 Driver 註冊 Executor,這個時侯Worker 會啟動另外一個進程來向 Driver 發送註冊的信息,思考題:為什麽要多開一個新進程而不在原有的 Worker 進程裏發送信息給 Driver 呢?因為Worker 主要是管理當前機器上的資源的,而當前機器上的資源有變動的時候需要匯報給 Master,Worker 不是用來計算的,所以不可以在 Worker 裏做計算;而且,在 Spark 中可能有很多不同的的應用程序,有很多應用程序你就需要有很多 Executor,如果你不是為每個 Executor 啟動一個進程的話,這會導致當一個程序崩潰時,其他程序也會崩潰。

    需要特別註意的是在 CoarseGrainedExecutorBackend 啟動時向 Driver 註冊 Executor 其實質上是註冊 ExecutorBackend 實例,和 Executor 實例之間沒有直接關系! CoarseGrainedExecutorBackend 是 Executor 運行所在的進程名稱,Executor 才是真正處理 Task 的對象Executor 內部是通過線程池的方式來完成 Task 的計算的,CoarseGrainedExecutorBackend 和 Executor 是一對一的關系
    技術分享圖片

    技術分享圖片
    CoarseGrainedExecutorBackend 是一個消息通信體(其實現了 (ThreadSafeRpcEndPoint) ,可以發送信息給 Driver 並可以接受 Driver 中發過來的指令,例如啟動 Task 等。
    技術分享圖片
  • 第四步:在 DriverEndpoint 中會接受到 RegisterExecutor 信息並完成在 Driver 上的註冊,其實際是註冊給 CoarseGrainedSchedulerBackend
    技術分享圖片
    技術分享圖片
    技術分享圖片
    在 Driver 進程中有兩個至關重要的 Endpoint: (註冊的內幕源碼可以參考Spark天堂之門解密)
    1) ClientEndpoint: 主要負責向 Master 註冊當前的程序,是 AppClient 的內部成員;
    技術分享圖片
    2) DriverEndpoint: 這是整個程序運行時候的驅動器,是CoraseGraninedSchedulerBackend 的內部成員。
  • 在 Driver 中通過 ExecutorData 封裝並註冊 ExecutorBackend 的信息到 Driver 的內存數據結構 executorMapData 中:技術分享圖片
  • 實際在執行的時候DriverEndpoint 會把信息寫下CoarseGraninedSchedulerBackend 的內存數據結構executorMapData 中,所以說最終是註冊給了CoarseGraninedSchedulerBackend,也就是說CoarseGraninedSchedulerBackend 掌握了為當前程序分配的所有的ExecutorBackend 進程,而每一個ExecutorBackend 進程實例中會通過Executor對象來負責具體Task 的運行。
  • 在運行的時候使用 synchronised 關鍵字來保證 executorMapData 安全的並發寫操作。

ExecutorBackend 註冊源碼鑒賞和 Executor 實例化內幕

  1. CoarseGrainedExecutorBackend 收到 DriverEndpoint (CoraseGrainedSchedulerBackend) 發送過來的 RegisteredExecutor 消息後會啟動 Executor 實例對象,而 Executor 實例對象是事實上負責真正的 Task 的計算的;
    技術分享圖片
    技術分享圖片
    技術分享圖片
  2. Executor在實例化的時候會實例化一個線程池來準備 Task 的計算的。
    技術分享圖片
    技術分享圖片

Executor 具體是如何工作的

  1. 當 Driver 發送過來 Task 的時候,其實是發送給了 CoarseGrainedExecutorBackend 這個 RpcEndpoint ,而不是直接發送給了 Executor (Executor 由於不是消息循環體,所以永遠也無法直接接受遠程發過來的信息);
  2. ExecutorBackend 在收到 Driver 中發送過來的消息後會通過調用 LaunchTask 來交給 Executor 去執行:
    技術分享圖片
    技術分享圖片
  3. 創建的 threadPool 中以多線程並發執行和線程復用的方式來高效的執行 Spark 發過來的 Task,接收到 Task 執行的命令後,會首先把 Task 封裝在 TaskRunner 裏面,TaskRunner 其實是 Java 中的 Runnerable 接口的具體的實現,在真正工作的時候會交給線程池中的線池去運行,此時會調用 run 方法來執行 task,TaskRunner 在調用 run 方法的時候會調用 Task run方法,而 Task 的 run 方法會調用 runTask, 而實際 Task 有 ShuffleMapTask 和 ResultTask;
    技術分享圖片

[總結部份]

更新中......

Spark Executor內幕徹底解密:Executor工作原理圖、ExecutorBackend註冊源碼解密、Executor實例化內幕、Executor具體工作內幕