hive優化要點總結

jopen 11年前發布 | 26K 次閱讀 NoSQL數據庫 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!