分布式运算中最常见的,最容易遇到的就是数据倾斜;
数据倾斜的现象是,当提交运行一个程序时,这个程序的大多数的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.groupby.skewindata=true;
开启该参数以后,当前程序会自动通过两个MapReduce来运行
第一个MapReduce自动进行随机分布到Reducer中,每个Reducer做部分聚合操作,输出结果
第二个MapReduce将上一步聚合的结果再按照业务(group b
本文主要探讨了HIVE中遇到的数据倾斜问题,特别是在group by、count(distinct)和Join操作时的表现及解决策略。通过开启map端聚合、随机数据分区、负载均衡设置,以及调整Join操作方式如Map Join、Bucket Join和Skew Join,可以有效缓解和解决HIVE的数据倾斜问题。
订阅专栏 解锁全文
1265

被折叠的 条评论
为什么被折叠?



