You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开启AQE的Spark Executor OOM问题咨询(Databricks Runtime迁移后)

无需关闭AQE的解决方案

1. 调整执行内存分配参数

广播Join的构建逻辑使用执行内存池,而非日志中显示的存储内存池。可以通过以下参数扩大执行内存的可用空间:

  • 提高执行+存储内存占堆内存的比例:
    spark.memory.fraction=0.7
    
    默认值为0.6,调高后会减少预留内存的占比,给执行/存储池更多资源。
  • 降低执行内存池中预留给存储的比例:
    spark.memory.storageFraction=0.3
    
    默认值为0.5,调低后执行内存池的可用空间会从50%提升到70%,更适配大广播对象的构建需求。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:04:53