数据学习(15)"/>
大数据学习(15)
&&大数据学习&&
🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞
数据倾斜概述
数据倾斜问题,通常是指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发往同一个Reduce,进而导致该Reduce所需的时间远超其他Reduce,成为整个任务的瓶颈。
Hive中的数据倾斜常出现在分组聚合和join操作的场景中,下面分别介绍在上述两种场景下的优化思路。
分组聚合导致的数据倾斜
优化说明
之前提到过,Hive中未经优化的分组聚合,是通过一个MapReduce Job实现的。Map端负责读取数据,并按照分组字段分区,通过Shuffle,将数据发往Reduce端,各组数据在Reduce端完成最终的聚合运算。
如果group by分组字段的值分布不均,就可能导致大量相同的key进入同一Reduce,从而导致数据倾斜问题。
由分组聚合导致的数据倾斜问题,有以下两种解决思路:
1)Map-Side聚合
开启Map-Side聚合后,数据会现在Map端完成部分聚合工作。这样一来即便原始数据是倾斜的,经过Map端的初步聚合后,发往Reduce的数据也就不再倾斜了。最佳状态下,Map-端聚合能完全屏蔽数据倾斜问题。
相关参数如下:
--启用map-side聚合set hive.map.aggr=true;--用于检测源表数据是否适合进行map-side聚合。检测的方法是:先对若干条数据进行map-side聚合,若聚合后的条数和聚合前的条数比值小于该值,则认为该表适合进行map-side聚合;否则,认为该表数据不适合进行map-side聚合,后续数据便不再进行map-side聚合。set hive.map.aggr.hash.min.reduction=0.5;--用于检测源表是否适合map-side聚合的条数。set hive.groupby.mapaggr.checkinterval=100000;--map-side聚合所用的hash table,占用map task堆内存的最大比例,若超出该值,则会对hash table进行一次flush。set hive.map.aggr.hash.force.flush.memory.threshold=0.9;
2)Skew-GroupBy优化
Skew-GroupBy的原理是启动两个MR任务,第一个MR按照随机数分区,将数据分散发送到Reduce,完成部分聚合,第二个MR按照分组字段分区,完成最终聚合。
相关参数如下:
--启用分组聚合数据倾斜优化set hive.groupby.skewindata=true;
(1)Map-Side聚合
设置如下参数
--启用map-side聚合set hive.map.aggr=true;--关闭skew-groupbyset hive.groupby.skewindata=false;
(2)Skew-GroupBy优化
设置如下参数
--启用skew-groupbyset hive.groupby.skewindata=true;--关闭map-side聚合set hive.map.aggr=false;
开启Skew-GroupBy优化后,可以很明显看到该sql执行在yarn上启动了两个mr任务,第一个mr打散数据,第二个mr按照打散后的数据进行分组聚合。
需要注意的是,map-side聚合一定是要比Skew-GroupBy要快的,因为Skew-GroupBy需要两个mapreduce任务,所以大多数情况下还是前者用的多,但是!如果空间不够内存不足,map-side需要维护一个哈希表,这样flush次数可能很多,也就不可以解决数据倾斜问题,这样第二种方法的优势就出来了。
更多推荐
大数据学习(15)
发布评论