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建立文件数过多

相关文章
相关标签/搜索