1. 程式人生 > >MapReduce 之 Shuffle 的詳細流程

MapReduce 之 Shuffle 的詳細流程

主要流程簡介:

先對資料進行切片,然後將資料傳遞給map,map的輸出是記憶體緩衝區(圓形緩衝區),記憶體緩衝

區預設大小是100M,當達到80%的時候將資料溢寫到本地,剩餘20%用於繼續獲取資料,在溢寫

到磁碟的時候會執行parti tion(分割槽) 和 sort (排序), 然後對檔案進行合併操作,合併完成之後 reduceTask 會去啟動執行緒去mapTask拉取資料,然後進行檔案合併,並進行排序(歸併),然後將

小檔案合併成一個大檔案並呼叫reduce方法完成最終輸出效果。

PS:合併操作有三種方式:

1. 記憶體到 記憶體

2.記憶體到 本地

3.本地到 本地

 

詳細流程:

1. input Split 分配 給Map

2. Map過程進行處理,Mapper任務會接收輸入的分片,然後不斷呼叫map方法,對記錄進行處理,處理完畢之後。轉換為新的<key,value>輸出(其中每一個分片對應一個map,一個map可以呼叫多次來處理分片)

3.、Map的輸出結果會快取到記憶體裡,當記憶體中的buffer in memory當達到閾(yu)值 預設的80%, 就會把記錄溢寫到磁碟檔案中,然後用剩餘的20%來繼續接受資料。

Ps:優化map時可以調大buffer的閾值,快取更多的資料

4.記憶體中進行Partition (分割槽),預設是HashParti tion

Ps: 此hash 採用 hash( key.hashcode () ) & integer.MAX_value) % munReduceTasks 有多少個就會有多少個 ReduceTask

5.記憶體中 partition 結束之後,對於不同分割槽資料,會按照key進行排序,這裡key必須實現writableComparable介面,該類實現了Comparable,才可以進行比較排序。

6. 對於排序之後的<key,value>會按照key進行分組,如果key相同,name相同key的<key,value>就會

被分到一個組中,最終,每個分組會呼叫一次reduce 方法。

7.排序分組結束之後,相同的key就在一起組成了一個類表,如果設定過Combiner,就合併資料,減少寫入磁碟

Ps::combiner本質就是一個reducer

8.當磁碟中的spill檔案數目比規定的檔案資料多的時候,會多次呼叫combiner,在不影響結果的前提下,combiner可以被呼叫多次。

9.Map結束的時候會把spill出來的多個檔案合併成一個,merge過程最多10個檔案同時合併成一個檔案,多餘的檔案就多次就會呼叫merge

10.Map端的shuffle完畢,資料都有序的存放到磁碟中,等待reducer來獲取

ReduceTask

1.reducer 的後臺會被APPMaster指定的機器上將map和output拷貝到本地,先拷貝到記憶體,記憶體滿了就拷貝到磁碟

2.Reducer採用merge Sort將來自各個map的資料進行merge,merge成一個有序的更大檔案

3.reduce 端job 開始,輸入的是shuffle Sort 過程所產生的檔案

4.reducer的輸入檔案,不斷的merge後,他們會出現最終檔案。這個最終檔案可能儲存在磁碟也可能儲存到記憶體。reduce方法就是制動執行當前這個檔案的處理最終該處理結果放到HDFS上。