什么是数据倾斜
在进行分布式计算时,某些节点的计算能力比较强或者需要计算的数据比较少,因此这些节点的任务早早地执行完成;然而另一些节点的计算能力较差或需要计算的数据比较多时,这些节点的任务没有执行完成。这种因为计算能力不均或数据分布不均造成数据热点(数据大量集中在某些节点)情况。
主要表现为:任务进度一直维持在90% - 99%~100%附近,通过任务监控器查看仅有少数几个Reduce子任务未完成。
产生数据倾斜的情况及原因
关键词 | 场景 | 后果 |
---|---|---|
JOIN | 表的数据量小,但key集中 | 分发到某一个或几个Reduce的数据远高于平均值 |
大表 JOIN 大表,但分桶判断字段0值或空值过多 | 空值通常由一个Reduce处理,因此非常慢 | |
Group by | group by维度过小,某值的数量过多 | 处理数量过多的某值Reduce非常耗时 |
Count Distinct | 某特殊值过多 | 处理此特殊值Reduce非常耗时 |
处理办法
1. 空值过多产生的数据倾斜
【例子】A & B表按user_id进行关联,但user_id中存在较多空值
【解决1】过滤空值行。
select *
from(
select user_id, column_namesA
from table_A) a
JOIN
(select user_id, column_namesB
from table_B) b
on a.user_id = b.user_id
and a.user_id is not null
;
【解决2】空值赋予新key值
select *
from(
select user_id , column_namesA