提高shuffle操作的并行度
使用场景
如果必须要对数据倾斜迎难而上,那么建议优先使用该方案,因为这是处理数据倾斜最简单的一种。
实现思路
在对RDD执行shuffle算子时,给shuffle算子传入一个参数,比如reduceByKey(1000),该参数就设置了这个shuffle算子执行时shuffle read task的数量,
对于SparkSQL中的shuffle类语句,比如groupby、join等,需要设置一个参数,即spark.sql.shuffle.partitions该参数代表shuffle read task的并行度,该值默认是200,对于很多场景而言都有点过小。
实现原理
增加shuffle read task的数量,可以让原本分配给一个task的多个key分配给多个task,从而让每个task处理比原来更少的数据。
比如:如果原本有5个key,每个key对应10条数据,这5个key都是分配给一个task,那么这个task则需要处理50条数据,而增加了shuffle read task之后,每个task就分配到一个key,即每个task就处理10条数据,那么自然每个task的执行时间都会变短了。
优点
实现起来比较简单,可以有效缓解和减轻数据倾斜的影响。
缺点
只是缓解了数据倾斜而已,没有彻底根除问题,效果有限。
实践经验