1. 程式人生 > >hive數倉的優化

hive數倉的優化

(1)    資源分配
Mapredue的最小資源單元為container,container包括memory及vcores,所以直接與mapreduce掛鉤的資源在yarn上是container,下面是具體的container及mapreduce資源佔用設定:
Container:(配置在hadoop的yarn-site.xml裡配置)

配置檔案        配置項名稱        配置項值
yarn-site.xml        yarn.nodemanager.resource.memory-mb        = Containers個數* 每個Container記憶體,機器總記憶體
yarn-site.xml        yarn.scheduler.minimum-allocation-mb        = 每個Container記憶體
yarn-site.xml        yarn.scheduler.maximum-allocation-mb        = Containers個數* 每個Container記憶體
mapred-site.xml        mapreduce.map.memory.mb        = 每個Container記憶體
mapred-site.xml        mapreduce.reduce.memory.mb        = 2 * 每個Container記憶體
mapred-site.xml        mapreduce.map.java.opts        = 0.8 * 每個Container記憶體
mapred-site.xml        mapreduce.reduce.java.opts        = 0.8 * 2 * 每個Container記憶體
yarn-site.xml (check)        yarn.app.mapreduce.am.resource.mb        = 2 * 每個Container記憶體
yarn-site.xml (check)        yarn.app.mapreduce.am.command-opts        = 0.8 * 2 * 每個Container記憶體

yarn監控介面中可以在如下位置看到資源分配(自己伺服器是預設值,沒做配置):
 


(2)    mapreduce的map切分設定(reduce同理):
每個map記憶體設定(單位為B):
       set mapred.max.split.size=50000000;
          set mapred.min.split.size.per.node=50000000;
          set mapred.min.split.size.per.rack=50000000;
這樣就能控制我們map的切分大小為大約50m

(3)    控制任務並行:
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=8;
對於沒有依賴的任務並行執行,例如union all,有顯著優化效果,第二個引數主要控制任務併發數

(4)    資料傾斜引數優化:
1:如果是group by過程出現傾斜 應該設定為true
Set hive.groupby.skewindata=true; 
2:group時預先取100000條資料聚合,如果聚合後的條數/100000>0.5,則不再聚合
hive.groupby.mapaggr.checkinterval = 100000 (預設)hive.map.aggr.hash.min.reduction=0.5(預設)
3:如果是join 過程出現傾斜應該設定為true
Set hive.optimize.skewjoin=true;
4:這個是join的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定
Set hive.skewjoin.key=100000;


5:map join,一般出現數據傾斜都是在reduce端,如果在map端就做了join會很好的避免問題的出現
set hive.auto.convert.join=true;(目前版本這個引數是預設開啟的)
set hive.mapjoin.smalltable.filesize=25000000;(如果join時小表大小小於該閥值,會自動進行map join,我們也可以控制這個閥值,達到優化目的)
6:資料傾斜問題原因:資料在join時存在笛卡爾積,空值或重複值過多,所以在資料處理時最好先做好資料過濾,清洗
(5)    Jvm重用:
set mapred.job.reuse.jvm.num.tasks=20,避免重複的關閉重啟
(6)    本地模式:
 set hive.exec.mode.local.auto=true;適合於資料量少的 操作