Hive调优

【注意】所有的配置项写到xml文件,需要更换格式。

1、使用explain、explain extended

explain select count(car_brand) from car;  --结果见下图


explain extended select count(car_brand) from car;

使用explain可以看到Hive是怎么转换成MapReduce任务的。想要更详细的信息可以用explain extended。

Hive调优

2、限制调整

使用limit语句有时候可以避免整个查询语句(有时候并不能)。Hive有个属性可以设置开启时,使用limit,可以对源数据进行抽样,还可以设置范围。缺点就是,可能导致有一部分数据永远不会被处理到,join、group by和聚合函数的返回结果可能不一样。

# 可在xml文件中设置

set hive.limit.optimze.enable=true;



set hive.limit.row.max.size=100000;

set hive.limit.optimize.limit.file=10;

3、JOIN优化

就是前面提过的map-site JOIN,多表关键,最右边的表数据量最大。如果表的数据量足够小,是可以载入内存,减少reduce阶段

4、本地模式

如果查询的数据量不大,可以启动本地模式。设置hive.exec.mode.local.auto为true,让Hive在适合的时候自动启动这个优化。可以写入到hive-site.xml配置文件中。

5、并行执行

Hive会将一个查询转化为一个或多个阶段,如MapReduce阶段、抽样阶段、limit阶段等。默认情况下,Hive一次只执行一个阶段。有些阶段并不是完全互相依赖的,是可以并行执行。可以通过设置hive.exec.parallel为true开启并行执行。

6、严格模式

设置hive.mapred.mode为strict,那么Hive会禁止以下三种查询:

  • 分区表在where语句中一定要指定分区来限制查询范围,否则不允许执行。分区表一般的数据量都是比较大。

  • 使用order by语句一定要用limit语句。因为order by会将所有数据都集中到一个reduce中处理,可能会导致执行时间过长

  • 限制笛卡尔积的查询。JOIN的时候只用where语句而不用on,Hive不会将where语句优化为on语句(关系型数据库会),所以需要人为处理。

7、调整Map个数和Reduce个数

Hive是按照输入的数据量来确定reduce个数的,当Hive查询有reduce过程(如group by),CLI窗口会打印出reduce个数。Hive默认的reduce个数是3个,通常是合适的。也可以直接设置reduce个数为固定数值,根据不同的数据量设置mapred.reduce.tasks的值即可。如果是在共享集群处理大任务时,为了控制资源利用的情况,需要设置reduce的最大插槽(Hive集群可提供的map和reduce的资源个数),hive.exec.reducers.max取值参考公式:(集群所提供的插槽个数*1.5)/(执行中查询的平均个数)。

8、JVM重用

JVM重用可以使JVM实例在同一个job中重新使用N次,减少每次启动JVM的开销,适合有很多小文件或者很多tasks任务的场景。但JVM重用也有一个缺点,就是一定会等到job结束才会释放资源,如果有些reduce task比较快完成,空闲的插槽也没办法被其他job使用,会造成浪费。JVM重用可以通过设置mapred.job.reuse.jvm.num.tasks的值来指定。

9、索引

使用索引可以加快group by的查询效率。

10、动态分区调整

动态分区insert语句可以向分区表创建很多分区。分区太多也不好,Hive有些参数可以来调整动态分区:

# 也可以在xml文件中配置

set hive.exec.dynamic.partition.mode=strict;  # 设置动态分区模式为严格模式,此要求至少有一个静态分区
set hive.exec.dynamic.partitions=300000;
set hive.exec.max.dynamic.partitions.pernode=1000; # 一般不能设置地太大


# 控制Hadoop namenode上一次能打开的文件数,这个需要在$HADOOP_HOME/conf/hdfs-site.xml配置,重启DataNode后才生效

set dfs.datanode.max.xceivers=8192;  

还有其他的一些优化方法,暂时不写了 

上一篇:Zabbix多台主机相同监控项求和


下一篇:Design Compiler —— 综合后处理(十二)