標記粗體的我個人認為在運行hive sql時可以根據數據情況進行設置,當然還有一些join的優化的配置需要單獨研究。
mapred.reduce.tasks:每個作業的reduce任務數,默認是hadoop client的配置1個;
hive.exec.reducers.bytes.per.reducer:每個reducer的大小,默認是1G,輸入文件如果是10G,那么就會起10個reducer;
hive.exec.reducers.max:reducer的最大個數,如果在mapred.reduce.tasks設置為負值,那么hive將取該值作為reducers的最大可能值。當然還要依賴(輸入文件大小/hive.exec.reducers.bytes.per.reducer)所得出的大小,取其小值作為reducer的個數,hive默認是999;
hive.fileformat.check:加載數據文件時是否校驗文件格式,默認是true;
hive.groupby.skewindata:group by操作是否允許數據傾斜,默認是false,當設置為true時,執行計劃會生成兩個map/reduce作業,第一個MR中會將map的結果隨機分布到reduce中,達到負載均衡的目的來解決數據傾斜,可以參看阿里巴巴數據平臺的這篇文章了解hive對于數據傾斜時group by的處理;
hive.groupby.mapaggr.checkinterval:map端做聚合時,group by 的key所允許的數據行數,超過該值則進行分拆,默認是100000;
hive.mapred.local.mem:本地模式時,map/reduce的內存使用量,默認是0,就是無限制;
hive.mapjoin.followby.map.aggr.hash.percentmemory:map端聚合時hash表的內存占比,該設置約束group by在map join后進行,否則使用hive.map.aggr.hash.percentmemory來確認內存占比,默認值0.3;
hive.map.aggr.hash.force.flush.memeory.threshold:map端聚合時hash表的最大可用內存,如果超過該值則進行flush數據,默認是0.9;
hive.map.aggr.hash.min.reduction:如果hash表的容量與輸入行數之比超過這個數,那么map端的hash聚合將被關閉,默認是0.5,設置為1可以保證hash聚合永不被關閉;
hive.optimize.groupby:在做分區和表查詢時是否做分桶group by,默認開啟true;
hive.multigroupby.singlemr:將多個group by產出為一個單一map/reduce任務計劃,當然約束前提是group by有相同的key,默認是false;
hive.optimize.cp:列裁剪,默認開啟true,在做查詢時只讀取用到的列,這個是個有用的優化;
hive.optimize.index.filter:自動使用索引,默認不開啟false;
hive.optimize.index.groupby:是否使用聚集索引優化group-by查詢,默認關閉false;
hive.optimize.ppd:是否支持謂詞下推,默認開啟;所謂謂詞下推,將外層查詢塊的 WHERE 子句中的謂詞移入所包含的較低層查詢塊(例如視圖),從而能夠提早進行數據過濾以及有可能更好地利用索引。這篇中文文章簡單的說明了在關系數據庫里的應用;
hive.optimize.ppd.storage:謂詞下推開啟時,謂詞是否下推到存儲handler,默認開啟,在謂詞下推關閉時不起作用;
hive.ppd.recognizetransivity:在等值join條件下是否產地重復的謂詞過濾器,默認開啟;
hive.join.cache.size:在做表join時緩存在內存中的行數,默認25000;
hive.mapjoin.bucket.cache.size:mapjoin時內存cache的每個key要存儲多少個value,默認100;
hive.optimize.skewjoin:是否開啟數據傾斜的join優化,默認不開啟false;
hive.skewjoin.key:判斷數據傾斜的閾值,如果在join中發現同樣的key超過該值則認為是該key是傾斜的join key,默認是100000;
hive.skewjoin.mapjoin.map.tasks:在數據傾斜join時map join的map數控制,默認是10000;
hive.skewjoin.mapjoin.min.split:數據傾斜join時map join的map任務的最小split大小,默認是33554432,該參數要結合上面的參數共同使用來進行細粒度的控制;
hive.mapred.mode:hive操作執行時的模式,默認是nonstrict非嚴格模式,如果是strict模式,很多有風險的查詢會被禁止運行,比如笛卡爾積的join和動態分區;