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分區數變多的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章