1. 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.调整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;


参考:http://gaoxianwei.iteye.com/category/306899