Hive中数据倾斜Join操作优化

本文探讨了Hive中数据倾斜导致的Join操作问题,尤其是当99%的记录集中在某个倾斜键上时,导致部分reducer执行缓慢。解决方案包括拆分查询、调整Hive配置以及优化倾斜Join操作。通过生成随机数分配倾斜数据到多个reducer,创建UDF以及创建视图等方法,可以显著改善查询性能。
摘要由CSDN通过智能技术生成

例子

加入系统中有两种表
表1:事实表

  1. 包含100万条记录
  2. 有一个CODE_ID字段,数据类型是Integer,范围是1-10K
  3. 99万条记录中CODE_ID字段值是250
  4. 1万条记录的CODE_ID值是平均分配到剩余的值中

表2:维度表
5. 包含1万条记录
6. 表太大而不能进行Map端的join操作
7. 有CODE_ID字段,是唯一值

可以看到在事实表中有99%记录在CODE_ID字段上是倾斜的。

Hive数据倾斜问题

select
 *
from
 FACT f
 left join DIMENSION d
   on f.CODE_ID = d.CODE_ID

执行以上SQL会发现,99%的reduce阶段执行非常快,而剩余1%的reducer会映射到倾斜数据(CODE_ID=250),这个reducer执行会非常慢。
类似下面的执行输出:

2017-12-16 21:30:14,527 Map 1: 6283/6283 Map 4: 9/9 Reducer 2: 577(+1)/578
....
2017-12-16 21:34:47,360 Map 1: 6283/6283 Map 4: 9/9 Reducer 2: 577(+1)/578
2017-12-16 21:34:50,397 Map 1: 6283/6283 Map 4: 9/9 Reducer 2: 577(+1)/578
....
2017-12-16 21:35:51,145 Map 1: 6283/6283 Map 4: 9/9 Reducer 2: 577(+1)/578
2017-12-16 21:35:51,554 Map 1: 6283/6283 Map 4: 9/9 Reducer 2: 578/578

类似这种的reducer问题叫做数据倾斜Join操作问题

解决方法

目前有几种解决方法

拆分查询

可拆分一个查询到多个查询,单独运行这些查询。例如,我们可以写两个查询避免数据倾斜
查询1:

#排除数据倾斜数据
select
  *
from
  FACT f
  left join DIMENSION d
    on f.CODE_ID = d.CODE_ID
where
  f.CODE_ID <> 250

查询2:

# 仅仅查询倾斜数据
sel
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值