大数据学习(15)-数据倾斜

&&大数据学习&&

系列专栏: 哲学语录: 承认自己的无知,乃是开启智慧的大门
如果觉得博主的文章还不错的话,请点赞+收藏⭐️+留言支持一下博>主哦


数据倾斜概述

数据倾斜问题,通常是指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发往同一个Reduce,进而导致该Reduce所需的时间远超其他Reduce,成为整个任务的瓶颈。

Hive中的数据倾斜常出现在分组聚合和join操作的场景中,下面分别介绍在上述两种场景下的优化思路。

 分组聚合导致的数据倾斜

优化说明

之前提到过,Hive中未经优化的分组聚合,是通过一个MapReduce Job实现的。Map端负责读取数据,并按照分组字段分区,通过Shuffle,将数据发往Reduce端,各组数据在Reduce端完成最终的聚合运算。

如果group by分组字段的值分布不均,就可能导致大量相同的key进入同一Reduce,从而导致数据倾斜问题。

由分组聚合导致的数据倾斜问题,有以下两种解决思路:

1Map-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;

2Skew-GroupBy优化

Skew-GroupBy的原理是启动两个MR任务,第一个MR按照随机数分区,将数据分散发送到Reduce,完成部分聚合,第二个MR按照分组字段分区,完成最终聚合。

相关参数如下:

--启用分组聚合数据倾斜优化

set hive.groupby.skewindata=true;

1Map-Side聚合

设置如下参数

--启用map-side聚合

set hive.map.aggr=true;

--关闭skew-groupby

set hive.groupby.skewindata=false;

(2)Skew-GroupBy优化

设置如下参数

--启用skew-groupby

set 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次数可能很多,也就不可以解决数据倾斜问题,这样第二种方法的优势就出来了。

你可能感兴趣的:(大数据,学习,hive)