Spark Executor 工作原理:
1. 在CoarseGrainedExecutorBackend啟動時向Driver注冊Executor,其實質是注冊ExecutorBackend實例,和Executor實例之間沒有直接關系
2. CoarseGrainedExecutorBackend 是 Executor 運行所在的進程名稱,Executor才是真正處理Task的對象。Executor內部是通過線程池的方式來完成Task的計算的
3. CoarseGrainedExecutorBackend 和 Executor是一一對應的
4. CoarseGrainedExecutorBackend 是一個消息通信體(其具體實現了ThreadSafeRPCEndpoint),可以發送信息給Driver並可以接受Driver中發過來的指令,例如啟動Task等
5. 在Driver進程有兩個至關重要的Endpoint:
a) ClientEndpoint : 主要負責向Master 注冊當前的程序, 是AppClient的內部成員;
b) DriverEndpoint: 這是整個程序運行時候的驅動器,是CoarseGrainedSchedulerBackend的內部成員;
6. 在Driver中通過ExecutorData封裝並注冊ExecutorBackend的信息到Driver的內存數據結構executorMapData中;
7. 實際在執行的時候,DriverEndPoint會把信息寫CoarseGrainedSchedulerBackend的內存數據結構executorMapData,所以說最終是注冊給了 CoarseGrainedSchedulerBackend,也就是說CoarseGrainedExecutorBackend 掌握了為當前程序分配的所有的ExecutorBackend進程,而在每一個ExecutorBackend進程實例中會通過 Executor對象來負責具體Task的運行。
8. CoarseGrainedExecutorBackend 收到 DriverEndpoint 發送過來的 RegisteredExecutor 消息后啟動 Executor 實例對象,而Executor實例對象是事實上負責真正Task計算的
Executor具體是如何工作的:
1. 當Driver發送過來Task的時候,其實是發送給了CoarseGrainedExecutorBackend這個RpcEndpoint, 而不是直接發送給了Executor
2. ExecutorBackend在收到Driver中發送過來的消息后會提供調用lauchTask來交給Executor去執行
下圖是各個Endpoint之間的消息通信圖,可以通過查看原圖看到完整的圖。