天天看點

【Spark實戰系列】spark 的 stage 是如何劃分的 看這一篇文章就夠了

最近有很多人問我,spark中的stage是怎麼劃分的?到底是根據什麼把一個job分為多個stage的,那我們今天就用最通俗易懂的語言給大家分析一下,幫助大家的了解.

我們都知道spark的job是根據action算子觸發的,遇到action算子就會起一個job,job裡面又劃分了很多個stage,然後每一個stage裡面運作了很多個task.請大家先記住一句話,stage的劃分依據就是看是否産生了shuflle(即寬依賴),遇到一個shuffle操作就劃分為前後兩個stage.

什麼是shuffle?

那有的同學就要問了,什麼是shuffle操作呢?寬依賴又是什麼呢?看一下官網的定義:shuffle 是spark 重新配置設定資料的一種機制,使得這些資料可以跨不同的區域進行分組。這通常涉及在 executors 和 機器之間拷貝資料,這使得 shuffle 成為一個複雜的、代價高的操作。

我先來舉個例子.shuffle就是混洗的意思,我們都打過撲克牌(4個人),一句打完之後要進行洗牌,然後重新開始,其實這4個人就可以看作是4個分區,每個人手裡的牌,就可以看作是分區裡面的資料,把大家的牌放到一塊混洗這個動作,就可以了解為是shuffle操作,shuffle就是把不同分區的資料拿出來,發到同一個分區裡面.

什麼是窄依賴和寬依賴?

簡單兩句話總結一下:

窄依賴是指父RDD的每個分區隻被子RDD的一個分區所使用.例如map、filter、union等操作會産生窄依賴

寬依賴是指父RDD的每個分區都可能被多個子RDD分區所使用. 例如 groupByKey、reduceByKey、sortByKey等操作會産生寬依賴,會産生shuffle

我們知道RDD之間是有依賴關系的或者說是血緣關系,産生shuffle的時候表明了,子父級RDD之間是寬依賴關系,那有的同學就說了,講了這麼多我還是不了解是什麼意思,别急,接下來我們看一張spark job的依賴關系圖

繼續閱讀