2、过滤少数导致倾斜的key
- 方案适用场景:如果发现导致倾斜的key就少数几个,而且对计算本身影响并不大的话,那么很适合适用这种方案,比如99%的key对应10条数据,只有一个key对应100万条数据,从而导致的数据倾斜。
- 方案实现思路:如果我们判断那少数几个数据量特别多的key,多作业的执行和计算的结果不是特别重要的话,那么干脆就直接过滤掉那少数几个key。比如在Spark SQL中使用where子句过滤掉这些key或者在Spark Core中对RDD执行filter算子操作过滤掉这些key。如果需要每次作业执行时动态判定那些key的数量最多然后在进行过滤,那么可以使用sample算子对RDD进行采样,然后计算出每个key的数量,取数据量最多的key过滤掉即可。
- 方案实现原理:将导致数据倾斜的key过滤掉之后,这些key就不会参与计算,自然就不会导致数据倾斜
3、提高shuffle操作的并行度
- 方案实现思路:在对RDD执行shuffle算子时,给shuffle传入一个参数,比如reduceByKey(1000),这个参数决定这个shuffle read task的数量,对于Spark SQL中的shuffle类语句,比如group by ,join等,需要设置一个参数,即spark.sql.shuffle.partitions,该参数代表shuffle read task的并行度,该值默认是200,对于很多场景来说有点过小。
- 方案实现原理:增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。