ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Hive调优

2021-09-25 13:03:38  阅读:175  来源: 互联网

标签:语句 set reduce hive 调优 limit 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。

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;  

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

标签:语句,set,reduce,hive,调优,limit,Hive
来源: https://blog.csdn.net/Honghui_Wang/article/details/120470327

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有