原文:http://www.tuicool.com/articles/rMvQvm
----------------------------------------------------------------------
- limit?限制調整
--?因為使用?limit?語句時候,是先執行整個查詢語句,然后再返回部分結果的
set hive.limit.optimize.enable=true;
set hive.limit.row.max.size=10000;
set hive.limit.optimize.limit.file=10;
2.JOIN?優化
。。。
3.???本地模式
--hive?嘗試使用本地模式執行查詢,要不然?hive?會使用?MapReduce?來執行其他所有的查詢
set hive.exec.mode.local.auto=true;
4.?并行執行
set hive.exec.parallel=true;
5.?嚴格模式
--?對分區表進行查詢,在?where?子句中沒有加分區過濾的話,將禁止提交任務?(?默認:?nonstrict)
set hive.mapred.mode=strict;
注:使用嚴格模式可以禁止?3?種類型的查詢:
(?1?)對于分區表,不加分區字段過濾條件,不能執行
(?2?)對于?order by?語句,必須使用?limit?語句。
(?3?)限制笛卡爾積的查詢(?join?的時候不使用?on?,而使用?where?的)。
6.?調整?mapper?和?reducer?個數
set hive.exec.reducers.max=(?集群總?reduce?槽位個數?*1.5)/(?執行中的查詢的平均個數?)
7.JVM?重用
set mapred.job.reuse.jvm.num.tasks=10; --10?為重用個數
8.?索引
索引可以加快含有?group by?語句的查詢的計算速度
9.?動態分區調整
--?動態分區屬性:設置為?true?表示開啟動態分區功能(默認為?false?)
hive.exec.dynamic.partition=true;
--?動態分區屬性:設置為?nonstrict,?表示允許所有分區都是動態的(默認為?strict?)
--?設置為?strict?,表示必須保證至少有一個分區是靜態的
hive.exec.dynamic.partition.mode=strict;
--?動態分區屬性:每個?mapper?或?reducer?可以創建的最大動態分區個數
hive.exec.max.dynamic.partitions.pernode=100;
--?動態分區屬性:一個動態分區創建語句可以創建的最大動態分區個數
hive.exec.max.dynamic.partitions=1000;
--?動態分區屬性:全局可以創建的最大文件個數
hive.exec.max.created.files=100000;
???????????--?控制?DataNode?一次可以打開的文件個數
???????????--?這個參數必須設置在?DataNode?的?$HADOOP_HOME/conf/hdfs-site.xml?文件中
??<property>
??<name>dfs.datanode.max.xcievers</name>
??<value>8192</value>
??</property>
10.?推測執行
--?目的:是通過加快獲取單個?task?的結果以及進行偵測將執行慢的?TaskTracker?加入到黑名單的方式來提高整體的任務執行效率
(?1?)修改???$HADOOP_HOME/conf/mapred-site.xml?文件
??<property>
??<name>mapred.map.tasks.speculative.execution </name>
??<value>true</value>
??</property>
<property>
??<name>mapred.reduce.tasks.speculative.execution </name>
??<value>true</value>
??</property>
(?2?)修改?hive?配置
set hive.mapred.reduce.tasks.speculative.execution=true;
11.?單個?MapReduce?中多個?group by
--?多個?group by?操作組裝到單個?MapReduce?任務中
set hive.multigroupby.singlemr=false;
12.?虛擬列
--?當?hive?產生了非預期的或?null?的時候,可以通過虛擬列進行診斷,判斷哪行數據出現問題
INPUT__FILE__NAME?????(輸入文件名)
BLOCK__OFFSET__INSIDE__FILE?????(塊內偏移量)
ROW__OFFSET__INSIDE__BLOCK?????(?行偏移量,需要設置?hive.exec.rowoffset=true;?啟用?)
13.???其他參數調優
--?開啟?CLI?提示符前打印出當前所在的數據庫名
set hive.cli.print.current.db=true;
--?讓?CLI?打印出字段名稱
hive.cli.print.header=true;
--?提高聚合的性能
set hive.map.aggr=true;
--?對于簡單的不需要聚合的類似?SELECT <col> from <table> LIMIT n?語句,不需要起?MapReduce job?,直接通過?Fetch task?獲取數據
set hive.fetch.task.conversion=more;