星環(huán)TDH使用中出現(xiàn)reducer數(shù)量超過(guò)1000000解決辦法
問(wèn)題:
使用sql語(yǔ)句,insert into xxx select * from xxx group by;等復(fù)雜的邏輯語(yǔ)句
出現(xiàn)reducer數(shù)量超過(guò)1000000
原因分析:
Hadoop MapReduce程序中,reducer個(gè)數(shù)的設(shè)定極大影響執(zhí)行效率 ,這使得Hive怎樣決定reducer個(gè)數(shù)成為一個(gè)關(guān)鍵問(wèn)題。遺憾的是Hive的 估計(jì)機(jī)制很弱,
猜測(cè)星環(huán)在處理reducer的時(shí)候是根據(jù)map數(shù)決定的,如果數(shù)據(jù)出現(xiàn)傾斜,會(huì)產(chǎn)生很多reducer
reducer的數(shù)量與輸出文件的數(shù)量有關(guān),如果reducer數(shù)太多,會(huì)產(chǎn)生大量小文件,對(duì)HDFS造成壓力.如果redcuer數(shù)量太少,每個(gè)reducer要處理很多數(shù)據(jù),容易拖慢運(yùn)行時(shí)間或者造成OOM.
說(shuō)明:
也有些情況是固定只有一個(gè)reduce的(不管有沒(méi)指定reduce數(shù)量):
a.沒(méi)有g(shù)roup by的匯總
b.使用order by全局排序
c.笛卡爾積
d.count(distinct)
但這幾種情況一般是我們需要避免的,因?yàn)闀?huì)造成性能瓶頸.
解決:
SET mapred.reduce.tasks = 800;
原理:
如果 reducer 數(shù)量過(guò)多,一個(gè) reducer 會(huì)產(chǎn)生一個(gè)結(jié)數(shù)量果文件,這樣就會(huì)生成很多小文件,那么如果這些結(jié)果文件會(huì)作為下一個(gè) job 的輸入,則會(huì)出現(xiàn)小文件需要進(jìn)行合并的問(wèn)題,而且啟動(dòng)和初始化 reducer 需要耗費(fèi)和資源。
如果 reducer 數(shù)量過(guò)少,這樣一個(gè) reducer 就需要處理大量的數(shù)據(jù),并且還有可能會(huì)出現(xiàn)數(shù)據(jù)傾斜的問(wèn)題,使得整個(gè)查詢耗時(shí)長(zhǎng)。默認(rèn)情況下,hive 分配的 reducer 個(gè)數(shù)由下列參數(shù)決定:
-
參數(shù)1:
hive.exec.reducers.bytes.per.reducer(默認(rèn)1G) -
參數(shù)2:
hive.exec.reducers.max(默認(rèn)為999)
reducer的計(jì)算公式為:
N = min(參數(shù)2, 總輸入數(shù)據(jù)量/參數(shù)1)
可以通過(guò)改變上述兩個(gè)參數(shù)的值來(lái)控制reducer的數(shù)量。也可以通過(guò)
set mapred.map.tasks=10;
直接控制reducer個(gè)數(shù),如果設(shè)置了該參數(shù),上面兩個(gè)參數(shù)就會(huì)忽略。
可以參考這個(gè):http://www.rzrgm.cn/pengpenghuhu/p/11735422.html
作者:少帥
出處:少帥的博客--http://www.rzrgm.cn/wang3680
您的支持是對(duì)博主最大的鼓勵(lì),感謝您的認(rèn)真閱讀。
本文版權(quán)歸作者所有,歡迎轉(zhuǎn)載,但請(qǐng)保留該聲明。
支付寶
微信

浙公網(wǎng)安備 33010602011771號(hào)