Hive数据倾斜总结
发生倾斜的根本原因在于,shuffle之后,key的分布不均匀,使得大量的key集中在某个reduce节点,导致此节点过于“忙碌”,在其他节点都处理完之后,任务的结整需要等待此节点处理完,使得整个任务被此节点堵塞,要解决此问题,主要可以分为两大块:一是尽量不shuffle;二是shuffle之后,在reduce节点上的key分布尽量均匀。
倾斜探查
join key倾斜
select key, count(*) cnt
from B b
group by key
order by cnt desc;
如果某个key的cnt比较大,比如排在第1的key,cnt占了一大半,那使用这个key去join,极有可能发生数据倾斜。
像图中,排在第1的key,占据了4161w条记录,占表总记录数的一半,如果使用这个key去join,运行时肯定倾斜。
查看日志
如果发现,某个任务运行时间比较长,可以看下执行日志,如果运行时reduce阶段一直在99%,则极可能是发生了数据倾斜,如下图:
倾斜原因
-
key相同的太集中,导致倾斜
-
key的哈希结果,或分区函数的结果,导致key分布集中
解决方案
只要有shuffle,就有可能产生数据倾斜,解决数据倾斜的总体思路是:
- 能在map端处理的,不留到reduce端(当然,这不仅是解决数据倾斜的思路,这个适用所有的优化):
- 根据谓词下推规则,尽早过滤数据;
- 使用map Join
- 将key值尽量分散。