在运行Spark sql作业时,我们经常会看到一个参数就是spark.sql.shuffle.partitions,而且默认值是200.这个参数到底影响了什么呢?今天咱们就梳理一下。
1、Spark Sql中的Shuffle partitions
在Spark中的Shuffle partitions是与普通的分区不同的。我们可以通过两个例子来验证
普通分区
val df = sparkSession.read.csv("src/main/resources/sales.csv") println(df.rdd.partitions.length)
执行代码后我们会发现这是2个文件,也就是对应有两个分区
println(df.groupBy("_c0").count().rdd.partitions.length)
这个打印结果是多少呢?
打印结果是200,也就是分区从2增长到了200;
原因就是dataframe中shuffle partitions的数量是由spark.sql.shuffle.partitions控制,默认值就是200.
2、spark.sql.shuffle.partitions 是否需要调整大小?
shuffle partitions的数量默认为200,是否需要调整呢?注意这个参数是需要进行调整的而且Spark中并不会根据数据量进行动态的设置,需要我们基于数据规模进行调整。
> 小数据集,200数值显然有些大,大部分时间都花费在调度,任务执行本身花费时间较小
> 大数据集,200数值有些小,不能充分利用集群资源
合理的数值应该是多少呢?
建议:建议设置初始分区的1.5-2倍之间
更改方式
sparkSession.conf.set("spark.sql.shuffle.partitions",100) println(df.groupBy("_c0").count().rdd.partitions.length)