一、数据倾斜概念
数据倾斜(Data Skew)问题是指在分布式计算系统中,由于某些数据分布不均匀,导致某些节点处理的数据量远远大于其他节点,从而引起性能瓶颈、计算延迟甚至计算失败的现象。
在Hive中,在处理分组聚合(Group By)或者多表连接(Join)问题时,如果分组字段或者连接字段存在分布不均匀,即某个key或者某些key的数量远超其他key,就会造成在按key分区发往reduce端的时候,某个reduce接收了大量的数据,所需的处理时间也会远超其他reduce,成为整个任务的瓶颈。
二、Hive解决数据倾斜——分组聚合导致
常规情况下,hive的分组聚合是由map端读取数据,按照分组字段key进行分区,并通过shuffle发往reduce端进行聚合。如果分组字段分布不均匀,就会导致大量相同的key发往同一个reduce,从而导致数据倾斜问题。由分组聚合导致的数据倾斜问题,主要有以下两种解决思路(原理都是先完成部分聚合再发往reduce端):
(1)map端聚合(Map-Side聚合)
开启map端聚合后,数据先在每个并行的map端分别进行部分聚合,聚合之后再发往reduce端,此时可以在很大程度上解决数据倾斜问题。主要涉及以下四个参数:
# 开启map端聚合
set hive.map.aggr=true;
# 判断是否使用map端聚合,因为可能字段的差异性很大,聚合后数据不会减少多少,即map端聚合意义不大。 具体来说,对源表前100000条数据进行聚合检测,如果聚合后的数据条数/100000 < 0.5则使用map端聚合。
set hive.map.aggr.hash.min.reduction=0.5;
set hive.groupby.mapaggr.checkinterval=100000;
#
Hive解决数据倾斜的方法

最低0.47元/天 解锁文章
4252

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



