Spark Executor內幕徹底解密:Executor工作原理圖、ExecutorBackend註冊源碼解密、Executor實例化內幕、Executor具體工作內幕
阿新 • • 發佈:2018-05-24
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 實例化內幕
- CoarseGrainedExecutorBackend 收到 DriverEndpoint (CoraseGrainedSchedulerBackend) 發送過來的 RegisteredExecutor 消息後會啟動 Executor 實例對象,而 Executor 實例對象是事實上負責真正的 Task 的計算的;
- Executor在實例化的時候會實例化一個線程池來準備 Task 的計算的。
Executor 具體是如何工作的
- 當 Driver 發送過來 Task 的時候,其實是發送給了 CoarseGrainedExecutorBackend 這個 RpcEndpoint ,而不是直接發送給了 Executor (Executor 由於不是消息循環體,所以永遠也無法直接接受遠程發過來的信息);
- ExecutorBackend 在收到 Driver 中發送過來的消息後會通過調用 LaunchTask 來交給 Executor 去執行:
- 創建的 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具體工作內幕