mr原理web
爲何要用mapreduce編程
mapreduce結構及核心運行機制app
結構框架
思想:分而治之,先分後合
其中,maptask的數量是不能設置的,reducetask能夠本身設置job.setNumReduceTasks(5);
利用客戶指定的inputformat來獲取RecordReader讀取數據,造成輸入KV對
將輸入KV對傳遞給客戶定義的map()方法,作邏輯運算,並將map()方法輸出的KV對收集到緩存
將緩存中的KV對按照K分區排序後不斷溢寫到磁盤文件
shuffle機制
mapreduce中,map階段處理的數據如何傳遞reduce階段,是mapreduce框架中最關鍵的一個流程,這個流程就叫shuffle;
shuffle: 洗牌、發牌——(核心機制:數據分區,排序,緩存);
具體來講:就是將maptask輸出的處理結果數據,分發給reducetask,並在分發的過程當中,對數據按key進行了分區和排序;
主要流程
分區partition
Sort根據key排序
Combiner進行局部value的合併
具體來講就是將maptask輸出的處理結果數據,分發給reducetask,並在分發的過程當中,對數據按key進行了分區和排序;
maptask收集咱們的map()方法輸出的kv對,先進入分區方法,把數據標記好分區,而後把數據發送到內存緩衝區(默認100M)中
當環形緩衝區達到80%時,進行溢寫,從內存緩衝區不斷溢出本地磁盤文件,可能會溢出多個文件 (溢寫前對數據進行快速排序,排序按照key的索引進行字典順序排序)
多個溢出文件會被合併成大的溢出文件(歸併排序算法),對溢寫的文件也能夠進行combiner操做,前提是彙總操做,求平均值不行。
在溢出過程當中,及合併的過程當中,都要調用partitoner進行分組和針對key進行排序
reducetask根據本身的分區號,去各個maptask機器上取相應的結果分區數據,拉取的數據先存儲在內存中,內存不夠了,再存儲到磁盤。
reducetask會取到同一個分區的來自不一樣maptask的結果文件,reducetask會將這些文件再進行合併(歸併排序)
合併成大文件後,shuffle的過程也就結束了,後面進入reducetask的邏輯運算過程(從文件中取出一個一個的鍵值對group,調用用戶自定義的reduce()方法)
![](http://static.javashuo.com/static/loading.gif)
如何寫好一篇數據部門規範文檔
如何優化整個數倉的執行時長(好比7點全部任務跑完,如何優化到5點)
本文分享自微信公衆號 - 大數據私房菜(datagogogo)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。