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