浅谈 Hive 数据倾斜原因及解决方案
admin
2024-03-12 21:38:44

👉👉👉 哈喽!大家好,我是【大数据的奇妙冒险】的作者 ,具有 Java 以及大数据开发经验,目前是一位大数据领域项目经理。
擅长 Java、大数据开发、项目管理等。持有 PMP 和 系统架构设计师证书,可以说是持证上岗了😀
如果有对【大数据】感兴趣的朋友,欢迎关注 公 众 号【大数据的奇妙冒险】

前言:大数据开发过程中,经常会遇到数据倾斜的问题,也是面试必问的问题。今天就来说一下数据倾斜的原因及其解决方法。


导航

    • 什么是数据倾斜
    • 造成数据倾斜的原因
    • 造成数据倾斜的主要操作
      • group by
      • join
    • 解决方法
      • group by 造成的数据倾斜
      • join 造成的数据倾斜
        • 有大量 null 值 join 的情况
        • 大小表 join 的情况
        • key 值倾斜的情况

什么是数据倾斜

数据倾斜是指在分布式处理中,数据分布不均匀,有部分数据比较集中。

数据倾斜会使得在处理过程中,某个节点的处理效率过低,甚至造成内存溢出。

比如有1亿条性别数据,其中性别为男的数据有9000w,性别为女的有1000w,处理的时候分到不同节点就容易造成数据倾斜。

造成数据倾斜的原因

  • 业务本身造成的;

  • key 分布不均;

  • 某些 SQL 操作容易造成数据倾斜;

造成数据倾斜的主要操作

group by

维度过少,某些值比较大,分发到不同 Reduce 操作,造成某个 Reduce 数据倾斜;

join

某些 Key 值比较多,或者 Key 值存在大量 null,join 后分发到某个 Reduce 的数据量过大。

解决方法

group by 造成的数据倾斜

分组中有部分数据比较多,造成数据倾斜。
这种情况可以通过调参解决:

set hive.map.aggr=true;
set hive.groupby.skewindata=true;

hive.map.aggr=true 表示开启 map 端聚合;

hive.groupby.skewindata=true
会使得生成两个 MR job,第一个 job 会将数据随机分发到不同的 Reduce 进行预聚合,可以达到负载均衡的效果;

然后将其结果按照 group by 的 key 分发进行处理,保证相同的 key 被分到同一个 Reduce 中,完成聚合。

如果不调整参数,也可按此思路去优化 SQL,比如将 key 值加盐后聚合,再根据原 key 值聚合。

join 造成的数据倾斜

有大量 null 值 join 的情况

  • 1、数据中有大量 null 值,可以过滤掉;

  • 2、使用随机值赋值。

大小表 join 的情况

当大小表 join 的情况,若大表数据分布不均匀的时候会造成 Reduce 的时候数据倾斜,

为此可以使用 Map Join 将小表加载到内存中,并在 map 阶段完成 join 操作。

例子:
select /*+MAPJOIN(b)*/ a.a1,a.a2,b.b2 from tablea a JOIN tableb b ON a.a1=b.b1

key 值倾斜的情况

可以将倾斜的 key 过滤出来单独 join,则会分散到多个 task 进行 join 操作,最后再进行 union 即可。


以上便是关于 hive 数据倾斜的主要内容了,如果对你有帮助,麻烦点个小小的赞。

点赞关注不迷路,转载请注明出处 —— 大数据的奇妙冒险

相关内容

热门资讯

宝丰能源股价涨5%,汇安基金旗... 1月14日,宝丰能源涨5%,截至发稿,报20.36元/股,成交4.63亿元,换手率0.32%,总市值...
宝丰能源股价涨5%,国投瑞银基... 1月14日,宝丰能源涨5%,截至发稿,报20.36元/股,成交4.65亿元,换手率0.32%,总市值...
宝丰能源股价涨5%,南方基金旗... 1月14日,宝丰能源涨5%,截至发稿,报20.36元/股,成交4.65亿元,换手率0.32%,总市值...
潍柴重机股价跌5.49%,华夏... 1月14日,潍柴重机跌5.49%,截至发稿,报31.49元/股,成交3.41亿元,换手率4.63%,...
潍柴重机股价跌5.49%,长城... 1月14日,潍柴重机跌5.49%,截至发稿,报31.49元/股,成交3.42亿元,换手率4.64%,...