這裡寫自定義目錄标題
- Hive背後的Mapper調優
- Hive背後的Reducer調優
Hive背後的Mapper調優
1,Mapper數過大,會産生大量的小檔案,由于Mapper是基于虛拟機的,過多的Mapper建立和初始化及關閉虛拟機都會消耗大量的硬體資源;
Mapper數太少,并發度太小,Job執行時間過長,無法充分利用分布式硬體資源
2,Mapper數由什麼決定呢?
輸入檔案數目
輸入檔案大小
配置參數
預設情況下:例如一個檔案800M,Block大小是128M,那麼Mapper數目就是7個(6< 800/128 <7),6個Mapper處理的資料是128M,1個
Mapper處理的資料是32M;再例如,一個目錄下有3個檔案大小分别為5M,10M,150M,此時會産生4個Mapper,處理的資料分别是5M,
10M,128M,22M
為什麼要控制Mapper的個數?
例如上面的例子中128M的Mapper運作的特别慢,但其他3個Mapper運作的很快
減少Mapper的個數,就要合并小檔案,這種小檔案有可能是直接來自資料源的小檔案,也可能是Reducer産生的小檔案;使用合并器
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.merge.mapFiles=true;#map端的合并
set hive.merge.mapredFiles=true;#reducer端的合并
set hive.merge.size.per.task=256000000;#每個map處理多大的資料,機關是位元組
set mapred.max.split.size=256000000;#每個切分map的最大大小
set mapred.min.split.size.per.node=128000000;#每個切分map的最小大小
增加Mapper的個數,一般是通過控制Hive SQL中上一個Job的Reducer個數來控制的,例如在Join操作時會把多個表分解為多個Job
set mapred.map.tasks=2;
set hive.merge.mapFiles=true;
set hive.merge.mapredFiles=true;
set hive.merge.size.per.task=256000000;
例如我們有5個300M的檔案;按照上面的配置會産生10個Mapper,5個Mapper處理的都是256M的資料,另外5個Mapper處理的都是44M的資料,
這樣就會産生資料傾斜
如何解決,設定:
set mapred.map.tasks=6,此時根據MapRed的運作機制,會劃分6個Mapper,每個Mapper的處理資料大小是256M,min(1500/6,256M)=250M
Hive背後的Reducer調優
1,Reducer個數過大的話,會産生很多小檔案,每個Reducer都會産生一個檔案,如果這些小檔案是下一個Job的輸入,則需要對小檔案進行合并;
同樣啟動、初始化和銷毀Reducer的虛拟機也需要消耗大量的硬體;
Reducer個數過小的話,Reducer的時間會比較長,也可能會出現資料傾斜;
2,如何控制Reducer的個數呢?
set hive.exec.reducers.byte.per.reducer=1G;#每個reducer能夠處理的資料大小,合并之後可能就是100M的資料???
set hive.exec.reducers.max=999#最多可以設定reducer的個數
Reducer個數=min(999,Reducer的資料輸入總量/1G)
set mapred.reduce.tasks=10;#預設是1,如果目前的Reducer的結果很大,且被接下來多個Job使用其結果,我們該如何設定參數?
一般都需要調大該參數;
什麼情況下隻有一個Reducer?
如果不進行group by但卻需要彙總,或者說order by,當然如果最後Reducer的資料小于預設的1G的話,也會隻有1個Reducer;