Hive数据倾斜问题

介绍

数据倾斜问题一直是大数据计算中普遍存在的现象,针对这种现象一般都是从两方面解决,从数据本身和应用软件进行优化。
由于Hive中计算任务是转化成MapReduce进行的,当sql运行缓慢或者某几个reduce任务一直卡在99%时,说明数据有倾斜现象。根本原因就是数据在map或者reduce中分布不均匀,导致某几个任务处理大量数据,大部分任务处理少量甚至没有数据可处理,这就导致了数据倾斜,使得整个MapReduce任务运行缓慢。

Hive中join方式

Hive中join操作分为Common Join和Map Join两种,我们平时使用的就是Common Join。
Common Join是reduce端的join,在map阶段按照join条件做为分区key,在shuffle阶段按照key进行分区,最终各个分区数据进入对应的reduce中,然后再进行join计算。
Map Join是将join和计算过程放到了map端执行,先将较小的表加载到内存中,然后每个map中复制一份数据,直接在本地与大表join计算,这样减少了到reduce端数据传输,从而达到优化效果。

注意:Map Join通常适用于大表和小表join,因为数据在map内存中进行,所以两张大表会超过内存限制。

优化

调整hive参数

1、设置hive.map.aggr=true。开启map端聚合。
2、设置hive.groupby.skewindata=true。开启map到reduce端自动负载均衡,它会启动两个MR Job,第一个Job先将map输出结果随机分配到reduce中,先进行一波数据预处理,尽量减小数据量;第二个Job再按照实际key正常分配到reduce,最终完成计算。
3、其他参数调整

hive.auto.convert.join=true。map join自动转化,默认false
hive.mapjoin.smalltable.filesize/hive.smalltable.filesize=25000000。map join中小表阈值,阈值范围内才进行map join,默认25M
hive.auto.convert.join.noconditionaltask=true。是否将多个map join合并为一个,默认true
hive.auto.convert.join.noconditionaltask.size。多个map join合并为一个的文件大小总和,此参数需设置hive.auto.convert.join.noconditionaltask为true才生效

优化sql语句

1、检查sql语句是否合理,子查询或关联查询是否可以优化,尽量想办法将join表变小,能进行map join计算。
2、对于空值如果对计算结果没有影响,可以填写随机值,保证数据负载均衡。
3、如果数据过于密集,例如key取值范围是0-1000,但是数据集中在0-100,可以将key进行等倍数扩大,由0-100变成0-1000,使数据分散开。
4、对于表中重复或者无用数据先进行过滤再join统计。
5、关联条件字段类型保持一致,保证相同key分配到同一个map或reduce任务中。
6、如果未关联部分数据比较多,且都集中在某几个任务中,可以将这些关联不上的key增加随机值,让数据尽可能分散开。

水平一般,能力有限,大数据小学生一枚。文章主要用于个人学习和总结,如果能给他人带来帮助,纯属意外。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值