Spark 3.3.4在EKS上PySpark应用memoryOverheadFactor异常求助
调试EKS上PySpark memoryOverheadFactor异常的步骤
你遇到的问题是PySpark作为非JVM工作负载,Spark 3.3.4默认应该用0.4的memoryOverheadFactor,但实际是0.1(和JVM应用默认值一致),可以按以下步骤排查:
1. 排查配置优先级覆盖
Spark配置有多层级,高优先级配置会盖过默认值:
- 检查你
spark-submit命令里的--conf参数,有没有显式设spark.driver.memoryOverheadFactor或spark.executor.memoryOverheadFactor为0.1 - 去Driver容器里查看
/opt/spark/conf/spark-defaults.conf,搜索有没有硬编码的memoryOverheadFactor配置项 - 检查环境变量,看是否设置了
SPARK_DRIVER_MEMORY_OVERHEAD_FACTOR或SPARK_EXECUTOR_MEMORY_OVERHEAD_FACTOR,这类变量会直接覆盖默认值
2. 验证Spark对应用类型的识别
Spark 3.x会根据应用类型判断使用哪个默认值,PySpark应该触发非JVM的0.4配置,你可以:
- 提交命令时添加
--verbose参数,查看日志中是否有关于工作负载类型的判断记录,比如是否识别为Python应用 - 提交后打开Spark UI的Environment页面(默认端口4040),搜索
spark.driver.memoryOverheadFactor和spark.executor.memoryOverheadFactor,确认实际生效的配置值,同时查看应用类型标识
3. 检查EKS的Spark Operator配置(如果使用)
如果是通过Spark Operator部署应用,需排查:
- Operator的CRD配置中,
SparkApplication资源的driver或executor字段下,是否强制设置了memoryOverheadFactor=0.1 - 查看Operator的默认配置模板,是否全局覆盖了非JVM应用的默认值
4. 用极简命令测试
排除其他配置干扰,用最简化的命令提交测试:
/opt/spark/bin/spark-submit --master k8s://<你的EKS API地址> --deploy-mode client --conf spark.kubernetes.container.image=<你的Spark镜像> test.py
提交后查看容器内存请求/限制的计算逻辑,如果恢复为0.4,说明之前的--conf参数中存在冲突配置
5. 查看Spark源码逻辑(可选)
如果前面步骤都没找到问题,可直接查看Spark 3.3.4的源码逻辑:
- 找到
org.apache.spark.deploy.SparkSubmit类,查看判断工作负载类型的逻辑,确认Python应用是否被正确识别 - 查看
org.apache.spark.resource.ResourceProfile类中关于默认memoryOverheadFactor的设置逻辑,确认非JVM应用的默认值是否确实为0.4
内容的提问来源于stack exchange,提问作者niko jonas
相关产品推荐
相关产品推荐

