数据倾斜处理方法

发布时间:2026/10/28 2:02:34
数据倾斜处理方法

目录

hive预处理

过滤少数key

提高shuffle并行度

两阶段聚合

reduce join -> map join

拆分倾斜key join

扩容RDD join

hive预处理

条件:

  1. hive表导致的
  2. 业务需要频繁使用该表进行操作

方法:提前使用Hive ETL对数据进行预聚合

将数据倾斜的操作提前到了hive ETL中,避免spark发生数据倾斜,适合一次操作,多次使用

过滤少数key

条件:

  1. 少数key导致,且可以不需要该key

方法:直接过滤掉该key

过滤导致数据倾斜的key,避免数据倾斜。

提高shuffle并行度

条件:

  1. 是task少导致多个key打到一个task上,造成的数据倾斜

方法:提高shuffle read task的数量,让每个task处理更少的key

如果是一个key数据量过多导致的,则不能用该方法。

两阶段聚合

条件:

  1. 用于聚合类算子

方法:1. 先给key打上n以内的随机数 2. 对数据进行聚合操作(聚部聚和)3. 去掉前缀,再进行全局聚合

聚合类shuffle导致的数据倾斜,不能用于join类

reduce join -> map join

条件:

  1. 其中一个表是小表

方法:将小表广播

广播小表,避免shuffle操作

拆分倾斜key join

条件:

  1. 导致数据倾斜的key数量较少
  2. 一个表数据倾斜,另一个表正常

方法:将这些数据量大的key筛选出来,拆分成新的RDD;给每个key打n以内的随机数前缀;join的另一个表,筛选出这几个key,打上前缀,扩充成n份;将这两个RDD进行join,就打散到多个task进行join了;另外两个普通RDD进行照常join;最后将两个join结果合并起来(union)

扩容RDD join

条件:

  1. 同上,并且是多个key

方法:同上,但是是不进行拆分的,因为导致的key太多;对所有数据进行加盐打散操作

该方法对内存的要求高,因为是对另一个RDD整个进行扩充