数据倾斜产生原因及应对之道

数据倾斜产生原因及应对之道,第1张

数据倾斜产生原因及应对之道

产生数据倾斜的根本原因是某个task处理数据过多,执行时间较长,导致整个Job执行时间长,因此解决数据倾斜的根本之道就是避免过多的数据进入同一个task,总结起来主要有以下方式:

Group By产生数据倾斜
  1. 直接增加task并行度,简单粗暴,但并不一定能正在解决问题。倾斜是由多个key组合输入一个task导致数据过多, 这种方式有效,但如果存在单个hot key数据量大则无效。

  2. 聚合,类似于Map Combine, 相当与把聚合运算提前分散到多个task, 减少最终聚合task的输入数据量

    hive中通过 set hive.map.aggr=true;

  3. 多次聚合,在hot key上加盐进行分组输入不同task进行聚合,然后再将聚合结果去掉盐值后分发到同一个task聚合,类似预聚合,减少最终task处理的数据量

    hive中通过 set hive.groupby.skewindata=true; 或者SQL中通过多次Group By维度越来越少就是这个原理

  4. 过滤掉hot key或者对hot key单独统计,比如NULL, 空字符串等也许业务上并非有效值,可过滤出单独处理

  5. 合乎业务逻辑情况下变换SQL写法,比如业务上count distinct在维度值不同情况下distinct列也不同时可优化成group by + count distinct + sum, 最终变换成多次聚合

Join产生数据倾斜

join产生数据倾斜一般是经过shuffle后hot join key集中到同一个task导致,解决方法主要有:

  1. 不经过shuffle, 比如join小表时采用broadcast hash join小表
  2. 如果检测到有倾斜的key(出现次数超过hive.skewjoin.key,默认为100,000),就会对该倾斜key启动一个MapReduce Job,做Map Join;对其他非倾斜的key启动另一个Job做Join
  3. join key分布均匀的表作为驱动表,在不需聚合的场景下此时不用对驱动表进行shuffle

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5678721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存