Hive調(diào)優(yōu):Hive數(shù)據(jù)傾斜

1合理設(shè)置Map數(shù)
1)通常情況下,作業(yè)會通過input的目錄產(chǎn)生一個或者多個map任務(wù)。
主要的決定因素有:input的文件總個數(shù),input的文件大小,集群設(shè)置的文件塊大小。
舉例:
a)假設(shè)input目錄下有1個文件a,大小為780M,那么hadoop會將該文件a分隔成7個塊(6個128m的塊和1個12m的塊),從而產(chǎn)生7個map數(shù)。
b)假設(shè)input目錄下有3個文件a,b,c大小分別為10m,20m,150m,那么hadoop會分隔4個塊(10m,20m,128m,22m),從而產(chǎn)生4個map數(shù)。即,如果文件大于塊于塊大小(128m),那么會拆分,如果小于塊大小,則把該文件當(dāng)成一個塊。
2)是不是map數(shù)越多越好?
答案是否定的。如果一個任務(wù)有很多小文件(遠(yuǎn)遠(yuǎn)小于塊大小128m),則每個小文件也會被當(dāng)做一個塊,用一個map任務(wù)來完成,而一個map任務(wù)啟動和初始化的時間遠(yuǎn)遠(yuǎn)大于邏輯處理的時間,就會造成很大的資源浪費。而且,同時可執(zhí)行的map數(shù)受限的。
3)是不是保證每個map處理接近128m的文件塊就高枕無憂了?
答案也是不一定。比如有一個127m的文件,正常會用一個map去完成,但這個文件只有一個或者兩個小字段,卻有幾千萬的記錄,如果map處理的邏輯比較復(fù)雜,用一個map任務(wù)去做,肯定也比較耗時。
針對上面的問題2和3,我們需要采取兩種方式來解決:即減少map數(shù)和增加map數(shù);

2小文件合并
在map執(zhí)行前合并小文件,減少map數(shù):
CombineHiveInputFormat具有對小文件進(jìn)行合并的功能(系統(tǒng)默認(rèn)的格式)
set mapred.max.split.size=112345600;
set mapred.min.split.size.per.node=112345600;
set mapred.min.split.size.per.rack=112345600;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
這個參數(shù)表示執(zhí)行前進(jìn)行小文件合并,前面三個參數(shù)確定合并文件塊的大小,大于文件塊大小128m的,按照128m來分隔,小于128m,大于100m的,按照100m來分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),進(jìn)行合并。
3 復(fù)雜文件增加map數(shù)
當(dāng)input的文件都很大,任務(wù)邏輯復(fù)雜,map執(zhí)行非常慢的時候,可以考慮增加map數(shù),來使得每個map處理的數(shù)據(jù)量減少,從而提高任務(wù)的執(zhí)行效率。
增加map的方法為
根據(jù)
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize))公式
調(diào)整maxSize最大值。讓maxSize最大值低于blocksize就可以增加map的個數(shù)。
mapreduce.input.fileinputformat.split.minsize=1 默認(rèn)值是1
mapreduce.input.fileinputformat.split.maxsize=Long.MAXValue
默認(rèn)值Long.MAXValue因此,默認(rèn)情況下,切片大小=blocksize
maxsize(切片最大值):參數(shù)如果調(diào)到比blocksize小,則會讓切片變小,而且就等于配置的這個參數(shù)的值。
minsize(切片最小值):參數(shù)調(diào)的比blockSize大,則可以讓切片變得比blocksize還大。
例如:
--設(shè)置maxsize大小為10m,也就是說一個fileSplit的大小為10m
set mapreduce.input.fileinputformat.split.maxsize=10485760;

4合理設(shè)置Reduce數(shù)
1、調(diào)整reduce個數(shù)方法一
1)每個Reduce處理的數(shù)量默認(rèn)是256MB
set hive.exec.reducers.bytes.per.reducer=2560000000;
2)每個任務(wù)最大的reduce數(shù),默認(rèn)為1009
set hive.exec.reducers.max=1009;
3)計算reducer數(shù)的公式
N=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù) 1)
2、調(diào)整reduce個數(shù)方法二
--設(shè)置每一個job中reduce個數(shù)
set mapreduce.job.reduces=3;

3、reduce個數(shù)并不是越多越好
過多的啟動和初始化reduce也會消耗時間和資源;
同時過多的reduce會生成很多個文件,也有可能出現(xiàn)小文件問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容