hive性能調優

  1. 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.調整mapperreducer個數

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;

 

--動態分區屬性:每一個mapperreducer能夠建立的最大動態分區個數

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建立文件數過多