深度解析Spark底層執行原理(建議收藏)
3. 將DAG劃分為Stage剖析

DAG劃分Stage
一個Spark程序可以有多個DAG(有幾個Action,就有幾個DAG,上圖最后只有一個Action(圖中未表現),那么就是一個DAG)。
一個DAG可以有多個Stage(根據寬依賴/shuffle進行劃分)。
同一個Stage可以有多個Task并行執行(task數=分區數,如上圖,Stage1 中有三個分區P1、P2、P3,對應的也有三個 Task)。
可以看到這個DAG中只reduceByKey操作是一個寬依賴,Spark內核會以此為邊界將其前后劃分成不同的Stage。
同時我們可以注意到,在圖中Stage1中,從textFile到flatMap到map都是窄依賴,這幾步操作可以形成一個流水線操作,通過flatMap操作生成的partition可以不用等待整個RDD計算結束,而是繼續進行map操作,這樣大大提高了計算的效率。
4. 提交Stages
調度階段的提交,最終會被轉換成一個任務集的提交,DAGScheduler通過TaskScheduler接口提交任務集,這個任務集最終會觸發TaskScheduler構建一個TaskSetManager的實例來管理這個任務集的生命周期,對于DAGScheduler來說,提交調度階段的工作到此就完成了。
而TaskScheduler的具體實現則會在得到計算資源的時候,進一步通過TaskSetManager調度具體的任務到對應的Executor節點上進行運算。

5. 監控Job、Task、Executor
DAGScheduler監控Job與Task:
要保證相互依賴的作業調度階段能夠得到順利的調度執行,DAGScheduler需要監控當前作業調度階段乃至任務的完成情況。
這通過對外暴露一系列的回調函數來實現的,對于TaskScheduler來說,這些回調函數主要包括任務的開始結束失敗、任務集的失敗,DAGScheduler根據這些任務的生命周期信息進一步維護作業和調度階段的狀態信息。
DAGScheduler監控Executor的生命狀態:
TaskScheduler通過回調函數通知DAGScheduler具體的Executor的生命狀態,如果某一個Executor崩潰了,則對應的調度階段任務集的ShuffleMapTask的輸出結果也將標志為不可用,這將導致對應任務集狀態的變更,進而重新執行相關計算任務,以獲取丟失的相關數據。
6. 獲取任務執行結果
結果DAGScheduler:
一個具體的任務在Executor中執行完畢后,其結果需要以某種形式返回給DAGScheduler,根據任務類型的不同,任務結果的返回方式也不同。
兩種結果,中間結果與最終結果:
對于FinalStage所對應的任務,返回給DAGScheduler的是運算結果本身。
而對于中間調度階段對應的任務ShuffleMapTask,返回給DAGScheduler的是一個MapStatus里的相關存儲信息,而非結果本身,這些存儲位置信息將作為下一個調度階段的任務獲取輸入數據的依據。
兩種類型,DirectTaskResult與IndirectTaskResult:
根據任務結果大小的不同,ResultTask返回的結果又分為兩類:
如果結果足夠小,則直接放在DirectTaskResult對象內中。
如果超過特定尺寸則在Executor端會將DirectTaskResult先序列化,再把序列化的結果作為一個數據塊存放在BlockManager中,然后將BlockManager返回的BlockID放在IndirectTaskResult對象中返回給TaskScheduler,TaskScheduler進而調用TaskResultGetter將IndirectTaskResult中的BlockID取出并通過BlockManager最終取得對應的DirectTaskResult。
7. 任務調度總體詮釋
一張圖說明任務總體調度:

任務總體調度
Spark運行架構特點
1. Executor進程專屬
每個Application獲取專屬的Executor進程,該進程在Application期間一直駐留,并以多線程方式運行Tasks。
Spark Application不能跨應用程序共享數據,除非將數據寫入到外部存儲系統。如圖所示:

Executor進程專屬
2. 支持多種資源管理器
Spark與資源管理器無關,只要能夠獲取Executor進程,并能保持相互通信就可以了。
Spark支持資源管理器包含:Standalone、On Mesos、On YARN、Or On EC2。如圖所示:

支持多種資源管理器
3. Job提交就近原則
提交SparkContext的Client應該靠近Worker節點(運行Executor的節點),最好是在同一個Rack(機架)里,因為Spark Application運行過程中SparkContext和Executor之間有大量的信息交換;
如果想在遠程集群中運行,最好使用RPC將SparkContext提交給集群,不要遠離Worker運行SparkContext。
如圖所示:

Job提交就近原則
4. 移動程序而非移動數據的原則執行
移動程序而非移動數據的原則執行,Task采用了數據本地性和推測執行的優化機制。
關鍵方法:taskIdToLocations、getPreferedLocations。
如圖所示:

數據本地性
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













