spark repartition與coalesce區別

推薦大家去看原文博主的文章,條理清晰閱讀方便,轉載是爲了方便以後個人查閱

https://www.cnblogs.com/frankdeng/p/9301699.html

 

窄依賴、寬依賴以及stage的劃分依據:https://www.cnblogs.com/itboys/p/6673046.html

參考: http://blog.csdn.net/u012684933/article/details/51028707

參考: http://blog.csdn.net/dax1n/article/details/53431373

參考: http://blog.csdn.net/qq_14950717/article/details/52871666

repartition(numPartitions:Int)和coalesce(numPartitions:Int,shuffle:Boolean=false)
作用:對RDD的分區進行重新劃分,repartition內部調用了coalesce,參數shuffle爲true

例:RDD有N個分區,需要重新劃分成M個分區
1. N小於M 
  一般情況下N個分區有數據分佈不均勻的狀況,利用HashPartitioner函數將數據重新分區爲M個,這時需要將shuffle設置爲true。 
2. N大於M且和M相差不多 
  假如N是1000,M是100)那麼就可以將N個分區中的若干個分區合併成一個新的分區,最終合併爲M個分區,這時可以將shuff設置爲false,在shuffl爲false的情況下,如果M>N時,coalesce爲無效的,不進行shuffle過程,父RDD和子RDD之間是窄依賴關係。 
3. N大於M且和M相差懸殊 
  這時如果將shuffle設置爲false,父子RDD是窄依賴關係,他們在同一個Stage中,就可能造成Spark程序的並行度不夠,從而影響性能,如果在M爲1的時候,爲了使coalesce之前的操作有更好的並行度,可以講shuffle設置爲true。 

總結:返回一個減少到numPartitions個分區的新RDD,這會導致窄依賴,例如:你將1000個分區轉換成100個分區,這個過程不會發生shuffle,相反如果10個分區轉換成100個分區將會發生shuffle。然而如果你想大幅度合併分區,例如所有partition合併成一個分區,這會導致計算在少數幾個集羣節點上進行(言外之意:並行度不夠)。爲了避免這種情況,你可以將第二個shuffle參數傳遞一個true,這樣會在重新分區過程中多一步shuffle,這意味着上游的分區可以並行運行。

總之:如果shuff爲false時,如果傳入的參數大於現有的分區數目,RDD的分區數不變,也就是說不經過shuffle,是無法將RDD的partition數變多的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章