4.MR过程分析
- 1. 三大過程
- Map側(cè)Shuffle
- Reduce側(cè)Shuffle - 2. 六大組件
- InputFormat
- OutputFormat
- Serilizer
- Comparator
- Combiner
- Partitioner - 3. Mapreduce調(diào)優(yōu)
1. 三大過程
上一節(jié)演示了最簡單的MR任務(wù)的編寫,可以看到其實(shí)很簡單,說簡單點(diǎn)就是套模板。但是要想用好hadoop這一利器,需要了解更多執(zhí)行細(xì)節(jié),在基本概念中已經(jīng)說過mapreduce包括三大過程,最常見的一幅總結(jié)圖如下:
這里包括
- Map 讀入文件塊,分割成指定鍵值對
- Shuffle map輸出的鍵值對分組排序后輸出到磁盤,提供給reduce作為輸入
- Reduce 讀入shuffle后的鍵值對處理
廣義來講只有Map和Reduce,但是和用戶需要編程處理的map/reduce過程相比,map輸出到reduce輸入中間有大量處理過程,都屬于shuffle,也有人區(qū)分map側(cè)shuffle和reduce側(cè)shuffle,參考下圖,詳細(xì)描述這兩個shuffle過程。
Map側(cè)Shuffle
- map輸出不會直接輸出到磁盤,會先寫到一個環(huán)形緩沖區(qū),緩沖區(qū)大小參數(shù)io.sort.mb設(shè)置,當(dāng)超過一定閾值時(io.sort.spill.percent),一個后臺線程會把緩沖區(qū)內(nèi)容溢寫到指定目錄(mapred.local.dir)下的一個新建文件
- 寫磁盤時會先按照指定的分組器分組Partitioner,默認(rèn)是HashPartitioner。示例按照鍵值的奇偶分成兩組,分組數(shù)和reduce數(shù)量相同。
- 然后按照指定指定的比較器Comparator排序鍵值對,示例按照鍵的大小排序。
- 如果指定了組合器Combiner,會先將輸出的數(shù)據(jù)通過Combiner先做處理,這樣會減少傳輸數(shù)據(jù)量,加快處理速度。
- 最終磁盤上存在一個個小的磁盤溢寫文件,這些文件歸并排序成一個大的分組排序好的文件
Reduce側(cè)Shuffle
- 在reduce側(cè)通過http拉取map側(cè)對應(yīng)的分組數(shù)據(jù),數(shù)據(jù)序列器Serilizer序列化后傳輸以減少傳輸壓力
- 拉取的數(shù)據(jù)先到緩沖區(qū)中排序合并
- 如果數(shù)據(jù)量太大,采用和之前一樣的策略,先寫到磁盤上一個小文件,然后再做歸并排序,這里數(shù)據(jù)排序主要就是為了歸并排序
到此,mapreduce的過程應(yīng)該解析非常清楚了,可以發(fā)現(xiàn),在shuffle過程中存在大量的磁盤讀寫操作,因此相對較慢,Spark等計算模型針對此盡量把中間shuffle過程放在內(nèi)存中處理以加快速度,但是也應(yīng)該看到,由于采用基于磁盤的歸并方法,mapreduce可以廉價的成本支持超大規(guī)模的數(shù)據(jù)處理,這也是mapreduce的價值所在。
這三大過程可以用網(wǎng)友的一幅圖完全概括,如下:
2. 六大組件
mapreduce允許我們編寫map/reduce過程處理代碼外,還允許我們定制如上的三大過程細(xì)節(jié),姑且稱這些細(xì)節(jié)控制為組件編程。除了上述過程分析提到的外,mapreduce還包括InputFormat和OutputFormat,一共是如下六大組件:
InputFormat
針對不同數(shù)據(jù)源選擇不同InputFormat實(shí)現(xiàn)讀取輸入到map,決定了輸入數(shù)據(jù)如何解析,默認(rèn)TextInputFormat,按行解析文本輸入,鍵為偏移量,值為行數(shù)據(jù)。
OutputFormat
輸出數(shù)據(jù)處理,決定數(shù)據(jù)如何輸出,可以選擇不同的OutputFormat實(shí)現(xiàn)來輸出。
Serilizer
決定傳輸數(shù)據(jù)如何序列化和反序列化,需要實(shí)現(xiàn)Writable接口的write和readFields。
Comparator
定制鍵值對如何排序,需要實(shí)現(xiàn)Comparable接口的compareTo。
Combiner
定制鍵值對如何在到達(dá)Reduce前先本地reduce一遍,減少數(shù)據(jù)傳輸量,需要實(shí)現(xiàn)Reducer接口的reduce,一般函數(shù)內(nèi)容和Reduce過程一樣。
Partitioner
定制如何分組鍵值對,默認(rèn)是HashPartitioner,需要實(shí)現(xiàn)Partitioner接口的getPartition,一般不需要定制。
后面會分別講這些組件的編程實(shí)現(xiàn)。
3. Mapreduce調(diào)優(yōu)
關(guān)于這個問題,不會具體展開,《hadoop權(quán)威指南(第四版)》已經(jīng)總結(jié)的很好,便于理解的話可從如下幾點(diǎn)考慮
- 充足的資源,包括map/reduce數(shù)量,對應(yīng)的cpu/mem/java opts配置
- 足夠快的傳輸,壓縮/序列化/中間combiner排序/map join等
- 沒有短板,shuffle過程調(diào)優(yōu),解決數(shù)據(jù)傾斜
如下對應(yīng)書中一個表供參考:
原創(chuàng),轉(zhuǎn)載請注明來自
- 博客https://blog.csdn.net/wenzhou1219
- 個人網(wǎng)站http://jimwen.net/
總結(jié)
- 上一篇: MR详细运行原理及过程
- 下一篇: 【MapReduce】 MR初识