Spark筆記-repartition和coalesce


窄依賴、寬依賴以及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數變多的

 
 


免責聲明!

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



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