文章概覽:
1、MapReduce簡介
2、MapReduce有哪些角色?各自的作用是什么?
3、MapReduce程序執行流程
4、MapReduce工作原理
5、MapReduce中Shuffle過程
6、MapReduce編程主要組件
7、針對MapReduce的缺點,YARN解決了什么?
MapReduce簡介
MapReduce是一種並行可擴展計算模型,並且有較好的容錯性,主要解決海量離線數據的批處理。實現下面目標
★ 易於編程
★ 良好的擴展性
★ 高容錯性
MapReduce有哪些角色?各自的作用是什么?
MapReduce由JobTracker和TaskTracker組成。JobTracker負責資源管理和作業控制,TaskTracker負責任務的運行。
MapReduce程序執行流程
程序執行流程圖如下:


(1) 開發人員編寫好MapReduce program,將程序打包運行。
(2) JobClient向JobTracker申請可用Job,JobTracker返回JobClient一個可用Job ID。
(3) JobClient得到Job ID后,將運行Job所需要的資源拷貝到共享文件系統HDFS中。
(4) 資源准備完備后,JobClient向JobTracker提交Job。
(5) JobTracker收到提交的Job后,初始化Job。
(6) 初始化完成后,JobTracker從HDFS中獲取輸入splits(作業可以該啟動多少Mapper任務)。
(7) 與此同時,TaskTracker不斷地向JobTracker匯報心跳信息,並且返回要執行的任務。
(8) TaskTracker得到JobTracker分配(盡量滿足數據本地化)的任務后,向HDFS獲取Job資源(若數據是本地的,不需拷貝數據)。
(9) 獲取資源后,TaskTracker會開啟JVM子進程運行任務。
注:
(3)中資源具體指什么?主要包含:
● 程序jar包、作業配置文件xml
● 輸入划分信息,決定作業該啟動多少個map任務
● 本地文件,包含依賴的第三方jar包(-libjars)、依賴的歸檔文件(-archives)和普通文件(-files),如果已經上傳,則不需上傳
MapReduce工作原理
工作原理圖如下:


map task
程序會根據InputFormat將輸入文件分割成splits,每個split會作為一個map task的輸入,每個map task會有一個內存緩沖區,
輸入數據經過map階段處理后的中間結果會寫入內存緩沖區,並且決定數據寫入到哪個partitioner,當寫入的數據到達內存緩沖
區的的閥值(默認是0.8),會啟動一個線程將內存中的數據溢寫入磁盤,同時不影響map中間結果繼續寫入緩沖區。在溢寫過程中,
MapReduce框架會對key進行排序,如果中間結果比較大,會形成多個溢寫文件,最后的緩沖區數據也會全部溢寫入磁盤形成一個溢寫
文件(最少有一個溢寫文件),如果是多個溢寫文件,則最后合並所有的溢寫文件為一個文件。
reduce task
當所有的map task完成后,每個map task會形成一個最終文件,並且該文件按區划分。reduce任務啟動之前,一個map task完成后,
就會啟動線程來拉取map結果數據到相應的reduce task,不斷地合並數據,為reduce的數據輸入做准備,當所有的map tesk完成后,
數據也拉取合並完畢后,reduce task 啟動,最終將輸出輸出結果存入HDFS上。
MapReduce中Shuffle過程
Shuffle的過程:描述數據從map task輸出到reduce task輸入的這段過程。
我們對Shuffle過程的期望是:
★ 完整地從map task端拉取數據到reduce task端
★ 跨界點拉取數據時,盡量減少對帶寬的不必要消耗
★ 減小磁盤IO對task執行的影響
先看map端:


split被送入map task后,程序庫決定數據結果數據屬於哪個partitioner,寫入到內存緩沖區,到達閥值,開啟溢寫過程,進行key排序,
如果有combiner步驟,則會對相同的key做歸並處理,最終多個溢寫文件合並為一個文件。
再看reduce端:


多個map task形成的最終文件的對應partitioner會被對應的reduce task拉取至內存緩沖區,對可能形成多個溢寫文件合並,最終
作為resuce task的數據輸入 。
MapReduce編程主要組件
InputFormat類:分割成多個splits和每行怎么解析。
Mapper類:對輸入的每對<key,value>生成中間結果。
Combiner類:在map端,對相同的key進行合並。
Partitioner類:在shuffle過程中,將按照key值將中間結果分為R份,每一份都由一個reduce去完成。
Reducer類:對所有的map中間結果,進行合並。
OutputFormat類:負責輸出結果格式。
編程框架如下:


針對MapReduce的缺點,YARN解決了什么?
MapReduce由以下缺點:
★ JobTracker掛掉,整個作業掛掉,存在單點故障
★ JobTracker既負責資源管理又負責作業控制,當作業增多時,JobTracker內存是擴展的瓶頸
★ map task全部完成后才能執行reduce task,造成資源空閑浪費
YARN設計考慮以上缺點,對MapReduce重新設計:
★ 將JobTracker職責分離,ResouceManager全局資源管理,ApplicationMaster管理作業的調度
★ 對ResouceManager做了HA設計
★ 設計了更細粒度的抽象資源容器Container
個人博客地址:
http://wangxiaolong.org/
參考: