MapReduce 是一個分佈式運算程序的編程框架,是用戶開發「基於 hadoop 的數據分析應用」的核心框架;編程
MapReduce 核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分佈式運算程序,併發運行在一個 hadoop 集羣上。緩存
(1) 海量數據在單機上處理由於硬件資源限制,沒法勝任;
(2) 而一旦將單機版程序擴展到集羣來分佈式運行,將極大增長程序的複雜度和開發難度;
(3) 引入 MapReduce 框架後,開發人員能夠將絕大部分工做集中在業務邏輯的開發上,而將分佈式計算中的複雜性交由框架來處理。
(4) mapreduce分佈式方案考慮的問題
A、運算邏輯要不要先分後合?
B、程序如何分配運算任務(切片)?
C、兩階段的程序如何啓動?如何協調?
D、整個程序運行過程當中的監控?容錯?重試?
分佈式方案須要考慮不少問題,可是咱們能夠將分佈式程序中的公共功能封裝成框架,讓開發人員將精力集中於業務邏輯上。而 MapReduce 就是這樣一個分佈式程序的通用框架。併發
上圖簡單的闡明瞭 map 和 reduce 的兩個過程或者做用,雖然不夠嚴謹,可是足以提供一個大概的認知,map 過程是一個蔬菜到製成食物前的準備工做,reduce 將準備好的材料合併進而製做出食物的過程。app
(1) 分佈式的運算程序每每須要分紅至少2個階段;
(2) 第一個階段的 maptask 併發實例,徹底並行運行,互不相干;
(3) 第二個階段的 reduce task 併發實例互不相干,可是他們的數據依賴於上一個階段的全部 maptask 併發實例的輸出;
(4) MapReduce 編程模型只能包含一個map階段和一個 reduce 階段,若是用戶的業務邏輯很是複雜,那就只能多個 MapReduce 程序,串行運行。框架
一個完整的 MapReduce 程序在分佈式運行時有三類實例進程:
(1) MrAppMaster:負責整個程序的過程調度及狀態協調;
(2) MapTask:負責map階段的整個數據處理流程;
(3) ReduceTask:負責reduce階段的整個數據處理流程。分佈式
用戶編寫的程序分紅三個部分:Mapper,Reducer,Driver (提交運行 MR 程序的客戶端)
1. Mapper 階段
(1)用戶自定義的 Mapper 要繼承本身的父類;
(2)Mapper 的輸入數據是KV對的形式 ( KV 的類型可自定義)
(3)Mapper 中的業務邏輯寫在 map() 方法中
(4)Mapper 的輸出數據是KV對的形式 ( KV 的類型可自定義)
(5)map() 方法 ( maptask 進程)對每個 <K,V> 調用一次
2. Reducer 階段
(1)用戶自定義的 Reducer 要繼承本身的父類;
(2)Reducer 的輸入數據類型對應 Mapper 的輸出數據類型,也是 KV;
(3)Reducer 的業務邏輯寫在 reduce() 方法中;
(4)Reducetask 進程對每一組相同k的<k,v>組調用一次 reduce() 方法。
3. Driver 階段
整個程序須要一個 Drvier 來進行提交,提交的是一個描述了各類必要信息的 job 對象oop
(1) 在 MapReduce 程序讀取文件的輸入目錄上存放相應的文件;
(2) 客戶端程序在 submit() 方法執行前,獲取待處理的數據信息,而後根據集羣中參數的配置造成一個任務分配規劃;
(3) 客戶端提交 job.split、jar 包、job.xml 等文件給 yarn,yarn 中的 resourcemanager 啓動 MRAppMaster;
(4) MRAppMaster 啓動後根據本次 job 的描述信息,計算出須要的 maptask 實例數量,而後向集羣申請機器啓動相應數量的 maptask 進程;
(5) maptask 利用客戶指定的 inputformat 來讀取數據,造成輸入 KV 對;
(6) maptask 將輸入 KV 對傳遞給客戶定義的 map() 方法,作邏輯運算;
(7) map() 運算完畢後將 KV 對收集到 maptask 緩存;
(8) maptask 緩存中的 KV 對按照 K 分區排序後不斷寫到磁盤文件;
(9) MRAppMaster 監控到全部 maptask 進程任務完成以後,會根據客戶指定的參數啓動相應數量的 reducetask 進程,並告知 reducetask 進程要處理的數據分區;
(10) Reducetask 進程啓動以後,根據 MRAppMaster 告知的待處理數據所在位置,從若干臺 maptask 運行所在機器上獲取到若干個 maptask 輸出結果文件,並在本地進行從新歸併排序,而後按照相同 key 的 KV 爲一個組,調用客戶定義的 reduce() 方法進行邏輯運算;
(11) Reducetask 運算完畢後,調用客戶指定的 outputformat 將結果數據輸出到外部存儲。
spa