關於spark中的ResultStage和ShuffleMapStage


今天看了一下關於 job 中 stage 的關系時,發現了ResultStage 和 ShuffleMapStage 兩個類。這里先介紹一下job、stage、task的關系。

首先 job 的個數取決於 active 行動算子的個數。當流程執行一個 active 行動算子,spark就會生成一個 job 。

而一個 job 分為多個 stage 階段,stage 的個數取決於寬依賴的個數,對於寬依賴大家可以自行百度,我這里說一個簡單的概念。即分區內的數據如果改變(打亂重新組合)了就算是寬依賴。寬依賴一定伴隨着shuffle。

其次一個 stage 階段包含多個 task 任務,task 任務的個數取決於當前stage階段的最后一個rdd 的分區數。不同的rdd的分區數計算規則也不同。要根據具體的生產環境確定。

好啦,這三者的關系介紹完了,進入今天的主題。

我在追蹤源碼的過程中,發現job提交的時候new了一個Activejob對象

點進去以后發現了這個類的numPartions方法,它是運用模式匹配,匹配 ResultStage 和 ShuffleMapStage 兩個類。其目的是將 stage 階段最后的分區數保存起來,以便將來求出task的數量。

此時我們分別打開類ResultStage 和類 ShuffleMapStage

根據我三級英語水平一翻譯,得知,ShuffleMapstage主要記錄的是為shuffle階段產生數據的前的一個狀態。那它為什么要記錄這個呢?

因為一旦進行shuffle階段之后,必然會產生寬依賴。產生寬依賴就意味着這個stage階段的結束。也就是說ShuffleMapStage類就是這個stage階段結束的最后一個rdd時的狀態。

那為什么要保留這個狀態呢。

因為上面說過task的數量取決於stage階段最后一個rdd的分區數。所以當spark想要確定task的數量的時候他就會通過ShuffleMapStage來獲取。

其實這樣說不是很嚴謹。因為stage階段的結束不止只有寬依賴這一種情況。還有一種情況就是整個程序運行行動算子的時候。因為運行完行動算子,此次job就會結束,最后一個stage階段的task數量只能取決於運行此次行動算子之前的rdd的分區數。此時也就有了類ResultStage

ResultStage類中保存着行動算子結束前最后一次rdd的分區數。也由此確定task的數量。

希望各位大佬多提意見。小弟一定虛心接受。

此致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM