Spark与Docker、Spring Boot集成初始化问题求助
问题排查与解决方案
核心原因分析
Docker容器内的Spark Worker尝试连接host.docker.internal(对应宿主机IP)的指定端口,但宿主机防火墙拦截、网络配置错误或Driver地址绑定不当,导致连接被拒绝,最终引发Executor循环启停。
具体解决步骤
1. 显式配置Spark Driver的监听地址
本地Spring Boot作为Spark Driver,必须让Docker内的Worker能直接访问到它。创建JavaSparkContext时,指定宿主机的实际局域网IP(而非localhost或127.0.0.1),同时固定Driver端口:
SparkConf conf = new SparkConf() .setAppName("YourAppName") .setMaster("spark://localhost:7077") .set("spark.driver.host", "192.168.x.x") // 替换为你的宿主机局域网IP .set("spark.driver.port", "53999"); // 日志中显示的被拒绝端口,也可自定义固定端口 JavaSparkContext sc = new JavaSparkContext(conf);
注意:不要用
host.docker.internal作为spark.driver.host,这个是Docker内部指向宿主机的别名,宿主机本身不会监听该地址的端口。
2. 开放宿主机防火墙端口
- 打开Windows Defender防火墙,创建入站规则,允许Spark Driver使用的端口(如上述的
53999,或直接开放40000-60000范围给Spark随机端口)。 - 确保防火墙未阻止Docker容器与宿主机的跨网络通信。
3. 调整Docker Compose的Spark Worker配置
在Spark Worker的环境变量中,指定宿主机IP作为Driver地址,避免容器内解析错误:
services: spark-worker-1: image: bitnami/spark:3.3.0 environment: - SPARK_MODE=worker - SPARK_MASTER_URL=spark://spark-master:7077 - SPARK_WORKER_MEMORY=1G - SPARK_WORKER_CORES=1 - SPARK_DRIVER_HOST=192.168.x.x # 与步骤1中的宿主机IP保持一致 ports: - "8081:8081" networks: - spark-network
确保所有Spark节点(Master、Worker)都在同一自定义网络(如
spark-network)内。
4. 验证网络连通性
- 进入Spark Worker容器,执行
ping 192.168.x.x(宿主机IP),确认能正常连通。 - 执行
telnet 192.168.x.x 53999,检查端口是否可访问。若telnet失败,优先排查防火墙或端口监听问题。
5. 检查Driver端口监听状态
在宿主机执行命令,确认端口被Spring Boot进程监听:
netstat -ano | findstr "53999"
若未找到对应监听记录,说明SparkConf的端口配置未生效,需检查代码中SparkConf的初始化逻辑。
内容的提问来源于stack exchange,提问作者MrStan12
相关产品推荐
相关产品推荐

