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