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

本地模式下PySpark执行器内存分配规则咨询

Spark Executor内存分配逻辑解析

问题场景

  • 提交命令1:spark-submit --driver-memory 500M --executor-memory 300M spark_dataframe_example.py,实际分配Executor内存为110 MiB,与设置的300M不符
  • 提交命令2:spark-submit --driver-memory 1G --executor-memory 200M --num-executors 2 spark_dataframe_example.py,实际分配Executor内存为413.9 MiB,与设置的200M不符

核心分配逻辑

Spark Executor内存的实际分配并非仅由--executor-memory(对应配置项spark.executor.memory)单独决定,而是由内存组成结构、集群资源约束、多参数联动共同作用,具体规则如下:

1. Executor内存的组成

Executor内存分为堆内、堆外两部分,监控工具显示的实际内存通常是两者总和:

  • 堆内内存:由spark.executor.memory直接指定,用于存储RDD数据、Shuffle中间结果、用户代码对象等业务相关数据
  • 堆外内存:由spark.executor.memoryOverhead控制,默认值为max(384MB, 0.1 * spark.executor.memory),用于JVM本身的开销(如GC线程栈、直接内存、JNI调用内存等)

2. 集群调度器的资源限制

如果Spark运行在YARN、K8s这类集群管理器上,实际分配内存会受调度器的全局约束:

  • YARN模式:受yarn.nodemanager.resource.memory-mb(节点总可用内存)、yarn.scheduler.maximum-allocation-mb(单容器最大内存)限制。若spark.executor.memory + spark.executor.memoryOverhead超过单容器上限,YARN会自动将内存调整为允许的最大值;若节点剩余内存不足,则分配当前可用的最大内存。
  • Standalone模式:受节点剩余内存、spark.executor.cores配置影响,Spark会优先分配节点能提供的最大可用内存。

3. 参数优先级规则

配置参数的生效优先级从高到低为:

  • 提交命令时的命令行参数(如--executor-memory、--conf spark.executor.memoryOverhead=xxx)
  • Spark配置文件(spark-defaults.conf)中的配置项
  • Spark默认参数

对应场景的可能原因

  • 第一种情况(300M设置得到110MiB):大概率是集群节点剩余内存不足,或YARN单容器内存上限低于300M + 默认堆外内存,调度器只能分配当前可用的110MiB。
  • 第二种情况(200M设置得到413.9MiB):可能是显式配置了较大的spark.executor.memoryOverhead,或YARN调度器按节点剩余资源分配了超出预设的内存;也可能是监控工具统计的是堆内+堆外的总内存,而非仅堆内内存。

验证与调试方法

  • 查看Spark UI的Executors页面,分别核对Memory Used(堆内)和Off-Heap Memory Used(堆外),两者之和即为Executor实际占用的总内存。
  • 检查集群调度器日志(如YARN ResourceManager日志),确认是否存在内存调整的提示信息。
  • 显式指定spark.executor.memoryOverhead参数(如--conf spark.executor.memoryOverhead=100M),观察实际分配内存的变化。

内容的提问来源于stack exchange,提问作者nayak0765

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:10:11