Hadoop (二) MapReduce過程詳細講解

MapReduce大致處理過程如圖,詳細過程見下文

實例:

 

圖片出自:https://blog.csdn.net/m0_37803704/article/details/80364237

過程詳解:

初始化:

1.MapReduce程序啓動的時候,Hadoop系統會把程序運行依賴庫(包括用戶自定義的Map處理和Reduce處理)拷貝到各個計算節點,資源管理器向節點管理器獲取一個運行application master的容器,節點管理器爲application master分配資源,然後application master向資源管理器請求資源,各個計算節點的node manager 分配資源,application master定期向resource manager 彙報任務進度。

Mapper:

然後系統從系統磁盤中讀取數據,mapper將每一行變成一個<k,v>。每一個鍵值對調用一次map函數。覆蓋map(),接收第一步產生的<k,v>,進行split處理,轉換爲新的中間鍵值對<k,v>輸出。

2.Shuffle:

2..1Mapper  Shuffle:

2.1.1.分區(默認分區爲1)分區數目=Reducer數目

在經過Mapper運行後,輸出是這樣一個Key/Value對:Key是“aaa”,Value是1。假設這個Job有3個ReduceTask,到底“aaa”應該交由哪個Reducer去處理,是需要現在決定的。MapReduce提供了Partitioner接口,其作用是根據Key或Value及Reduce的數量來決定當前這對輸出數據最終應該交由哪個ReduceTask處理。默認對Key進行哈希運算後,再以ReduceTask數量取模。在該例中,“aaa”經過Partition(分區)後返回0,也就是這對輸出數據應當由第一個Reducer來處理。接下來需要將數據寫入內存緩衝區中。緩衝區的作用就是批量收集Map結果,減少磁盤I/O影響。

內存緩衝區的大小是有限的,默認是100MB。當MapTask輸出結果有很多時,內存可能會不足,所以需要在一定條件下將緩衝區中的數據臨時寫入磁盤,然後重新利用這個緩衝區。這個從內存往磁盤寫數據的過程被稱爲Spill,中文譯爲溢寫。

2.1.2.排序

當緩衝區的數據達到閥值,溢寫線程啓動,鎖定這80MB的內存,執行溢寫過程。剩下的20MB繼續寫入map task的輸出結果。互不干涉!

           當溢寫線程啓動後,需要對這80MB內存空間內的key做排序(Sort)。排序是mapreduce模型的默認行爲,也是對序列化的字節做的排序。排序規則:字典排序!

 

2..1.3.(combiner)(可選項)

對每個spill 文件進行 小型的reduce處理,舉個栗子:要寫入緩衝區的溢出文件中的內容是:<“hello”,1>,<“world”,1>,<“hello”,1>,<“hello”,1>,combiner執行後就是<“hello”,3>,<“world”,1>,在這個過程可以看成是一次小型的reduce過程,主要是爲了降低IO開銷。仔細一想就會明白:如果不執行combiner,下一步傳輸的IO序列將是<“hello”,{1,1,1,1,1,1,,.....}>,執行之後就是<“hello”,{n}>

 

 

2..1.4.寫入spill(溢出)文件中

2..1.5.合併(分組).

對多個溢寫(spill)文件在磁盤上進行合併,也是爲了降低網絡IO開銷

2.2網絡IO:

mapper完成後經過網絡IO傳輸到相應的Reducer的內存緩衝區中,這個過程由application master 通知相應的reducer(注意:如果在mapper階段有的mapper出現故障,application master會開啓相關的備份數據節點替代它)

2.3.Reduce Shuffle:

Mapper處理結果經過網絡IO首先寫到reduce端的緩存中,同樣緩存佔用到達一定閾值後會將數據寫到磁盤中,同樣會進行partition、combine、排序等過程。如果形成了多個磁盤文件還會進行合併,最後一次合併的結果作爲reduce的輸入而不是寫入到磁盤中在Reducer端執行之前,對多個Mapper端傳來的文件進行合併,形成key-<value1,value2......>的格式,這裏緩衝區的大小要比map端的更爲靈活,它是基於JVM的heap size設置,因爲shuffler階段reducer不運行,所以應該把絕大部分的內存都給shuffle用。最終的輸入文件可能存放在磁盤,也可能存放在內存中,默認存放在磁盤上。當Reducer的輸入文件已定時,整個Shuffle過程才最終結束。

3.Reducer:

每一個reducer對所有mapper傳輸過來的數據進行一次大型的reduce操作 ,j結果存在HDFS中

merge的三種形式:

     內存到內存、內存到磁盤、磁盤到磁盤

默認情況下,第一種形式不啓用。當內存中的數據量達到一定的閥值,就啓動內存到磁盤的merge。與map端類似,這也是溢寫過程,當然如果這裏設置了Combiner,也是會啓動的,然後在磁盤中生成了衆多的溢寫文件。第二種merge方式一直在運行,直到沒有map端的數據時才結束,然後啓動第三種磁盤到磁盤的merge方式生成最終的那個文件。

 

我們對Shuffle過程的期望是:

★ 完整地從map task端拉取數據到reduce task端 

★ 跨界點拉取數據時,儘量減少對帶寬的不必要消耗

★ 減小磁盤IO對task執行的影響

 

參考博文:http://www.cnblogs.com/ahu-lichang/p/6665242.html

          https://www.cnblogs.com/felixzh/p/4680808.html

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章