Hive办理数据倾斜

打印 上一主题 下一主题

主题 1042|帖子 1042|积分 3126

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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端,此时可以在很大程度上办理数据倾斜题目。主要涉及以下四个参数:
  1. # 开启map端聚合
  2. set hive.map.aggr=true;
  3.    
  4. # 判断是否使用map端聚合,因为可能字段的差异性很大,聚合后数据不会减少多少,即map端聚合意义不大。 具体来说,对源表前100000条数据进行聚合检测,如果聚合后的数据条数/100000 < 0.5则使用map端聚合。
  5. set hive.map.aggr.hash.min.reduction=0.5;
  6. set hive.groupby.mapaggr.checkinterval=100000;
  7. # map端聚合所使用的hash table占用map task堆内存的最大比例,超过即flush
  8. set hive.aggr.hash.force.flush.memory.threshold=0.9;
复制代码
(2)Skew-GroupBy优化

Skew-GroupBy优化的原理是:开启两个串行执行的MR任务,第一个MR任务按照随机数举行分区发往reduce端,在reduce完成部分聚合;第二个MR任务再根据分组字段举行分区,完成最终聚合。相关参数如下:
  1. # 启用分组聚合数据倾斜优化
  2. 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操作。涉及到的参数如下:
  1. # 开启map join自动转换
  2. set hive.auto.convert.join=true;
  3. # 不开启无条件转mapjoin的小表的判定标准
  4. set hive.mapjoin.smalltable.filesize=250000;
  5. # 开启无条件转mapjoin
  6. set hive.auto.convert.join.noconditionaltask=true;
  7. # 开启无条件转mapjoin的小表判定标准
  8. 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。
  1. # 开启skew join 优化
  2. set hive.optimize.skewjoin=true;
  3. # 当某个key的数量超过100000,则认为存在数据分布不均,触发skew join(即触发阈值)
  4. set hive.skew.join.key=100000;
复制代码
(3)利用 Salting(加盐技术)

        加盐 是指在某些字段上加上随机值,打散倾斜的键。例如,当某个字段的值分布不匀称时,可以在字段值上加上一些随机数,让数据在 Shuffle 过程中更加匀称地分配到不同的 Reducer 上。
        如以下,假设id是倾斜字段,则通过concat随机数,将id字段同一个值打散为两个值,原本相同的key会被发往两个reduce端举行join操作。
  1. select
  2.     *
  3. from(
  4.     select --打散操作
  5.         concat(id,'_',cast(rand()*2 as int)) id,
  6.         value
  7.     from A
  8. )ta
  9. join(
  10.     select --扩容操作
  11.         concat(id,'_',0) id,
  12.         value
  13.     from B
  14.     union all
  15.     select
  16.         concat(id,'_',1) id,
  17.         value
  18.     from B
  19. )tb
  20. on ta.id=tb.id;
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表