对 Spark 相对较新,对 PySpark 的行为感到好奇,
使用 PySpark 执行内部联接(根据执行计划:SortMergeJoin)时,启用以下参数:
spark.sql.adaptive.enabled true
spark.sql.adaptive.coalescePartitions.enabled true
spark.sql.adaptive.skewJoin.enabled true
我看到作业执行期间存在大于
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes
(默认值256 MB)的分区。
参考这个
分区大小的中位数达到 18MB。
spark.sql.adaptive.skewJoin.skewedPartitionFactor
也设置为默认值 5
然而,存在 2 个存在相当大偏差的分区:分别为 1454.9 MiB 和 791.5 MiB。
上面的参数不是应该确保这 2 个分区被分割成更小的分区以避免数据倾斜吗?
很多事情都可能导致 AQE 不应用倾斜连接优化,特别是在 Spark 的早期版本中。引用自这个答案:
“如果您手动更改分区数量,那么它将被跳过。同样,如果您使用缓存,大部分 AQE 将被跳过。在 3.3 中,当您使用配置 Spark.sql.adaptive 手动分区时,可以强制倾斜连接优化.forceOptimizeSkewedJoin。”