本地模式下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
相关产品推荐
相关产品推荐

