hive優化要點總結
個人認為總體兩種思想:
1、讓服務器盡可能的多做事情,榨干服務器資源,以最高系統吞吐量為目標
再好的硬件沒有充分利用起來,都是白扯淡。
比如:
(1) 啟動一次job盡可能的多做事情,一個job能完成的事情,不要兩個job來做
通常來說前面的任務啟動可以稍帶一起做的事情就一起做了,以便后續的多個任務重用,與此緊密相連的是模型設計,好的模型特別重要.
(2) 合理設置reduce個數
reduce個數過少沒有真正發揮hadoop并行計算的威力,但reduce個數過多,會造成大量小文件問題,數據量、資源情況只有自己最清楚,找到個折衷點,
(3) 使用hive.exec.parallel參數控制在同一個sql中的不同的job是否可以同時運行,提高作業的并發
2、讓服務器盡量少做事情,走最優的路徑,以資源消耗最少為目標
比如:
(1) 注意join的使用
若其中有一個表很小使用map join,否則使用普通的reduce join,注意hive會將join前面的表數據裝載內存,所以較小的一個表在較大的表之前,減少內存資源的消耗
(2)注意小文件的問題
在hive里有兩種比較常見的處理辦法
第一是使用Combinefileinputformat,將多個小文件打包作為一個整體的inputsplit,減少map任務數
set mapred.max.split.size=256000000;
set mapred.min.split.size.per.node=256000000
set Mapred.min.split.size.per.rack=256000000
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
第二是設置hive參數,將額外啟動一個MR Job打包小文件
hive.merge.mapredfiles = false 是否合并 Reduce 輸出文件,默認為 False
hive.merge.size.per.task = 256*1000*1000 合并文件的大小
(3)注意數據傾斜
在hive里比較常用的處理辦法
第一通過hive.groupby.skewindata=true控制生成兩個MR Job,第一個MR Job Map的輸出結果隨機分配到reduce做次預匯總,減少某些key值條數過多某些key條數過小造成的數據傾斜問題
第二通過hive.map.aggr = true(默認為true)在Map端做combiner,假如map各條數據基本上不一樣, 聚合沒什么意義,做combiner反而畫蛇添足,hive里也考慮的比較周到通過參數 hive.groupby.mapaggr.checkinterval = 100000 (默認)hive.map.aggr.hash.min.reduction=0.5(默認),預先取100000條數據聚合,如果聚合后的條數/100000>0.5,則不再聚合
(4)善用multi insert,union all
multi insert適合基于同一個源表按照不同邏輯不同粒度處理插入不同表的場景,做到只需要掃描源表一次,job個數不變,減少源表掃描次數
union all用好,可減少表的掃描次數,減少job的個數,通常預先按不同邏輯不同條件生成的查詢union all后,再統一group by計算,不同表的union all相當于multiple inputs,同一個表的union all,相當map一次輸出多條
(5) 參數設置的調優
集群參數種類繁多,舉個例子比如
可針對特定job設置特定參數,比如jvm重用,reduce copy線程數量設置(適合map較快,輸出量較大)
如果任務數多且小,比如在一分鐘之內完成,減少task數量以減少任務初始化的消耗。可以通過配置JVM重用選項減少task的消耗
來自:http://blog.csdn.net/u011750989/article/details/12024301