首先聲明一點,筆者之前寫的spark shuffle調優,基於的Shuffle Manager是HashShuffleManager。而Spark1.2.x以後,HashShuffleManager不再是Spark默認的Shuffle Manager。
Spark1.2.x以後,Spark默認的Shuffle Manager是SortShuffleManager。
但是強調一點,之前文章提到的shuffle優化的點,同樣適用於SortShuffleManager。比如:合併map端輸出文件、調節map端內存緩衝和reduce端內存佔比。
SortShuffleManager的原理如圖,兩個特點:
圖片備註:
SortShuffleManager有一個屬性需要強調:spark.shuffle.sort.bypassMergeThreshold 默認200(可以更改)。
解釋這個參數:
在Spark1.5.x之後,又出來一種新的Shuffle Manager,叫tungsten-sort(鎢絲)。即:鎢絲sort shuffle manager。官網描述,鎢絲sort shuffle manager效果跟SortShuffleManager差不多。唯一不同的是,鎢絲sort shuffle manager,使用了自己實現的一套內存管理機制,性能有所提升,而且可以避免shuffle過程中出現的OOM 等內存相關異常。
什麼時候用SortShuffleManager?
如果要處理的數據需要按key排序,就選擇SortShuffleManager。 只有reduce task的數量超過200 時,spark.shuffle.sort.bypassMergeThreshold(默認200),sort & merge纔會生效哦(這點上面已做解釋,仔細看下)。 請認真考量:有沒有必要早在shuffle過程中按key排序,畢竟排序對性能有影響,甚至影響很大。如果不排序,還是選擇HashShuffleManager吧。