spark 数据倾斜解决方案

2019-10-16  本文已影响0人  邵红晓

产生的原因

造成影响

该作业执行非常慢,或者直接OOM

定位问题

解决问题思路

解决问题的本质办法:

  1. 预聚合,相当于hadoop map 的 Combiner,在map端进行预聚合
  2. 打散key,二次聚合

1、过滤异常数据

countByKey然后对这些 key 对应的记录进行分析:

2、业务导致的正常数据分布倾斜

提高 shuffle 并行度

自定义 Partitioner

.groupByKey(new Partitioner() {
  @Override
  public int numPartitions() {
    return 12;
  }

  @Override
  public int getPartition(Object key) {
    int id = Integer.parseInt(key.toString());
    if(id >= 9500000 && id <= 9500084 && ((id - 9500000) % 12) == 0) {
      return (id - 9500000) / 12;
    } else {
      return id % 12;
    }
  }
})

解决:使用自定义的 Partitioner 实现类代替默认的 HashPartitioner,尽量将所有不同的 Key 均匀分配到不同的 Task 中。

对源数据进行预聚合操作

拆分 join 再 union 两大表join

上一篇 下一篇

猜你喜欢

热点阅读