数据倾斜处理方法
目录
hive预处理
过滤少数key
提高shuffle并行度
两阶段聚合
reduce join -> map join
拆分倾斜key join
扩容RDD join
hive预处理
条件:
- hive表导致的
- 业务需要频繁使用该表进行操作
方法:提前使用Hive ETL对数据进行预聚合
将数据倾斜的操作提前到了hive ETL中,避免spark发生数据倾斜,适合一次操作,多次使用
过滤少数key
条件:
- 少数key导致,且可以不需要该key
方法:直接过滤掉该key
过滤导致数据倾斜的key,避免数据倾斜。
提高shuffle并行度
条件:
- 是task少导致多个key打到一个task上,造成的数据倾斜
方法:提高shuffle read task的数量,让每个task处理更少的key
如果是一个key数据量过多导致的,则不能用该方法。
两阶段聚合
条件:
- 用于聚合类算子
方法:1. 先给key打上n以内的随机数 2. 对数据进行聚合操作(聚部聚和)3. 去掉前缀,再进行全局聚合
聚合类shuffle导致的数据倾斜,不能用于join类
reduce join -> map join
条件:
- 其中一个表是小表
方法:将小表广播
广播小表,避免shuffle操作
拆分倾斜key join
条件:
- 导致数据倾斜的key数量较少
- 一个表数据倾斜,另一个表正常
方法:将这些数据量大的key筛选出来,拆分成新的RDD;给每个key打n以内的随机数前缀;join的另一个表,筛选出这几个key,打上前缀,扩充成n份;将这两个RDD进行join,就打散到多个task进行join了;另外两个普通RDD进行照常join;最后将两个join结果合并起来(union)
扩容RDD join
条件:
- 同上,并且是多个key
方法:同上,但是是不进行拆分的,因为导致的key太多;对所有数据进行加盐打散操作
该方法对内存的要求高,因为是对另一个RDD整个进行扩充