为何无法在Bitnami-Spark容器中运行Spark作业?
问题排查方向
针对你遇到的Spark提交脚本报错(初始运行正常,后续出现All masters are unresponsive和Cannot call methods on a stopped SparkContext),结合你的配置给出以下排查点:
1. 修正Spark Master地址与网络连通性
- 避免使用硬编码IP(如
172.18.0.2),改用Docker Compose服务名spark-master作为Master地址,因为容器重启后IP可能变化:docker-compose exec spark-master spark-submit --master spark://spark-master:7077 mounted-data/etl_script.py - 检查Spark Master服务是否正常运行:
docker-compose exec spark-master ps aux | grep spark - 验证容器内部7077端口连通性:
docker-compose exec spark-master telnet spark-master 7077
2. 修复Dockerfile中的环境变量配置
当前Dockerfile用RUN export设置的变量仅在构建阶段生效,运行时无法读取。改为ENV持久化环境变量:
FROM --platform=linux/amd64 bitnami/spark:3.3.1 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt && rm requirements.txt # 改用ENV设置运行时生效的变量 ENV PACKAGES="io.delta:delta-core_2.12:2.2.0" ENV PYSPARK_SUBMIT_ARGS="--packages ${PACKAGES} pyspark-shell"
注:Spark 3.3.1兼容Delta Lake 2.2.0,而非1.0.0,建议同步升级版本
3. 排查资源耗尽问题
- 查看容器日志是否有OOM(内存不足)报错:
docker-compose logs spark-master | grep -i "out of memory" - 在docker-compose中添加资源限制,防止容器耗尽宿主机内存:
services: spark-master: ... deploy: resources: limits: memory: 2G reservations: memory: 1G
4. 检查Delta Lake配置兼容性
- 你的脚本使用
configure_spark_with_delta_pip,可能会安装与Spark版本不兼容的Delta包。建议在脚本中指定兼容版本:spark = configure_spark_with_delta_pip(builder, extra_packages=["io.delta:delta-core_2.12:2.2.0"]).getOrCreate() - 或者直接在spark-submit命令中指定依赖,绕过环境变量的问题:
spark-submit --packages io.delta:delta-core_2.12:2.2.0 --master spark://spark-master:7077 mounted-data/etl_script.py
5. 验证Spark Context生命周期管理
- 报错提示调用已停止的SparkContext,可能是前一次运行残留的上下文未清理。在脚本末尾显式停止上下文:
# 脚本执行完毕后添加 spark.stop() - 检查是否有其他进程占用Spark相关端口,导致Master无法正常响应。
6. 对比jupyter/pyspark-notebook镜像差异
- jupyter镜像默认可能使用local模式运行Spark,而你的Bitnami镜像使用standalone模式。检查两者的Spark配置差异:
# 在Bitnami容器中查看配置 docker-compose exec spark-master cat $SPARK_HOME/conf/spark-defaults.conf - 确认Bitnami镜像的Spark Master是否开启了正确的监听地址,确保容器内部和外部都能访问。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

