例子
加入系统中有两种表
表1:事实表
- 包含100万条记录
- 有一个CODE_ID字段,数据类型是Integer,范围是1-10K
- 99万条记录中CODE_ID字段值是250
- 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

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

被折叠的 条评论
为什么被折叠?



