天天看点

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

数据倾斜问题产生

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

join数据倾斜的处理

【博学谷学习记录】超强总结,用心分享|大数据之 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;

继续阅读