mapreduce 是乙個分布式運算程式的程式設計框架,是使用者開發「基於 hadoop 的資料分析應用」的核心框架;
mapreduce 核心功能是將使用者編寫的業務邏輯**和自帶預設元件整合成乙個完整的分布式運算程式,併發執行在乙個 hadoop 集群上。
一、為什麼要 mapreduce
1)海量資料在單機上處理因為硬體資源限制,無法勝任
2)而一旦將單機版程式擴充套件到集群來分布式執行,將極大增加程式的複雜度和開發難度
3)引入 mapreduce 框架後,開發人員可以將絕大部分工作集中在業務邏輯的開發上,而將分布式計算中的複雜**由框架來處理。
4)mapreduce 分布式方案考慮的問題
(1)運算邏輯要不要先分後合?
(2)程式如何分配運算任務(切片)?
(3)兩階段的程式如何啟動?如何協調?
(4)整個程式執行過程中的監控?容錯?重試?
分布式方案需要考慮很多問題,但是我們可以將分布式程式中的公共功能封裝成框架,讓開發人員將精力集中於業務邏輯上。而 mapreduce 就是這樣乙個分布式程式的通用框架。
二、mapreduce 核心思想
1)分布式的運算程式往往需要分成至少 2 個階段
2)第乙個階段的 maptask 併發例項,完全並行執行,互不相干
3)第二個階段的 reduce task 併發例項互不相干,但是他們的資料依賴於上乙個階段的所有maptask 併發例項的輸出
4)mapreduce 程式設計模型只能包含乙個 map 階段和乙個 reduce 階段,如果使用者的業務邏輯非常複雜,那就只能多個 mapreduce 程式,序列執行
三、mapreduce 程序
乙個完整的 mapreduce 程式在分布式執行時有三類例項程序:
2)maptask:負責 map 階段的整個資料處理流程
3)reducetask:負責 reduce 階段的整個資料處理流程
四、mapreduce 程式設計規範(八股文)
(5)map()方法(maptask 程序)對每乙個呼叫一次
2)reducer 階段
(1)使用者自定義的 reducer 要繼承自己的父類
(3)reducer 的業務邏輯寫在 reduce()方法中
(4)reducetask 程序對每一組相同 k 的組呼叫一次 reduce()方法
3)driver 階段
整個程式需要乙個 drvier 來進行提交,提交的是乙個描述了各種必要資訊的 job 物件
五、mapreduce 程式執行流程分析
1)在 mapreduce 程式讀取檔案的輸入目錄上存放相應的檔案。
2)客戶端程式在 submit()方法執行前,獲取待處理的資料資訊,然後根據集群中引數的配置形成乙個任務分配規劃。
5)maptask 利用客戶指定的 inputformat 來讀取資料,形成輸入 kv 對。
6)maptask 將輸入 kv 對傳遞給客戶定義的 map()方法,做邏輯運算
7)map()運算完畢後將 kv 對收集到 maptask 快取。
8)maptask 快取中的 kv 對按照 k 分割槽排序後不斷寫到磁碟檔案
11)reducetask 運算完畢後,呼叫客戶指定的 outputformat 將結果資料輸出到外部儲存。
hadoop map reduce 階段筆記
shuffle and sort mr 框架保證 每個 reducer 的輸入都是按照 key 鍵排過序的。shuffle 將map輸出結果送到reducer和排序的功能。1 map 每個map task將結果輸出到環形記憶體緩衝區,當到達一定閾值,則啟動乙個後台程序將快取中的資料 1 按照 red...
Hadoop MapReduce 效能優化
我們時常談論說到mapreduce時,我們都會說它是離線計算框架,磁碟io開銷大,job執行比較慢等等。這一篇部落格,南國系統回顧下mr程式執行慢的原因,以及如何優化mr程式。我們都知道mapreduce是離線計算框架,不同於spark記憶體計算框架模型。乙個標準的mr程式由map方法和reduce...
九 hadoop mapreduce分割槽
一 什麼時候分割槽?1 分割槽的實現 通過繼承partitioner類,實現getpartition方法。public int getpartition key key,value value,int reducetasknumber map結束後得到的每個key value都呼叫該方法,並把key...