开启AQE的Spark Executor OOM问题咨询(Databricks Runtime迁移后)
无需关闭AQE的解决方案
1. 调整执行内存分配参数
广播Join的构建逻辑使用执行内存池,而非日志中显示的存储内存池。可以通过以下参数扩大执行内存的可用空间:
- 提高执行+存储内存占堆内存的比例:
默认值为0.6,调高后会减少预留内存的占比,给执行/存储池更多资源。spark.memory.fraction=0.7 - 降低执行内存池中预留给存储的比例:
默认值为0.5,调低后执行内存池的可用空间会从50%提升到70%,更适配大广播对象的构建需求。spark.memory.storageFraction=0.3
2. 配置AQE专属的广播阈值
高版本Databricks中,AQE有独立的广播策略控制参数spark.sql.adaptive.broadcastJoinThreshold,其优先级高于全局的spark.sql.autoBroadcastJoinThreshold。即使全局禁用了自动广播,AQE仍可能基于此参数做内存检查,导致手动指定的broadcast hint被限制。可以将其设置为与全局一致:
spark.sql.adaptive.broadcastJoinThreshold=-1
该配置会让AQE完全尊重手动指定的广播提示,不再自动调整广播策略。
3. 优化被广播表的数据量
报错显示被广播的关系大小为1.46GB,可通过预处理减少数据量,降低内存压力:
- 对被广播表提前过滤、聚合,只保留Join所需的字段和有效数据:
SELECT /*+ broadcast(filtered_small) */ l.*, filtered_small.col1, filtered_small.col2 FROM large_table l JOIN ( SELECT id, col1, col2 FROM small_table WHERE create_date >= '2024-01-01' -- 过滤无效数据 ) filtered_small ON l.id = filtered_small.id - 如果表必须全量广播,可尝试开启
spark.sql.broadcastJoin.allowLargeBroadcast(部分Databricks版本支持),允许更大的广播对象:spark.sql.broadcastJoin.allowLargeBroadcast=true
4. 关闭AQE的特定优化项
如果以上方案无效,可以单独关闭AQE中可能干扰广播构建的优化,而非关闭整个AQE:
- 关闭AQE的倾斜Join优化(部分场景下会导致广播内存计算异常):
spark.sql.adaptive.optimizeSkewedJoin.enabled=false - 关闭AQE对广播Join的动态调整:
spark.sql.adaptive.optimizeBroadcastJoin.enabled=false
内容的提问来源于stack exchange,提问作者alsetr
相关产品推荐
相关产品推荐

