【博学谷学习记录】超强总结,用心分享|大数据之 join数据倾斜

数据倾斜问题产生

在hive中, 执行一条SQL语句, 最终会翻译为MR, MR中mapTask和reduceTask都可能存在多个, 数据倾斜主要指的是整个MR中reduce阶段有多个reduce , 每个reduce拿到的数据的条数并不均衡, 导致某一个或者某几个拿到了比其他的reduce更多的数据, 到底处理数据压力集中在某几个reduce上, 形成数据倾斜问题。

join数据倾斜的处理

在这里插入图片描述
出现倾斜的根本原因:

在reduce中,某一个, 或者某几个的分组k2对应value的数据比较多, 从而引起数据倾斜问题

  • 解决方案一:

    可以通过 map join, bucket map join 以及 SMB Map join 解决

注意:
通过map join来解决数据倾斜, 但是map join使用是存在条件的, 如果无法满足这些条件, 无法使用map join

  • 解决方案二:

    思路: 将那些产生倾斜的k2和对应value数据, 从当前这个MR移植出去, 单独找一个MR来处理即可, 处理后, 和之前MR的汇总结果即可
    关键问题: 如何找出那些存在倾斜的k2数据

    ---------运行期处理方案--------------
    思路: 在执行MR的时候, 会动态统计每一个k2的值出现的重复的数量, 当这个重复的数量达到一定阈值后, 认为当前这个k2的数据存在数据倾斜, 自动将其剔除, 交由给一个单独的MR来处理即可, 两个MR处理完成后, 将结果, 基于union all 合并在一起即可
    实操 :
    set hive.optimize.skewjoin=true;
    set hive.skewjoin.key=100000; – 此参考在实际生产环境中, 需要进行调整在合理的值
    适用于: 并不清楚那个key容易产生倾斜, 此时可以交由系统来动态检测

    ---------编译期处理方案--------------
    思路: 在创建这个表的时候,我们就可以预知到后续插入到这个表中, 那些key的值会产生倾斜, 在建表的时候, 将其提前配置设置好即可, 在后续运行的时候, 程序会自动将设置的k2的值数据单独找一个MR来进行单独的处理操作, 处理后, 再和原有MR进行union all的合并操作

      实操:
      	set hive.optimize.skewjoin.compiletime=true;
      	建表
      	CREATE TABLE list_bucket_single (key STRING, value STRING)
          -- 倾斜的字段和需要拆分的key值
          SKEWED BY (key) ON (1,5,6)
          --  为倾斜值创建子目录单独存放
          [STORED AS DIRECTORIES];
    

在实际生产环境中, 应该使用那种方式呢? 两种方式都会使用的
一般来说, 会将两个都开启, 编译期的明确在编译期将其设置好, 编译期不清楚, 通过 运行期动态捕获即可

  • union all优化方案

    说明: 不管是运行期, 还是编译期的join倾斜解决, 最终都会运行多个MR , 最终将多个MR的结果, 通过union all进行汇总, union all也是单独需要一个MR来运行的

    解决方案:
    让每一个MR在运行完成后, 直接将结果输出到目的地即可, 默认是输出到临时文件目录下, 通过union all合并到最终目的地
    set hive.optimize.union.remove=true;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值