当前位置:   article > 正文

Hive中查询中出现数据倾斜,如何解决?_hive查询结果带反斜

hive查询结果带反斜

一.区分成因

区分是join连接导致还是group by分组导致,可以通过查看Yarn(运行过程中) 或者 jobhistory(已经结束的程序)

二.join连接导致

    方案1

        Map Join:默认开启   比较耗内存,仅适用于小表(23.84m以下)join大表  
        Bucket Map Join:默认关闭,使用条件是分桶表,且数量是倍数关系
        SMB Join :(sorted merge bucket)使用条件是分桶表,且桶数量必须一致,插入数据的时候要排序.
        注意:两表连接首先考虑使用条件过滤,过滤后再通过Map Join,Bucket Map Join,SMB Join来解决数据倾斜, 但是这种操作是存在使用条件的, 不满足条件无法使用.

        事实表 + 低基数的维度表 进行关联: Map Join 优化
        事实表 + 高基数的维度表 进行关联: Bucket Map Join 优化
        事实表 + 事实表 进行关联: SMB Join 优化(相对使用最少, 因为条件过于苛刻, 而且对资源消耗过大, 如果资源不够, 运行效率低于原始Join方案)

    方案2

        将产生数据倾斜的key和对应的v2数据从当前mr程序中移出,单独找一个mr进行处理,处理后再与原来的union all.
        1.运营期处理方案(全自动)
        开启运行期处理倾斜的参数,并调整一个合理的阈值,交由系统来动态监测.适用于:不清楚哪个key值易倾斜时.
        2.编译器处理方案(半自动)
        建表时预计会产生倾斜的key值,在建表时提前配置好让后续程序运行时自动找一个mr程序处理,处理后再与原来的union all.
        注意:union all也是单独运行一个mr程序,默认是各个MR将结果输出 临时目录 ,再通过 union all 合并到最终目的地,开启set hive.optimize.union.remove=true让每一个MR在运行完成后,直接将结果输出到目的地即可.

三.group by分组导致

    方案1

        每个MR的combiner(规约)内部提前聚合,再到达reduce阶段进行汇总合并得出结果,从而减轻数据倾斜问题.默认开启!!!

    方案2

        针对大combiner采用负载均衡,需要运行两个mr程序时手动开启负载均衡设置(set hive.groupby.skewindata=true),在map任务完成后采用随机分发的方式,保证后面的每一个reduce拿到相等数量的数据信息更彻底解决数据倾斜问题,同时减轻数据倾斜的压力.
        建议在生产中, 优先使用第一种, 如果第一种无法解决, 尝试使用第二种解决.
        注意事项:使用负载均衡的解决group by的数据倾斜问题时,一定要注意SQL语句中不能出现多次distinct操作, 否则 HIVE直接报错
        错误信息:
        Error in semantic analysis: DISTINCT on different columns not supported with skew in data.
       比如说:
        SELECT ip, count(DISTINCT uid), count(DISTINCT uname) FROMlog GROUP BY ip   此操作就直接报错了,只能使用方案一解决数据倾斜.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/805691
推荐阅读
相关标签
  

闽ICP备14008679号