1. 程式人生 > >hadoop概念-MapReduce各個執行階段及Shuffle過程詳解

hadoop概念-MapReduce各個執行階段及Shuffle過程詳解

MapReduce各個執行階段

(1)MapReduce框架使用InputFormat模組做Map前的預處理,比如驗證輸入的格式是否符合輸入定義;然後,將輸入檔案切分為邏輯上的多個InputSplit,InputSplit是MapReduce對檔案進行處理和運算的輸入單位,只是一個邏輯概念,每個InputSplit並沒有對檔案進行實際切割,只是記錄了要處理的資料的位置和長度。

(2)因為InputSplit是邏輯切分而非物理切分,所以還需通過RecordReader根據InputSplit中的資訊來處理InputSplit中的具體記錄,載入資料並轉換為適合Map任務讀取的鍵值對,輸入給Map任務。

(3)Map任務會根據使用者自定義的對映規則,輸出一系列的<key,value>作為中間結果。

(4)為了讓Reduce可以並行處理Map的結果,需要對Map的輸出進行一定的分割槽(partition)、排序(sort)、合併(combine)、歸併(merge)等操作,得到<key,value>形式的中間結果,再交給對應的Reduce進行處理,這個過程稱為shuffle。從無序的<key,value>到有序的<key,value-list>,這個過程用Shuffle來稱呼是非常形象的。

(5)Reduce以一系列<key,value-list>中間結果為輸入,執行使用者定義的邏輯,輸出結果給OutputFormat模組。

(6)OutpFormat模組會驗證輸出目錄是否已經存在以及輸出結果型別是否符合配置檔案中的配置型別,如果都滿足,就輸出Reduce的結果到分散式檔案系統。

摘自《大資料技術原理與應用》

Shuffle過程詳解 Shuffle過程是MapReduce整個工作流程的核心環節,理解Shuffle過程的基本原理,對於理解MapReduce流程至關重要。

Shuffle過程簡介 所謂Shuffle,是指對Map輸出結果進行分割槽、排序、合併等處理並交給Reduce的過程。因此,Shuffle過程分為Map端的操作和Reduce端的操作。

(1)在Map端的Shuffle

Map的輸出結果首先被寫入快取,當快取滿時,就啟動溢寫操作,把快取中的資料寫入磁碟檔案並清空快取。當啟動溢寫操作時,首先需要把快取中的資料進行分割槽,然後對每個分割槽的資料進行排序和合並,之後再寫入磁碟檔案。每次溢寫操作會生成一個新的磁碟檔案,隨著Map任務的執行,磁碟中就會生成多個溢寫檔案。在Map任務全部結束之前,這些溢寫檔案會被歸併成一個大的磁碟檔案,然後通知相應的Reduce任務來領取屬於自己處理的資料。

(2)在Reduce端的Shuffle過程

Reduce任務從Map端的不同Map機器領回屬於自己處理的那部分資料,然後對資料進行歸併後交給Reduce處理。

Map端的Shuffle過程

1、資料分片  2、運算結果寫入快取  3、快取達到閾值,溢寫到磁碟檔案  溢寫前會進行分割槽,分割槽內排序和合並(可選)  4、歸併成大檔案  每次溢寫會生成一個溢寫檔案,這些溢寫檔案最終需要被歸併成一個大檔案。  歸併的意思:生成key和對應的value-list。  檔案歸併時,如果溢寫檔案數量超過引數min.num.spills.for.combine的值(預設為3)時,可以再次進行合併

每個Map任務分配一個快取 MapReduce預設100MB快取 設定溢寫比例0.8 分割槽預設採用雜湊函式 排序是預設的操作 排序後可以合併(Combine) 合併不能改變最終結果 在Map任務全部結束之前進行歸併 歸併得到一個大的檔案,放在本地磁碟 檔案歸併時,如果溢寫檔案數量大於預定值(預設是3)則可以再次啟動Combiner,少於3不需要 合併(Combine)和歸併(Merge)的區別:  兩個鍵值對<“a”,1>和<“a”,1>,如果合併,會得到<“a”,2>,如果歸併,會得到<“a”,<1,1>>

Reduce端的Shuffle過程

1、領取資料  2、歸併資料  3、資料輸入給Reduce任務