Spark開發-RDD分割槽重新劃分

Xlucas發表於2017-10-09

repartition(numPartitions: Int):RDD[T]
coalesce(numPartitions: Int, shuffle: Boolean = false):RDD[T]

repartition和coalesce是對RDD的分割槽進行重新劃分,repartition只是coalesce介面中shuffle為true的簡易實現,所以這裡主要討論coalesce合併函式該如何設定shuffle引數,這裡分三種情況,假設RDD為N個分割槽,需要重新劃分M個分割槽
1、如果N< M,一般情況下N個分割槽有資料分佈不均的狀況,利用HashPartitioner函式將資料重新分割槽為M個,這時需要將shuffle設定為true
2、如果N>M並且N和M相差不多,比如N是1000,M是100,那麼就可以將N個分割槽中的若干個分割槽合併成一個新的分割槽,最終合併成M個分割槽,這時可以將shuffle的引數設定為false(在shuffle為false的情況下,設定M>N,coalesce是不起作用的),不進行shuffle過程,父RDD和子RDD之間是窄依賴關係
3、如果N>M並且N和M差距懸殊大,比如N是1000,M是1,這個時候如果把shuffle設定成false,由於父子RDD是窄依賴,它們同處在一個stage中,就可能會造成spark程式執行的並行度不夠,從而影響效能,比如在M為1時,由於只有一個分割槽,所以只會有一個任務在執行,為了是coalesce之前的操作有更好的並行度,可以將shuffle引數設定為true。

相關文章