Hive表关联查询,产生数据倾斜的原因及解决方案

文章讨论了Hive中由于数据分布不均导致的reduce负载不平衡问题,提出了通过调整Hive参数如hive.map.aggr和hive.groupby.skewindata来缓解倾斜。此外,还建议通过优化SQL语句,比如选择合适的驱动表、使用mapjoin处理小表以及对特定场景的countdistinct操作进行优化来进一步解决倾斜。
摘要由CSDN通过智能技术生成

倾斜原因
map输出数据按照key的hash分配到reduce中,由于key分布不均匀,业务数据本身的特性,建表时考虑不周等原因会造成reduce上的数据量差异过大

  1. key分布不匀
  2. 业务数据本身的特性
  3. 建表时考虑不周
  4. 某些sql语句本身就有数据倾斜

解决方案

1.参数调节:
hive.map.aggr=true
hive.groupby.skewindata=ture

有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR JOB。第一个MR JOB中,Map的输出结果结合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key被分布到同一个Reduce中),最后完成最终的聚合操作。
2.SQL语句调节

  1. 选用join key分布最均匀的表作为驱动表,做好列裁剪和filter操作,以达到两表做join的时候,数据量相对变小的效果。
  2. 大小表join:使用map join让小的维度表(1000条以下的记录条数)先进内存,在map端完成reduce
  3. 大表join大表:把空值的key变成一个字符串加上随机数,把倾斜的数据分布到不同的reduce上,由于null值关联不上没处理后并不影响最终效果
  4. count distinct大量相同的特殊值:count distinct时,将值为空的情况单独处理,如果时计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将空值单独处理,再和其他计算结果进行union。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值