MapReduce核心之shuffle
hadoop的核心思想是MapReduce,但shuffle又是MapReduce的核心。shuffle的主要工作是從Map結束到Reduce開始之間的過程。首先看下這張圖,就能瞭解shuffle所處的位置。圖中的partitions、copy phase、sort phase所代表的就是shuffle的不同階段。
shuffle階段又可以分為Map端的shuffle和Reduce端的shuffle。
一、Map端的shuffle
Map端會處理輸入資料併產生中間結果,這個中間結果會寫到本地磁碟,而不是HDFS。每個Map的輸出會先寫到記憶體緩衝區中,當寫入的資料達到設定的閾值時,系統將會啟動一個執行緒將緩衝區的資料寫到磁碟,這個過程叫做spill。
在spill寫入之前,會先進行二次排序,首先根據資料所屬的partition進行排序,然後每個partition中的資料再按key來排序。partition的目是將記錄劃分到不同的Reducer上去,以期望能夠達到負載均衡,以後的Reducer就會根據partition來讀取自己對應的資料。接著執行combiner(如果設定了的話),combiner的本質也是一個Reducer,其目的是對將要寫入到磁碟上的檔案先進行一次處理,這樣,寫入到磁碟的資料量就會減少。最後將資料寫到本地磁碟產生spill檔案(spill檔案儲存在{mapred.local.dir}指定的目錄中,Map任務結束後就會被刪除)。
最後,每個Map任務可能產生多個spill檔案,在每個Map任務完成前,會通過多路歸併演算法將這些spill檔案歸併成一個檔案。至此,Map的shuffle過程就結束了。
二、Reduce端的shuffle
Reduce端的shuffle主要包括三個階段,copy、sort(merge)和reduce。
首先要將Map端產生的輸出檔案拷貝到Reduce端,但每個Reducer如何知道自己應該處理哪些資料呢?因為Map端進行partition的時候,實際上就相當於指定了每個Reducer要處理的資料(partition就對應了Reducer),所以Reducer在拷貝資料的時候只需拷貝與自己對應的partition中的資料即可。每個Reducer會處理一個或者多個partition,但需要先將自己對應的partition中的資料從每個Map的輸出結果中拷貝過來。
接下來就是sort階段,也成為merge階段,因為這個階段的主要工作是執行了歸併排序。從Map端拷貝到Reduce端的資料都是有序的,所以很適合歸併排序。最終在Reduce端生成一個較大的檔案作為Reduce的輸入。
最後就是Reduce過程了,在這個過程中產生了最終的輸出結果,並將其寫到HDFS上。
現在來總結一下shuffle過程,我畫了張圖,希望能夠幫助理解。