在网上看到了这个说法,有一点疑惑,希望能得到解答
方案:提高shuffle操作的并行度
方案适用场景:如果我们必须要对数据倾斜迎难而上,那么建议优先使用这种方案,因为这是处理数据倾斜最简单的一种方案。
方案实现思路:在对RDD执行shuffle算子时,给shuffle算子传入一个参数,比如reduceByKey(1000),该参数就设置了这个shuffle算子执行时shuffle read task的数量。对于Spark SQL中的shuffle类语句,比如group by、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的执行时间都会变短了。具体原理如下图所示。
我的疑惑:这种方案如果是5个key,每个key对应10条数据,那么如果spark.sql.shuffle.partitions是10,那么此时相同的key会被不同的task处理吗?还是说相同的key一定会被同一个task处理,当spark.sql.shuffle.partitions参数值大于不同key的数量时,task的数量也只是不同key的个数而已,并不会达到spark.sql.shuffle.partitions的数量?