马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、数据倾斜概念
数据倾斜(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;
- # map端聚合所使用的hash table占用map task堆内存的最大比例,超过即flush
- set hive.aggr.hash.force.flush.memory.threshold=0.9;
复制代码 (2)Skew-GroupBy优化
Skew-GroupBy优化的原理是:开启两个串行执行的MR任务,第一个MR任务按照随机数举行分区发往reduce端,在reduce完成部分聚合;第二个MR任务再根据分组字段举行分区,完成最终聚合。相关参数如下:
- # 启用分组聚合数据倾斜优化
- set hive.groupby.skewindata=true;
复制代码 三、Hive办理数据倾斜——Join导致
若不开启任何优化,hive举行join操作默认是common join算法,即map端负责读取数据,到场join的两张表根据关联字段举行分区,发往reduce端,那么相同的key会发往一个reduce端(两张表),在reduce端完成最后的join操作。(类似mapreduce中的reduce join)
假如分组字段key分布不匀称,那么某个reduce端需要处理的数据就远远凌驾其他reduce,造成数据倾斜,发生性能瓶颈。对于join导致的数据倾斜题目,有如下办理思路:
(1)map join
map join的条件是大表join小表的场景,利用map join则没有reduce阶段,则没有shuffle,自然不会产生数据倾斜题目。map join算法由两个只有map阶段的MR任务完成一个join操作, 其本质是第一个MR任务读取满足条件的小表的数据,将其制作为hashtable,并上传至分布式缓存中,第二个MR任务会先从缓存中读取小表数据,并缓存在本身的map task缓存中,扫描大表举行join操作。涉及到的参数如下:
- # 开启map join自动转换
- set hive.auto.convert.join=true;
- # 不开启无条件转mapjoin的小表的判定标准
- set hive.mapjoin.smalltable.filesize=250000;
- # 开启无条件转mapjoin
- set hive.auto.convert.join.noconditionaltask=true;
- # 开启无条件转mapjoin的小表判定标准
- set hive.auto.convert.join.noconditionaltask.size=10000000;
复制代码 (2)skew join
map join需要一个表是小表,对于大表join大表的场景不适用(思索此时用bucket map join 和SMB map join有效吗?)。
skew join的原理是,为倾斜的大key单独启动一个map join任务举行计算(实际生产环境中的join大多是一对多,大key是多的一方作为大表,别的一边是一,可以作为小表),其余key举行正常的common join。
- # 开启skew join 优化
- set hive.optimize.skewjoin=true;
- # 当某个key的数量超过100000,则认为存在数据分布不均,触发skew join(即触发阈值)
- set hive.skew.join.key=100000;
复制代码 (3)利用 Salting(加盐技术)
加盐 是指在某些字段上加上随机值,打散倾斜的键。例如,当某个字段的值分布不匀称时,可以在字段值上加上一些随机数,让数据在 Shuffle 过程中更加匀称地分配到不同的 Reducer 上。
如以下,假设id是倾斜字段,则通过concat随机数,将id字段同一个值打散为两个值,原本相同的key会被发往两个reduce端举行join操作。
- select
- *
- from(
- select --打散操作
- concat(id,'_',cast(rand()*2 as int)) id,
- value
- from A
- )ta
- join(
- select --扩容操作
- concat(id,'_',0) id,
- value
- from B
- union all
- select
- concat(id,'_',1) id,
- value
- from B
- )tb
- on ta.id=tb.id;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |