(164)MR跑得慢的原因
MR程序執(zhí)行效率的瓶頸,或者說當(dāng)你覺得你的MR程序跑的比較慢的時(shí)候,可以從以下兩點(diǎn)來分析:
- 計(jì)算機(jī)性能
節(jié)點(diǎn)的CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等,這種屬于硬件上的檢查;
-
IO操作上的檢查
- 是否發(fā)生了數(shù)據(jù)傾斜?即單一reduce處理了絕大部分?jǐn)?shù)據(jù)
- Map運(yùn)行時(shí)間過長,導(dǎo)致Reduce一直在等待;
- 小文件過多。
(165)MR常用調(diào)優(yōu)參數(shù)
Map階段
Map階段:
1)自定義分區(qū),減少數(shù)據(jù)傾斜。即自定義分區(qū)類,繼承Partitioner接口,重寫getPartition();
2)減少環(huán)形緩沖區(qū)溢寫的次數(shù):
-
mapreduce.task.io.sort.mb
:shuffle的環(huán)形緩沖區(qū)大小,默認(rèn)是100M,可以提高至200M; -
mapreduce.map.sort.spill.percent
:環(huán)形緩沖區(qū)的溢出閾值,默認(rèn)是80%,可以提高至90%。即寫到90%的時(shí)候才溢出。
這樣做的目的是,減少環(huán)形緩沖區(qū)溢寫后形成的文件的個(gè)數(shù),減少后面步驟里分區(qū)合并的壓力。
3)增加每次Merge合并次數(shù):
-
mapreduce.task.io.sort.factor
:分區(qū)歸并時(shí),每次歸并的文件數(shù)量。默認(rèn)是10,可以提高到20(如果你的內(nèi)存足夠支撐的話,否則只能調(diào)小了)
4)在不影響業(yè)務(wù)結(jié)果的前提下,可以開啟Combiner:
job.setCombinerClass(xxxReducer.class);
5)為了減少磁盤IO,對(duì)于Map的輸出文件,可以采用snappy或者LZO壓縮。
6)提高M(jìn)apTask的內(nèi)存上限:
-
mapreduce.map.memory.mb
:默認(rèn)內(nèi)存上限是1024MB。通常來講,1G內(nèi)存用來處理128M數(shù)據(jù)是綽綽有余的,可以根據(jù)128M數(shù)據(jù)對(duì)應(yīng)1G內(nèi)存的原則,對(duì)應(yīng)提高內(nèi)存。
7)調(diào)整MapTask的堆內(nèi)存大小:
-
mapreduce.map.java.opts
:跟上面的內(nèi)存參數(shù)保持一致就可以??刂苆ava用的內(nèi)存
8)增加MapTask的CPU核數(shù)。
-
mapreduce.map.cpu.vcores
:默認(rèn)核數(shù)是1,對(duì)于計(jì)算密集型任務(wù),可以增加CPU核數(shù);
9)異常重試次數(shù)
-
mapreduce.map.maxattempts
:每個(gè)MapTask的最大重試次數(shù),一旦重試次數(shù)超過該值,則認(rèn)為MapTask運(yùn)行失敗,默認(rèn)值是4。可以根據(jù)實(shí)際情況做加減。
Reduce階段
Reduce階段:
1)調(diào)整每個(gè)Reduce一次性從多少個(gè)MapTask拉取數(shù)據(jù)。
-
mapreduce.reduce.shuffle.parallelecopies
:默認(rèn)是5,即每個(gè)Reduce一次最多拉5個(gè)MapTask里的數(shù)據(jù),如果內(nèi)存足夠支撐,完全可以調(diào)成10;
2)調(diào)整所拉取數(shù)據(jù),在內(nèi)存緩沖的占比。
-
mapreduce.reduce.shuffle.input.buffer.percent
:控制內(nèi)存buffer大小占ReduceTask可用內(nèi)存的比例。默認(rèn)是0.7,可以提高到0.8。畢竟在內(nèi)存中緩存的數(shù)據(jù)越多,整體計(jì)算速度就越快。
3)控制歸并排序時(shí),可以使用的內(nèi)存比例:
-
mapreduce.reduce.shuffle.merge.percent
:簡單的說,就是歸并排序時(shí),可以使用的內(nèi)存占Reduce總可用內(nèi)存的比例,超過這個(gè)比例,就只能溢出到磁盤了。這個(gè)比例默認(rèn)是0.66,最高可以提高到0.75。
4)調(diào)整ReduceTask的可用內(nèi)存上限:
-
mapreduce.reduce.memory.mb
:默認(rèn)可用內(nèi)存上限為1024MB。同樣的,128M數(shù)據(jù)對(duì)應(yīng)1G內(nèi)存原則。適當(dāng)提升內(nèi)存到4-6G。
5)調(diào)整ReduceTask的堆內(nèi)存:
mapreduce.reduce.java.opts
6)調(diào)整ReduceTask的CPU核數(shù):
-
mapreduce.reduce.cpu.vcores
:默認(rèn)核數(shù)是1,可以提高到2-4個(gè)
7)最大重試次數(shù):
-
mapreduce.reduce.maxattempts
:ReduceTask的最大重試次數(shù),一旦重試次數(shù)超過該值,則認(rèn)為運(yùn)行失敗。默認(rèn)是4。
8)當(dāng)MapTask的完成比例達(dá)到多少時(shí),才會(huì)為ReduceTask申請(qǐng)資源:
-
mapreduce.job.reduce.slowstart.completedmaps
:默認(rèn)是0.05,即有5%的MapTask完成任務(wù)后就可以為ReduceTask申請(qǐng)資源。
9)Task的超時(shí)時(shí)間:
-
mapreduce.task.timeout
:控制task的超時(shí)時(shí)間,默認(rèn)是600000毫秒,即10min。如果一個(gè)Task,在10min內(nèi),沒有數(shù)據(jù)進(jìn)入,也沒有數(shù)據(jù)輸出,則直接退出該任務(wù)。如果你的程序?qū)γ織l輸出數(shù)據(jù)的處理時(shí)間很長,可適當(dāng)調(diào)大這個(gè)參數(shù)。
10)如果可以不用Reduce,那就盡量不用。
(166)MR數(shù)據(jù)傾斜問題
直觀來看,就是在大部分任務(wù)都已經(jīng)完成了的情況下,還有少數(shù)任務(wù)仍在運(yùn)行,這時(shí)候大概率就是發(fā)生了數(shù)據(jù)傾斜,分給那少數(shù)任務(wù)的數(shù)據(jù)太多了,導(dǎo)致它們一直沒有處理完。
當(dāng)發(fā)生數(shù)據(jù)傾斜后,我們可以從哪些角度考慮優(yōu)化呢?文章來源:http://www.zghlxwxcb.cn/news/detail-721792.html
- 首先是檢查是否是由于空值過多(key)造成的數(shù)據(jù)傾斜;
生產(chǎn)環(huán)境下,可以選擇過濾掉空值;如果一定要保留空值的話,可以自定義分區(qū),將空值加隨機(jī)數(shù)打散分布。文章來源地址http://www.zghlxwxcb.cn/news/detail-721792.html
- 能在Map階段提前處理的,就在Map階段提前處理。比如說Map階段的Combiner、MapJoin等;
- 設(shè)置多個(gè)reduce個(gè)數(shù);
參考文獻(xiàn)
- 【尚硅谷大數(shù)據(jù)Hadoop教程,hadoop3.x搭建到集群調(diào)優(yōu),百萬播放】
到了這里,關(guān)于Hadoop3教程(三十四):(生產(chǎn)調(diào)優(yōu)篇)MapReduce生產(chǎn)經(jīng)驗(yàn)匯總的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!