簡介
本章節咱們先來了解一些關於MapReduce的理論知識。從本章節您能夠學習到:MapReduce的相關知識。java
一、概念
Mapreduce是一個分佈式運算程序的編程框架,是用戶開發「基於hadoop的數據分析應用」的核心框架;編程
Mapreduce核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分佈式運算程序,併發運行在一個hadoop集羣上。緩存
注意幾個關鍵詞便可:分佈式、業務邏輯以及自帶默認組件。併發
1.一、爲何選擇MapReduce
海量數據在單機上處理由於硬件資源限制,沒法勝任而一旦將單機版程序擴展到集羣來分佈式運行,將極大增長程序的複雜度和開發難度。引入mapreduce框架後,開發人員能夠將絕大部分工做集中在業務邏輯的開發上,而將分佈式計算中的複雜性交由框架來處理。app
1.2 mapreduce分佈式方案考慮的問題
mapreduce做爲一個分佈式解決方案,使用時至少須要考慮如下問題:框架
- 運算邏輯要不要先分後合?
- 程序如何分配運算任務(切片)?
- 兩階段的程序如何啓動?如何協調?
- 整個程序運行過程當中的監控?容錯?重試?
分佈式方案須要考慮不少問題,可是咱們能夠將分佈式程序中的公共功能封裝成框架,讓開發人員將精力集中於業務邏輯上。分佈式
而mapreduce就是這樣一個分佈式程序的通用框架。oop
1.三、MapReduce核心思想
mapreduce讓我想起了java8新概念——流。學習
咱們來看一下官方提供的統計單詞的案例的MapReduce示意圖,從中瞭解mapreduce的思想。code

分佈式的運算程序每每須要分紅至少2個階段
- 第一個階段的maptask併發實例,徹底並行運行,互不相干
- 第二個階段的reduce task併發實例互不相干,可是他們的數據依賴於上一個階段的全部maptask併發實例的輸出。
MapReduce編程模型只能包含一個map階段和一個reduce階段,若是用戶的業務邏輯很是複雜,那就只能多個mapreduce程序,串行運行。
一個完整的mapreduce程序在分佈式運行時有三類實例進程:
- MrAppMaster:負責整個程序的過程調度及狀態協調
- MapTask:負責map階段的整個數據處理流程
- ReduceTask:負責reduce階段的整個數據處理流程
同時留意咱們示意圖中提出的幾個問題,一旦咱們知道了答案,就差很少學會了MapReduce的使用了,接下來就是探索這些問題的答案的過程。
1.四、MapReduce編程規範
用戶編寫的MapReduce程序分紅三個部分:Mapper,Reducer,Driver(提交運行MapReduce程序的客戶端)。
- Mapper階段
- 用戶自定義的Mapper要繼承本身的父類
- Mapper的輸入數據是KV對的形式(KV的類型可自定義)
- Mapper中的業務邏輯寫在map()方法中
- Mapper的輸出數據是KV對的形式(KV的類型可自定義)
- map()方法(maptask進程)對每個<K,V>調用一次
- Reducer階段
- 用戶自定義的Reducer要繼承本身的父類
- Reducer的輸入數據類型對應Mapper的輸出數據類型,也是KV
- Reducer的業務邏輯寫在reduce()方法中
- Reducetask進程對每一組相同k的
<k,v>
組調用一次reduce()方法
- Driver階段 整個程序須要一個Drvier來進行提交,提交的是一個描述了各類必要信息的job對象。
在學習1.5節以前,推薦進入下一節編寫一個簡單案例:【hadoop】17.MapReduce-wordcount案例簡單實現
1.五、MapReduce運行流程分析
以wordCount案例爲基礎,大體運行流程以下:

- 在MapReduce程序讀取文件的輸入目錄上存放相應的文件。
- 客戶端程序在submit()方法執行前,獲取待處理的數據信息,而後根據集羣中參數的配置造成一個任務分配規劃。
- 客戶端提交job.split、jar包、job.xml等文件給yarn,yarn中的resourcemanager啓動MRAppMaster。
- MRAppMaster啓動後根據本次job的描述信息,計算出須要的maptask實例數量,而後向集羣申請機器啓動相應數量的maptask進程。
- maptask利用客戶指定的inputformat來讀取數據,造成輸入KV對。
- maptask將輸入KV對傳遞給客戶定義的map()方法,作邏輯運算
- map()運算完畢後將KV對收集到maptask緩存。
- maptask緩存中的KV對按照K分區排序後不斷寫到磁盤文件
- MRAppMaster監控到全部maptask進程任務完成以後,會根據客戶指定的參數啓動相應數量的reducetask進程,並告知reducetask進程要處理的數據分區。
- Reducetask進程啓動以後,根據MRAppMaster告知的待處理數據所在位置,從若干臺maptask運行所在機器上獲取到若干個maptask輸出結果文件,並在本地進行從新歸併排序,而後按照相同key的KV爲一個組,調用客戶定義的reduce()方法進行邏輯運算。
- Reducetask運算完畢後,調用客戶指定的outputformat將結果數據輸出到外部存儲。