Spark的Shuffle過程 原

Shuffle過程圖

 

 

 

 

 

 

Shuffle過程分爲shuffle write和shuffle read。

由父RDD(比如join就是join兩邊的RDD)根據分區數進行劃分,並寫內存或磁盤,構成write過程。由子RDD(join之後生成的RDD,分區數由spark.default.parallelism控制)從父RDD那裏拉取數據到自己的分區構成read過程。

write就是Map細分的過程,而read就是Reduce合併的過程。Spark裏也存在combine過程,就是在父RDD的write的時候,在本地做一次合併,相當於一次Reduce,可以減少read過程讀取的數據量,減少網絡IO。Shuffle過程中,需保證同一個key落在同一個partion裏就可以了。

Shuffle又分爲hash shuffle和sort based shuffle,後者是對前者的改進,在spark的後期版本里,後者是默認選擇。

Hash shuffle與Sort based shuffle的區別在於Write過程不同,其Read過程完全一樣。在shuffle中,如果父RDD的分區數爲m,子RDD的分區數爲n,那麼Hash Shuffle在write過程中每個分區會寫n個文件,每個文件對應了子RDD的一個分區,這樣一共爲 m*n 個文件。而Sort based shuffle則與Hadoop MR的shuffle很像,父RDD的每個分區只會生成一個文件(文件中一個分區的數據是連續的),同時會生成該文件的索引文件,索引文件可以明確指出子RDD分區所需要的數據在哪。

這樣Sort based shuffle的好處就在於它比Hash shuffle生成了更少的文件,shuffle過程中磁盤上不會累積大量數據文件,同時在文件生成過程中也不會佔用更多內存緩衝空間

update: 2017-03-25 增加了兩種shuffle的區別說明

歡迎閱讀轉載,轉載請註明出處:https://my.oschina.net/u/2539801/blog/758389

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