首页 > 代码库 > Hive语法层面优化之一数据倾斜介绍

Hive语法层面优化之一数据倾斜介绍

数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点;

由于数据并不是平均分配的,会导致各个节点上处理的数据量是不均衡的,所以数据倾斜是无法避免的;

 

造成数据倾斜的最根本原因:key分发不均匀造成的;

 

常见的数据倾斜的症状

1)  Map阶段快,reduce阶段非常慢;

2)  某些map很快,某些map很慢;

3)  某些reduce很快,某些reduce很慢;

4)  任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成,因为其处理的数据量和其他reduce差异过大。

 

造成数据倾斜的常见原因

1)   key分布不均匀

2)  某些sql语句本身就有数据倾斜;

  a)  join时on关键字中个别值量很大(如:null值),同key会被分发到同一个reduce去执行造成某个节点数据量很大;----需要重点研究并优化的部分

  b)  count(distinct)在数据量很大的情况下,容易数据倾斜,因为count(distinct)是按照group by字段分组,再按照distinct字段排序。(group by也是按照key进行分发的,有的分发的数据量很大,有的数据量很小,导致数据倾斜的发生); ----有时无法避免

3)  数据在节点上分布不均匀(集群需要及时扩容,会经常有上线/下线节点的)----无法避免的