1. 程式人生 > >spark開發中問題記錄

spark開發中問題記錄

1.map和mapPartitions函式的區別: mapPartitions函式和map函式類似,只不過對映函式的引數由RDD中的每一個元素變成了RDD中每一個分割槽的迭代器。如果在對映的過程中需要頻繁建立額外的物件,使用mapPartitions要比map高效的過。

比如,將RDD中的所有資料通過JDBC連線寫入資料庫,如果使用map函式,可能要為每一個元素都建立一個connection,這樣開銷很大,如果使用mapPartitions,那麼只需要針對每一個分割槽建立一個connection。

2.repartition和coalesce的區別: repartition(numPartitions:Int):RDD[T]和coalesce(numPartitions:Int,shuffle:Boolean=false):RDD[T]

他們兩個都是RDD的分割槽進行重新劃分,repartition只是coalesce介面中shuffle為true的簡易實現,(假設RDD有N個分割槽,需要重新劃分成M個分割槽)

1)、N<M:一般情況下N個分割槽有資料分佈不均勻的狀況,利用HashPartitioner函式將資料重新分割槽為M個,這時需要將shuffle設定為true,為寬依賴。

2)如果N>M並且N和M相差不多,(假如N是1000,M是100)那麼就可以將N個分割槽中的若干個分割槽合併成一個新的分割槽,最終合併為M個分割槽,這時可以將shuff設定為false,在shuffl為false的情況下,如果M>N時,coalesce為無效的,不進行shuffle過程,父RDD和子RDD之間是窄依賴關係。

3)如果N>M並且兩者相差懸殊,這時如果將shuffle設定為false,父子RDD是窄依賴關係,他們同處在一個Stage中,就可能造成spark程式的並行度不夠,從而影響效能,如果在M為1的時候,為了使coalesce之前的操作有更好的並行度,可以講shuffle設定為true。

總之:如果shuff為false時,如果傳入的引數大於現有的分割槽數目,RDD的分割槽數不變,也就是說不經過shuffle,是無法將RDDde分割槽數變多的。