Hive的调优

本文详细介绍了Hive的性能优化方法,包括Fetch抓取避免MapReduce、表的优化如Join、MapJoin、Group By、Count(distinct)的处理,以及如何解决数据倾斜问题。此外,还讲解了动态分区调整、使用EXPLAIN分析执行计划、并行执行、严格模式、JVM重用和推测执行等关键优化技巧,帮助提升Hive查询效率。
摘要由CSDN通过智能技术生成

Fetch抓取(Hive可以避免进行MapReduce)

Hive中对某些情况的查询可以不必使用MapReduce计算。例如:SELECT * FROM employees;在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。
在hive-default.xml.template文件中hive.fetch.task.conversion默认是more,老版本hive默认是minimal,该属性修改为more以后,在全局查找、字段查找、limit查找等都不走mapreduce。

表的优化

Join

Join原则:

  1. 小表Join大表,
    将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用Group让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce。
    select count(distinct s_id) from score;
    select count(s_id) from score group by s_id; 在map端进行聚合,效率更高

  2. 多个表关联时,最好分拆成小段,避免大sql(无法控制中间Job)

  3. 大表Join大表
    (1)空KEY过滤
    有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。
    (2)空key转换
    有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上

MapJoin

如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成Common Join,即:在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。

  1. 开启MapJoin参数设置:
    (1)设置自动选择Mapjoin
    set hive.auto.convert.join = true; 默认为true
    (2)大表小表的阈值设置(默认25M以下认为是小表):
    set hive.mapjoin.smalltable.filesize=25123456;
  2. MapJoin工作机制
    在这里插入图片描述

Group By

默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。
并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。

  1. 开启Map端聚合参数设置
    (1)是否在Map端进行聚合ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值