Spark Worker接收任务但未执行问题求助(Docker Compose集群)
Spark集群任务停滞问题排查与解决
核心问题
从Worker日志里的--driver-url字段能看到,Driver的地址是spark://CoarseGrainedScheduler@example.net:55497——这里的example.net是你主机的默认hostname,但Docker容器内部没法解析这个名称,导致Worker启动的Executor连不上主机上的Spark Driver(也就是你Jupyter里的SparkSession),任务自然卡着不动。
解决办法
1. 在SparkSession里显式指定Driver地址
创建SparkSession时,加上spark.driver.host配置,用Docker能访问的主机地址,比如Docker Desktop环境下用host.docker.internal,或者直接填你的主机真实IP:
import pyspark spark = pyspark.sql.SparkSession.builder \ .master("spark://localhost:7077") \ .config("spark.driver.host", "host.docker.internal") # 替换成你的主机IP也可以 .getOrCreate() spark.range(1000 * 1000 * 1000).count()
2. 修改Docker Compose配置,添加主机映射
在Worker服务里加extra_hosts,把主机的hostname映射到真实IP,让容器能解析:
version: "3" services: spark-master: image: spark:3.5.0 entrypoint: /opt/spark/bin/spark-class org.apache.spark.deploy.master.Master ports: - 8080:8080 - 7077:7077 spark-worker: image: spark:3.5.0 depends_on: - spark-master entrypoint: /opt/spark/bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077 extra_hosts: - "example.net:192.168.1.100" # 替换成你的主机实际IP
3. (可选)修改主机hostname(仅Docker Desktop适用)
把主机hostname改成host.docker.internal,不过这种方式灵活性差,不如前两种实用。
验证
改完后重启Docker集群,重新运行Notebook代码,看Worker日志里的--driver-url是不是变成了容器能访问的地址,同时检查WebUI里的任务是否开始执行。
内容的提问来源于stack exchange,提问作者jan-seins
相关产品推荐
相关产品推荐

