Spark調優之Shuffle調優 調節HashShuffleManager與SortShuffleManager

簡述Shuffle Manager

首先聲明一點,筆者之前寫的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的原理如圖,兩個特點

  1. SortShuffleManager對每一個redcue task要處理的數據,默認是排序的;
  2. SortShuffleManager不會像HashShuffleManager那樣,創建多份磁盤文件(詳見:《Spark調優之Shuffle調優 合併map端輸出文件》),SortShuffleManager是一個task只寫入一份磁盤文件,不同reduce task拉取的不同數據,用offset劃分界定
    SortShuffleManager原理圖

對比HashShuffleManager和SortShuffleManager

圖片備註:

  1. hash是指HashShuffleManager
  2. sort是指SortShuffleManager對比HashShuffleManager和SortShuffleManager

SortShuffleManager屬性:spark.shuffle.sort.bypassMergeThreshold

SortShuffleManager有一個屬性需要強調:spark.shuffle.sort.bypassMergeThreshold 默認200(可以更改)。

解釋這個參數:

  • 比如你的reduce task數量是500,超過默認值200,就會發生sort & merge(對每個reduce task處理的數據,進行排序;每個reduce task創建一份輸出文件,最後合併成一份文件)。
  • 比如你的reduce task數量是100,低於默認值200,就不會sort,按照hash的做法,每個reduce task創建一份輸出文件,最後合併成一個文件。

新Shuffle Manager:鎢絲sort shuffle manager

在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吧。