Hive性能调优(四)——如何解决数据倾斜问题

一.不可拆卸大文件

BZip2GzipLz4Snappy未压缩
所用时间(ms)177242448550351
压缩大小(Mb)16192833166

前面测试过数据的压缩。

Gzip不支持分割,只能一个map读取,map端会引起数据倾斜

二.处理大量相同的键

1.含有大量无意义的数据

含大量null空值,无意义数据时,聚合和表连接可能会发生数据倾斜。

  • 聚合:

先进行采样,判断哪个key值数量很大。
key值后面加上随机数

select case when user_id is null then concat('null',rand()) else user_id end from log
group by user_id;

后面还要进行去随机数处理。

  • 连接:

解决方案一(这种做法适合内连接):在计算时排除这些数据。

select * from log a join user b on a.user_id is not null and a.user_id = b.user_id;

解决方案二(这种做法适合左外连接):赋予空值新的 key 值。

select * from log a left outer join user b on
case when a.user_id is null then concat('hive',rand()) else a.user_id end = b.user_id;

2.某个key值数量远大于其他key

  • 聚合:

解决方案

先进行采样,判断哪个key值数量很大。

在聚合时,key值后面加上随机数:

select case when user_id is much then concat('much',rand()) else user_id end from log;
group by user_id;

得到结果后在进行去除随机数的处理。

  • 连接:

解决方案一(适合大小表):使用map join解决小表关联大表造成的数据倾斜问题,这个方法使用的频率很高。

解决方案二(适合大大表):可以启用两个作业,第一个作业处理没有数据倾斜的数据,第二个作业将倾斜的数据放入缓存,进行map join操作,将两个join得到的两张表进行合并。

三.参考文章

Hive学习之路 (十九)Hive的数据倾斜

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值