You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:53:14