Spark 2.4中AQE的优先级是否高于spark.sql.shuffle.partitions
Spark AQE与spark.sql.shuffle.partitions交互逻辑及版本差异
Spark 2.4版本核心逻辑
Spark 2.4中的AQE为实验性功能,默认关闭,与spark.sql.shuffle.partitions的交互逻辑如下:
spark.sql.shuffle.partitions定义所有Shuffle阶段的初始分区数量,AQE在该版本下仅支持合并过小的相邻Shuffle分区,仅能调低分区数,完全不具备调高分区数的能力- 分区合并能力完全由
spark.sql.adaptive.coalescePartitions.enabled配置控制,仅当该配置为true时,开启的AQE才会执行分区合并逻辑,否则AQE不会对Shuffle分区数做任何调整 - 该版本AQE无倾斜数据处理、大分区自动拆分能力,若初始
spark.sql.shuffle.partitions设置过小,单分区数据量超过Executor处理上限时,AQE不会做任何干预。
Spark 3.0+版本逻辑变更
Spark 3.0开始AQE转为正式功能,默认开启,交互逻辑有核心升级:
- 保留原有小分区合并能力,仍由
spark.sql.adaptive.coalescePartitions.enabled配置控制 - 新增倾斜Shuffle分区自动拆分能力(由
spark.sql.adaptive.skewJoin.enabled配置控制),支持在初始分区数基础上拆分大分区,也就是首次支持调高Shuffle总分区数 - 非倾斜场景下,AQE依然不会主动调高分区数,
spark.sql.shuffle.partitions仍作为Shuffle分区数的基准值,AQE仅会在该基准值基础上做小分区合并或倾斜分区拆分。
问题现象的根本原因
该现象完全匹配Spark 2.4版本的AQE能力边界:
- 未显式设置
spark.sql.shuffle.partitions时,Spark默认值为200,大型作业的数据量下,单个分区承载的数据量极易超过Executor内存上限 - Spark 2.4的AQE仅支持合并小分区,不具备拆分大分区的能力,开启AQE后总分区数只会小于等于初始的200,完全无法缓解单分区数据量过大的问题,因此应用持续崩溃
- 显式调大
spark.sql.shuffle.partitions后,初始分区数足够支撑全量数据拆分,单分区数据量降至Executor可处理范围内,应用即可稳定运行。
内容的提问来源于stack exchange,提问作者safex
相关产品推荐
相关产品推荐

