Spark-Shuffle過程概要參考

weixin_33728268發表於2018-10-15

在MapReduce框架中,shuffle是連線Map和Reduce之間的橋樑,Map的輸出要用到Reduce中必須經過shuffle這個環節,shuffle的效能高低直接影響了整個程式的效能和吞吐量。Spark作為MapReduce框架的一種實現,自然也實現了shuffle的邏輯。

Spark-Shuflle發展階段

Spark-Shuflle1: HashShuflle階段,生成MM*RR箇中間小檔案,MM為Map數量,RR為Reduce數量;
Spark-Shuffle2: 優化的HashShuflle,cosolidate機制,生成CC * RR箇中間小檔案,CC為core數量;
Spark-Shuffle3: SortShuffle階段,生成MM*2箇中間小檔案#(資料檔案 + 索引檔案)。

什麼是Shuffle?

Shuffle是MapReduce框架中的一個特定的phase,介於Map phase和Reduce phase之間,當Map的輸出結果要被Reduce使用時,輸出結果需要按key雜湊,並且分發到每一個Reducer上去,這個過程就是shuffle。由於shuffle涉及到了磁碟的讀寫和網路的傳輸,因此shuffle效能的高低直接影響到了整個程式的執行效率。

下面這幅圖清晰地描述了MapReduce演算法的整個流程,其中shuffle phase是介於Map phase和Reduce phase之間。

2160494-da42a1e244210eec.jpg

概念上shuffle就是一個溝通資料連線的橋樑,那麼實際上shuffle(partition)這一部分是如何實現的的呢,下面我們就以Spark為例講一下shuffle在Spark中的實現。

Spark Shuffle進化史

先以圖為例簡單描述一下Spark中shuffle的整一個流程:

2160494-ef75daeecca042d8.png

首先每一個Mapper會根據Reducer的數量建立出相應的bucket,bucket的數量是MM×RR,其中MM是Map的個數,RR是Reduce的個數。

其次Mapper產生的結果會根據設定的partition演算法填充到每個bucket中去。這裡的partition演算法是可以自定義的,當然預設的演算法是根據key雜湊到不同的bucket中去。

當Reducer啟動時,它會根據自己task的id和所依賴的Mapper的id從遠端或是本地的block manager中取得相應的bucket作為Reducer的輸入進行處理。

#補充說明:這裡的bucket是一個抽象概念,在實現中每個bucket可以對應一個檔案,可以對應檔案的一部分或是其他等。

Apache Spark 的 Shuffle 過程與 Apache Hadoop中MR 的 Shuffle 過程有著諸多類似,一些概念可直接套用,例如,Shuffle 過程中,提供資料的一端,被稱作 Map 端,Map 端每個生成資料的任務稱為 Mapper,對應的接收資料的一端,被稱作 Reduce 端,Reduce 端每個拉取資料的任務稱為 Reducer,Shuffle 過程本質上都是將 Map 端獲得的資料使用分割槽器進行劃分,並將資料傳送給對應的 Reducer 的過程。

#

相關文章