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。