coalesce()方法和repartition()方法的區(qū)別
Spark的RDD是分區(qū)的暂吉,經(jīng)過lineage一系列運算之后澎迎,比如原始日志1T默色,filter算子過濾出1G的內(nèi)容甫煞,保留原始的分區(qū)計算来颤,不免有些浪費,可能需要手動調(diào)整partition的數(shù)量罩润,這個時候可使用coalesce方法減少分區(qū)數(shù)目玖翅。該函數(shù)用于將RDD進行重分區(qū),使用HashPartitioner
def coalesce(numPartitions: Int, shuffle: Boolean = false,
partitionCoalescer: Option[PartitionCoalescer] = Option.empty)
(implicit ord: Ordering[T] = null)
參數(shù)numPartitions割以,可以指定分區(qū)個數(shù)金度,在shuffle=false的情況下,numPartitions設(shè)置可能不起作用严沥,假設(shè)之前有兩個partition分布在兩臺機器上猜极,在不經(jīng)過shuffle的前提下是不會合并到一起的,合并的前提是同一臺機器消玄,除非指定shuffle=true跟伏。
def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
coalesce(numPartitions, shuffle = true)
}
可以看出,repartition()方法就是coalesce()方法shuffle為true的情況翩瓜。
窄依賴受扳、寬依賴以及stage的劃分依據(jù):
參考: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的分區(qū)進行重新劃分兔跌,repartition內(nèi)部調(diào)用了coalesce勘高,參數(shù)shuffle為true
例:RDD有N個分區(qū),需要重新劃分成M個分區(qū)
- N小于M
一般情況下N個分區(qū)有數(shù)據(jù)分布不均勻的狀況坟桅,利用HashPartitioner函數(shù)將數(shù)據(jù)重新分區(qū)為M個华望,這時需要將shuffle設(shè)置為true。 - N大于M且和M相差不多
假如N是1000仅乓,M是100)那么就可以將N個分區(qū)中的若干個分區(qū)合并成一個新的分區(qū)赖舟,最終合并為M個分區(qū),這時可以將shuff設(shè)置為false夸楣,在shuffl為false的情況下宾抓,如果M>N時,coalesce為無效的豫喧,不進行shuffle過程洞慎,父RDD和子RDD之間是窄依賴關(guān)系。 - N大于M且和M相差懸殊
這時如果將shuffle設(shè)置為false嘿棘,父子RDD是窄依賴關(guān)系劲腿,他們在同一個Stage中,就可能造成Spark程序的并行度不夠鸟妙,從而影響性能焦人,如果在M為1的時候挥吵,為了使coalesce之前的操作有更好的并行度,可以講shuffle設(shè)置為true花椭。
總結(jié):返回一個減少到numPartitions個分區(qū)的新RDD忽匈,這會導致窄依賴,例如:你將1000個分區(qū)轉(zhuǎn)換成100個分區(qū)矿辽,這個過程不會發(fā)生shuffle丹允,相反如果10個分區(qū)轉(zhuǎn)換成100個分區(qū)將會發(fā)生shuffle。然而如果你想大幅度合并分區(qū)袋倔,例如所有partition合并成一個分區(qū)雕蔽,這會導致計算在少數(shù)幾個集群節(jié)點上進行(言外之意:并行度不夠)。為了避免這種情況宾娜,你可以將第二個shuffle參數(shù)傳遞一個true批狐,這樣會在重新分區(qū)過程中多一步shuffle,這意味著上游的分區(qū)可以并行運行前塔。
總之:如果shuff為false時嚣艇,如果傳入的參數(shù)大于現(xiàn)有的分區(qū)數(shù)目,RDD的分區(qū)數(shù)不變华弓,也就是說不經(jīng)過shuffle食零,是無法將RDD的partition數(shù)變多的