分布式运算中最常见的,最容易遇到的就是数据倾斜;
数据倾斜的现象是,当提交运行一个程序时,这个程序的大多数的Task都已经运行结束了,只有一个Task一直在运行,迟迟不能结束,导致整体的进度卡在99%或者100%,这时候就可以判定程序出现了数据倾斜的问题。
数据倾斜的原因:数据分配
数据倾斜–group by 、count(distinct)
当程序中出现group by或者count(distinct )等分组聚合的场景时,如果数据本身是倾斜的,根据Mapreduce的hash分区规则,肯定会出现数据倾斜的现象。
根本原因是因为分区规则导致的,所以可以通过以下几种方案来解决group by导致的数据倾斜问题。
方案一:开启map端聚合
hive.map.aggr=true;
通过减少shuffle数据量和Reducer阶段的执行时间,避免每个Task数据差异过大导致数据倾斜
方案二:实现随机数据分区
select * from table distribute by rand();
distribute by 用于指定底层按照哪个字段作为Key实现分区、分组等
通过rand函数随机值实现随机分区,避免数据倾斜
方案三:数据倾斜时自动负载均衡
hive.gro