天天看點

Hive性能調優之Mapper和ReducerHive背後的Mapper調優Hive背後的Reducer調優

這裡寫自定義目錄标題

  • 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;

繼續閱讀