1. 程式人生 > >Spark Task執行原理

Spark Task執行原理

Task執行原理流程:

1.當Driver中SchedulerBackend給ExecutorBackend傳送launchTask之後,首先會反序列化TaskDescription。

2.Executor會通過launchTask來執行Task

3.Executor會通過TaskRunner在ThreadPool來執行具體的Task,TaskRunner的run方法中首先會通過呼叫statueUpdate給Driver傳送資訊彙報自己的狀態,說明自己是running狀態

4.TaskRunner,內部會做一些準備工作,例如反序列化Task的依賴,然後通過網路來獲取需要的檔案、Jar等

5.然後是反序列化Task本身

6.呼叫反序列化後的Task.run方法來執行任務並獲得執行的結果,其中Task的run方法會導致呼叫的時候會導致task的抽象方法runTask的呼叫,在Task的runTask內部會呼叫RDD的iterator()方法,該方法就是我們針對當前Task所對應的Partition進行計算的關鍵所在,在處理內部會迭代Partition的元素並給我們自定義的function進行處理。

對於shuffleMapTask,首先要要對RDD以及其依賴關係進行反序列化。

最終計算會呼叫RDD的compute方法。

具體計算時,有具體的RDD,例如Map

7.把執行結果序列化,並根據大小不同的結果傳回給Driver的方式

8.CoresGraninExecutorBackend給DriverEndpoint傳送StatusUpdate來傳輸結果,DriverEndpoint會把執行結果傳遞給TaskSchedulerImpl處理,然後交給TaskResultGetter去分別處理Task執行成功或者失敗的不同情況,然後告訴DAGScheduler任務處理結束的狀況。

說明:

1.在執行具體Task的業務邏輯前會進行3次反序列化

  a>TaskDescription的翻譯裂化

  b>Task反序列化

  c>RDD反序列化

2.在Spark1.6中,AkkFrameSize是128MB,所以可以廣播非常大的任務,而任務的執行結果可以最大達到1GB。