1.现象
数据倾斜是进行大数据计算时最经常遇到的问题之一。当我们在执行hiveql或者运行mapreduce作业时候,如果遇到一直卡在map100%,reduce99%,查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。一般就是遇到了数据倾斜的问题。数据倾斜其实是进行分布式计算的时候,某些节点的计算能力比较强或者需要计算的数据比较少,早早执行完了,某些节点计算的能力较差或者由于此节点需要计算的数据比较多,导致出现其他节点的reduce阶段任务执行完成,但是这种节点的数据处理任务还没有执行完成。
2.产生原因
1)key分布不均匀
2)业务数据本身的特性
3)建表时考虑不周
4)某些sql语句本身就有数据倾斜,如下表所示:
关键词 | 情形 | 后果 |
join | 中一个表较小,但是key集中 | 分发到某一个或几个reduce上的数据远高于平均值 |
join | 大表与大表,但是分桶的判断字段0值或空值过多 | 这些空值都由一个reduce处理,非常慢 |
group by | group by 维度过小,某值的数量过多 | 处理某值的reduce灰常耗时 |
count distinct | 某特殊值过多 | 处理此特殊值reduce耗时 |
(待完善)