limit限制調整html
--由於使用limit語句時候,是先執行整個查詢語句,而後再返回部分結果的java
set hive.limit.optimize.enable=true;node
set hive.limit.row.max.size=10000;sql
set hive.limit.optimize.limit.file=10;數據庫
2.JOIN優化app
。。。jvm
3. 本地模式性能
--hive嘗試使用本地模式執行查詢,要否則hive會使用MapReduce來執行其餘全部的查詢fetch
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;
14.hive客戶端查詢報堆內存溢出Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
修改/usr/lib/hive/bin/hive-config.sh文件 中
# Default to use 256MB
export HADOOP_HEAPSIZE=${HADOOP_HEAPSIZE:-256}
或者修改mapred-site.xml配置文件,
map和reduce的堆內存參數:
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1024M</value>
</property>
map和reduce的內存大小
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>3072</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>1536</value>
</property>
注意:
這些參數都是客戶端參數,請在提交任務前設置。堆內存的配置,是不能超過map/reduce自己的內存大小的。咱們如今的經驗值是,配置堆內存內存的80%是合理的。
15. Hive SQL優化參考下面博客:
https://my.oschina.net/rossiter/blog/805778 hive查詢性能-where條件中的變量
hive優化之------根據 文件大小控制hive任務中的map數和reduce數
http://blog.csdn.net/longshenlmj/article/details/51569892 sql和hive語句執行順序、explain查看執行計劃、group by生成MR
https://my.oschina.net/zhongl/blog/32492 從SQL到HiveQL應改變的幾個習慣
http://lxw1234.com/archives/2015/06/317.htm
http://www.uml.org.cn/sjjmck/201501094.asp
https://www.iteblog.com/archives/1533.html 解決reduce建立文件數過多