Spark数据倾斜解决方案二:提高Reducer端的并行度

前言

提高reducer端并行度操作起来并不难,这里把它当做一个单独的方案,原因是:现在的spark程序,我们一般刚开始主要考虑的业务,对于代码写的是否忽略的性能的问题很多时候可能并不是项目一开始要考虑的事情。只有当代码经过测试的时候,可能才发现由于数据倾斜造成某个task运行缓慢,此时,我们不会一上来就做一些比如给key加随机前缀和扩容处理,而往往第一步想到的就是提高Reducer端并行度。

适用场景

如果我们必须要对数据倾斜迎难而上,那么建议优先使用这种方案,因为这是处理数据倾斜最简单的一种方案。

实现思路

在对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,即每个ta

你可能感兴趣的:(Spark最佳实战与性能优化,spark,大数据,数据倾斜,数据倾斜解决方案,并行度)