大数据数据倾斜的原因及解决办法
大数据数据倾斜的原因及解决办法
一、什么是数据倾斜
数据倾斜是指在分布式处理中,数据分布不均匀,有部分数据比较集中。数据倾斜会使得在处理过程中,某个节点的处理效率过低,甚至造成内存溢出。比如有1亿条性别数据,其中性别为男的数据有9900w,性别为女的有100w,处理的时候分到不同节点就容易造成数据倾斜。
二、造成数据倾斜的原因
(1)业务本身造成的;
(2)key 分布不均;
(3)某些 SQL 操作容易造成数据倾斜;
三、造成数据倾斜的主要操作
3.1group by
维度过少,某些值比较大,分发到不同 Reduce 操作,造成某个 Reduce 数据倾斜;
3.2join
某些 Key 值比较多,或者 Key 值存在大量 null,join 后分发到某个 Reduce 的数据量过大。
四、解决方法
4.1group 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 值聚合。
4.2join 造成的数据倾斜
4.2.1有大量 null 值 join 的情况
(1)数据中有大量 null 值,可以过滤掉;
(2)使用随机值赋值。
4.2.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 --其中b 为小表
4.3key 值倾斜的情况
可以将倾斜的 key 过滤出来单独 join,则会分散到多个 task 进行 join 操作,最后再进行 union 即可。
注:原文链接:浅谈数据倾斜的原因及解决办法 (qq.com)