Docker 集群运行 Spark 的一些记录

发布时间:2026/6/4 15:17:09

Docker 集群运行 Spark 的一些记录 Docker 集群运行 Spark 的一些记录docker spark 的镜像怎么获取通过打开 Docker hub 搜索 Spark 就可以看相对应版本的镜像了根据那里的提示进行 pull 就可以了docker compose 示例version:3services:master:image:spark:4.1.2-scala2.13-java17-python3-ubuntuhostname:mastercommand:/opt/spark/bin/spark-class org.apache.spark.deploy.master.Masterports:-8080:8080# Master WEBUI-7077:7077# 任务提交端口-6066:6066# REST API 端口-50070:50070environment:-SPARK_MASTER_WEBUI_PORT8080#- SPARK_MASTER_HOST10.12.43.198 #新增监听全地址networks:spark-net:worker:image:spark:4.1.2-scala2.13-java17-python3-ubuntucommand:/opt/spark/bin/spark-class org.apache.spark.deploy.worker.Worker spark://master:7077environment:-SPARK_WORKER_CORES1-SPARK_WORKER_MEMORY2gdepends_on:-masternetworks:spark-net:networks:spark-net:运行命令示例dockercompose-fxxx.yml down# 停止运行dockercompose-fxxx.yml up-d# 运行dockercompose-fxxx.yml scaleworker3# 开启从节点拉取镜像以后在 Docker 集群Windows 的环境配置下载 Jdk 这个 Jdk 的大版本要与拉取的镜像一致地址下载 Windows 的 Spark 这个直接根据镜像的版本然后去官网下载就好了。下载 Hadoop 这个直接也可以在官方的 Github 库进行下载 下载对应版本就好了上面下载好了以后就要设置 HOME 环境变量然后再把 bin 加入 PathWindows python 下载这个 python 的版本要与容器内的一样建议下载 miniconda然后通过命令conda create –name xxx python3.10.12通过下面的方法查看容器内的 python 版本Windows 进行通讯的相关设置集群好了以后并且设置好了上面的环境那么就可以和集群进行通讯了。Windows Python 测试代码frompysparkimportSparkConffrompyspark.sqlimportSparkSession confSparkConf()# 改成你的Ubuntu机器IPconf.setMaster(spark://localhost:7077)conf.setAppName(DockerTest).set(spark.driver.host,10.12.43.198).set(spark.driver.bindAddress,0.0.0.0)# 新增设置driver host为localhostsparkSparkSession.builder.config(confconf).getOrCreate()rddspark.sparkContext.parallelize([spark,docker])print(rdd.count())spark.stop()1️⃣ 背景Driver 和 Executor 的关系在 Spark 集群模式下Driver你的 Python 程序所在进程负责生成 DAG、调度任务。Executor运行在 Worker 上的进程负责实际执行任务。Master管理资源和任务分配。执行一个简单操作rdd.count()流程Python Driver | | DAG Task 描述 v Spark Master | | 分配 Executor v Worker 1 / Worker 2 / ... | | 向 Driver 汇报任务完成情况 v Python Driver关键点Executor 必须能访问 Driver 的 IP 和端口才能汇报任务状态。2️⃣ 原来的问题你之前写的是conf.setMaster(spark://127.0.0.1:7077)Python Driver 在 Windows 上运行Master Worker 在 Docker 容器里Driver 的 IP 对容器来说是127.0.0.1容器里的 localhost所以 Worker 试图连接 Driver 时Docker Worker - 127.0.0.1:随机端口127.0.0.1 指的是 Worker 容器自己不是 Windows 主机的 IP。结果就会出现WARN TaskSchedulerImpl: Initial job has not accepted any resources也就是 Executor 无法与 Driver 建立通信任务永远卡住。3️⃣ 解决方法设置 Driver 的可访问地址你新加的两行.set(spark.driver.host,10.12.43.198)# Windows 主机真实 IP可被 Docker 访问.set(spark.driver.bindAddress,0.0.0.0)# Driver 绑定所有网卡解释spark.driver.bindAddress 0.0.0.0Driver 绑定在所有可用网络接口而不是默认的 localhost这样 Docker 容器才能从外部访问这个 Driverspark.driver.host 10.12.43.198告诉 Spark Master/Executor “如果要联系 Driver请使用这个 IP”对 Docker 容器来说这是可以访问 Windows 主机的真实 IP这样Docker Worker - 10.12.43.198:随机端口Executor 就能正常连接 Driver任务就可以执行了。4️⃣ 总结之前卡住的根本原因Executor 无法找到 Driver修改spark.driver.hostspark.driver.bindAddress之后Driver 对外可见Worker 可以正常注册并执行任务资源充足任务自然就能运行小建议在 Docker 内运行 Spark 的情况下如果 Driver 也在 Docker 网络里会更简单不用管 host IP。你现在的设置适合Driver 在宿主机Executor 在 Docker的场景。如果你愿意我可以画一张图把Driver Master Executor 的网络访问关系画出来这样以后遇到同类问题就一眼就能看懂。你想让我画吗

相关新闻