如何从宿主机连接到Spark容器并创建SparkSession?
问题解决:宿主机Jupyter连接Docker Spark集群报LiveListenerBus is stopped错误
问题描述
已部署在7077端口运行Spark集群的Docker容器,通过docker inspect获取了容器IP,尝试在宿主机Jupyter中创建SparkSession连接集群,无论使用容器IP还是容器名spark-master指定master地址,均报错:
An error occurred while calling o24.conf.
: java.lang.IllegalStateException: LiveListenerBus is stopped.
解决步骤
1. 确认Spark Master容器正常运行
- 进入容器检查Spark状态:
docker exec -it <spark-master容器ID/名称> bash spark-submit --version
- 访问Spark Master Web UI(默认8080端口),确认集群状态为
ALIVE:
若容器映射了8080端口,宿主机访问http://<容器IP>:8080;未映射则进入容器后访问http://localhost:8080。
2. 验证宿主机与容器的网络连通性
- 测试容器7077端口是否可达:
# 用容器IP测试 nc -zv <容器IP> 7077 # 用容器名测试的话,需确保宿主机能解析该名称(可在/etc/hosts添加映射,或使用Docker自定义网络) nc -zv spark-master 7077
- 若端口不通:检查Docker网络模式,bridge模式需确保7077端口已映射到宿主机;host模式需确认宿主机7077端口未被占用。
3. 补充SparkSession关键配置
Spark Master需要能回调宿主机的driver,因此必须指定driver的可访问地址:
from pyspark.sql import SparkSession spark = ( SparkSession .builder .appName("DockerSparkConnector") .master("spark://<容器IP>:7077") .config("spark.driver.host", "<宿主机可被容器访问的IP>") # 核心配置,必填 .config("spark.driver.port", "4040") # 可选,指定固定driver端口,需确保该端口开放 .getOrCreate() )
注:宿主机IP需是容器能路由到的地址(如同一局域网IP,而非localhost)
4. 检查Spark版本兼容性
宿主机Jupyter中的pyspark版本必须与容器内Spark版本完全一致:
- 宿主机查看版本:
spark-submit --version
- 容器内查看版本:
docker exec <spark-master容器ID/名称> spark-submit --version
版本不匹配时,需统一两者版本(如在Jupyter环境安装对应版本的pyspark)。
5. 查看Spark Master容器日志排查异常
通过容器日志定位是否有启动或运行异常:
docker logs <spark-master容器ID/名称>
若日志中出现端口占用、配置错误等信息,针对性修复。
内容的提问来源于stack exchange,提问作者anpan A
相关产品推荐
相关产品推荐

