在運行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)