hive数据倾斜解决方法

Hive的过程中经常会碰到数据倾斜问题,数据倾斜基本都发生在group、join等需要数据shuffle的操作中,这些过程需要按照key值进行数据汇集处理,如果key值过于集中,在汇集过程中大部分数据汇集到一台机器上,这就会导致数据倾斜。

具体表现为:作业经常reduce完成在99%后一直卡住,最后的1%花了几个小时都没有跑完。

常见产生数据倾斜的原因:

  • 空值产生的数据倾斜
  • 不同数据类型关联产生的数据倾斜
  • 关联的key非空,但是某个key值大量重复
  • distinct、count(distinct)

1、 空值产生的数据倾斜场景:
如日志中,常会有信息丢失的问题,比如全网日志中的user_id,如果取其中的user_id和bmw_users关联,会碰到数据倾斜的问题。
解决方法1:
user_id为空的不参与关联

select * 
from log a
join bmw_users b
on a.user_id is not null
and a.user_id = b.user_id
union all
select * 
from log a
where a.user_id is null;

解决方法2 :
赋与空值分新的key值(推荐)

select * 
from logs a 
left join bmw_users b 
on case when a.user_id is null then concat(‘dp_hive’,rand() ) else a.user_id end = b.user_id;

2、 不同数据类型关联产生数据倾斜场景:
用户表中user_id字段为int,logs表中user_id字段既有string类型也有int类型。当按照user_id进行两个表的join操作时,默认的Hash操作会按照int型的id来进行分配,这样会导致所有string类型的id记录都分配到同一个reduce中。
解决方法:
把数字类型转换成字符串类型

select * 
from users a
left join logs b
on a.user_id = cast(b.user_id as string)

3、关联的key非空,但是某个key值大量重复
解决方法:
加入随机数

select a.key as key, b.pv as pv 
from(
select key 
from table1 
where dt='2018-06-18') a
left join(
select key, sum(pv) as pv 	 
from (
select key,	round(rand()*1000) as rnd, #加入随机数,增加并发度		
count(1) as pv		
from table2 
where dt='2018-06-18' group by key,rnd) tmp    
group by key) b 
on a.key = b.key

4、distinct、count(distinct)
解决方法:
用group by 去重
#distinct替换:
原始sql:

select distinct key from A;

替换后的sql:

select key from A group by key;

#单维度count(distinct)替换
原始sql:

select ship_id, count(distinct order_id) as ship_order_num			
from table A			
where dt = '2018-06-18' 
group by ship_id;

替换后的sql:

select ship_id, count(1) as ship_order_num			
from 			
(select ship_id, order_id 
from table A 
where dt = '2018-06-18' 
group by ship_id, order_id) t			
group by ship_id;	

#多维度count(distinct)替换 —每个维度单独处理后关联

Hive数据倾斜是指在Hive查询过程中,某些任务的处理时间比其他任务长得多,导致整个查询变得很慢。这通常是由于数据分布不均匀造成的。下面介绍一些常用的Hive数据倾斜解决方法: 1. 动态分区 动态分区是一种Hive优化技术,它可以将数据分布到不同的分区中,以避免数据倾斜。在动态分区中,Hive会根据查询条件自动创建分区,并将数据插入到对应的分区中。这样可以使数据分布更加均匀,减少数据倾斜的问题。 2. 桶 桶是一种将数据分布到多个文件中的技术。在Hive中,可以使用桶来将数据分布到多个文件中,以避免数据倾斜。桶的原理是先将数据按照某个字段进行哈希,然后将哈希值相同的数据插入到同一个文件中。这样可以让数据更加均匀地分布到多个文件中,减少数据倾斜的问题。 3. 调整并行度 调整并行度是指调整Hive查询的任务数,以避免数据倾斜。当某些任务的处理时间比其他任务长得多时,可以尝试将任务数增加或减少,以重新分配负载。这样可以使查询更加均衡,减少数据倾斜的问题。 4. 重构SQL 如果上述方法无法解决数据倾斜问题,可以尝试重构SQL。根据具体的查询需求,可以尝试改变查询条件或者使用其他方式查询数据。这样可以减少查询的数据量,避免数据倾斜的问题。 总之,Hive数据倾斜是一个常见的问题,但是通过一些优化技术和合理的调整,可以有效地解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值