Data Engineering Zoomcamp 实战:用 Docker Compose 搭建 Kafka 与 Spark 集群(含 JupyterLab)

发布时间:2026/11/13 19:14:40

Data Engineering Zoomcamp 实战:用 Docker Compose 搭建 Kafka 与 Spark 集群(含 JupyterLab) Data Engineering Zoomcamp 实战用 Docker Compose 搭建 Kafka 与 Spark 集群含 JupyterLab【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp本指南围绕 Data Engineering Zoomcamp 流式处理模块中的 Docker 集群部署文档完整讲解如何在本机用 Docker 构建 Spark 镜像、创建共享网络与 HDFS 命名卷、一键启动 Kafka含 ZooKeeper、Schema Registry、Control Center与 Spark 集群含 JupyterLab并掌握停止与清理的常用命令。读完本文你将能在本地复现一套供生产者/消费者实验、PySpark 分析与 Flink 作业联调使用的流式数据基础设施并理解其中每个配置项的作用。一、前置准备与整体架构本文所涉及的 Docker 编排文件位于仓库的 python/docker 目录由两套服务组成Spark 集群jupyterlab、spark-master、spark-worker-1、spark-worker-2镜像定义见 spark 子目录Kafka 生态zookeeper、broker、schema-registry、control-center以及可选组件kafka-rest编排文件见 kafka 子目录。这两个子目录下的 compose 文件都把默认网络声明为外部网络kafka-spark-network这意味着必须先创建共享网络两个集群才能互相访问例如 PySpark 流任务消费 Kafka topic。而根目录的 docker-compose.yml 则把两套服务合并进同一份编排便于一键全部启动。在流处理模块的整体教学链路中这一套 Docker 环境是运行 Python 生产者/消费者示例基于kafka-python与confluent-kafka以及 Spark 流处理代码的基础设施前提属于先起服务、再跑代码的入门步骤。二、第 1 步构建 Spark 所需镜像1. 分层镜像设计Spark 相关镜像并非单一 Dockerfile而是按职责分层的四层结构均位于 spark 目录cluster-base.Dockerfile以eclipse-temurin:17-jreJava 17 JRE为基础镜像安装 Python 3 并建立python符号链接声明共享工作区/opt/workspace为数据卷作为所有 Spark 组件的运行基座spark-base.Dockerfile基于cluster-base下载 Apache Spark 3.3.1Hadoop 3 版本压缩包并解压到/usr/bin设置SPARK_HOME、SPARK_MASTER_HOSTspark-master、SPARK_MASTER_PORT7077等环境变量spark-master.Dockerfile基于spark-base暴露 8080Web UI与 7077Master 端口以bin/spark-class org.apache.spark.deploy.master.Master启动 Master 进程spark-worker.Dockerfile基于spark-base暴露 8081Worker Web UI以bin/spark-class org.apache.spark.deploy.worker.Worker spark://${SPARK_MASTER_HOST}:${SPARK_MASTER_PORT}启动 Worker 并注册到 Master。此外jupyterlab.Dockerfile直接基于cluster-base通过 pip 安装pyspark3.3.1与jupyterlab3.6.1启动时以无 token 方式在 8888 端口打开 JupyterLab工作目录即共享卷/opt/workspace。2. 执行构建文档给出的构建命令如下# Build Spark Images ./build.sh在 docker 目录 下执行./build.sh脚本会按依赖顺序依次构建cluster-base、spark-base、spark-master、spark-worker与jupyterlab等镜像。由于 Spark 3.3.1 二进制包约数百 MB首次构建需要下载耗时取决于网络状况。三、第 2 步创建 Docker 网络与卷Spark 与 Kafka 两个 compose 文件均引用外部网络kafka-spark-network因此必须在启动服务前手动创建# Create Network docker network create kafka-spark-network # Create Volume docker volume create --namehadoop-distributed-file-system网络kafka-spark-network让 Kafka 与 Spark 容器处于同一自定义桥接网络容器间通过服务名如broker:29092、spark-master:7077直接通信无需暴露到宿主机卷名为hadoop-distributed-file-system的本地数据卷供 JupyterLab 与各 Spark 节点共享/opt/workspace在 spark/docker-compose.yml 中通过shared-workspace卷别名映射到该名称实现跨容器共享代码与数据。四、第 3 步启动全部服务在 docker 目录同时包含 kafka 与 spark 子目录下执行# Start Docker-Compose docker compose up -d-d表示后台运行。若使用根目录合并版 docker-compose.yml一次即可拉起全部 8 个容器。1. Kafka 侧服务基于 Confluent 7.2.0服务镜像暴露端口说明zookeeperconfluentinc/cp-zookeeper:7.2.02181协调服务ZOOKEEPER_TICK_TIME2000brokerconfluentinc/cp-kafka:7.2.09092Kafka BrokerKAFKA_BROKER_ID1schema-registryconfluentinc/cp-schema-registry:7.2.08081Avro 等 schema 管理供confluent-kafka示例使用control-centercp-enterprise-control-center:7.2.09021Kafka 可视化监控与运维界面kafka-restconfluentinc/cp-kafka-rest:7.2.08082Kafka REST 代理仅 kafka 子目录 compose 中包含2. Kafka Listener 配置解读双 compose 中的 broker 均配置了双 Listener但监听器命名方式不同kafka 子目录版本PLAINTEXT / PLAINTEXT_HOSTKAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://broker:9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT根目录合并版LISTENER_BOB / LISTENER_FREDKAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_BOB:PLAINTEXT,LISTENER_FRED:PLAINTEXT KAFKA_LISTENERS: LISTENER_BOB://broker:29092,LISTENER_FRED://broker:9092 KAFKA_ADVERTISED_LISTENERS: LISTENER_BOB://broker:29092,LISTENER_FRED://localhost:9092 KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_BOB两种写法的核心思想一致区分容器内通信地址与宿主机访问地址。LISTENER_BOB或PLAINTEXT监听broker:29092供容器内部其他服务、Broker 间通信、Schema Registry使用LISTENER_FRED或PLAINTEXT_HOST监听broker:9092并对外广告为localhost:9092供宿主机上运行的生产者/消费者连接。在 Docker 场景中若ADVERTISED_LISTENERS配置错误会出现容器内可连接、宿主机连不上或反之的典型故障。其他关键参数KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1、KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1单 Broker 环境下必须设为 1否则内部 topic 副本数要求无法满足KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0消费组加入后立即触发再均衡便于快速实验KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1单节点事务日志最小 ISR 为 1。3. Spark 侧服务服务镜像暴露端口说明jupyterlabjupyterlab8888JupyterLab 交互式分析环境工作目录为共享卷spark-masterspark-master8080Web UI、7077Master 端口集群 MasterSPARK_LOCAL_IPspark-masterspark-worker-1spark-worker8083→8081Worker 1SPARK_WORKER_CORES1、SPARK_WORKER_MEMORY4gspark-worker-2spark-worker8082→8081根目录版、8084→8081spark 子目录版Worker 2配置同 Worker 1需要说明的是各 compose 文件在 Worker 端口映射上有细微差异根目录合并版将spark-worker-2映射为8082:8081而 spark 子目录版 映射为8084:8081。两个 Worker 均depends_on: spark-master确保 Master 先启动。4. 启动后的访问入口Spark Master Web UIhttp://localhost:8080Spark Worker Web UIhttp://localhost:8083、http://localhost:8082或 8084视所用 compose 文件而定JupyterLabhttp://localhost:8888无 tokenKafka Control Centerhttp://localhost:9021Schema Registryhttp://localhost:8081Kafka RESThttp://localhost:8082若启动 kafka-rest五、第 4 步停止服务# Stop Docker-Compose在 docker 目录下执行 docker compose downdocker compose down会停止并移除该 compose 文件定义的所有容器与默认网络但不会删除名为hadoop-distributed-file-system的数据卷因此再次docker compose up -d时 JupyterLab 与 Spark 节点的共享工作区数据仍然保留。六、第 5 步常用运维与清理命令# 删除所有容器含未运行状态的 docker rm -f $(docker ps -a -q) # 删除所有卷 docker volume rm $(docker volume ls -q)这两条命令是文档给出的暴力清理手段前者强制删除宿主机上全部容器后者删除全部 Docker 卷。由于会无差别清除所有数据建议仅在环境彻底报废、准备从零重建时使用日常实验用docker compose down即可。七、与后续流处理实验的衔接环境就绪后即可继续仓库中 Python 流处理示例 的学习路径JSON 示例json_example 使用kafka-python库实现生产者与消费者通过python3 producer.py/python3 consumer.py运行Avro 示例avro_example 使用confluent-kafka库并配合 Schema Registry8081 端口管理 schemaSpark 流处理在 JupyterLab 中提交 PySpark 作业通过spark://spark-master:7077连接集群并可消费 Kafka topic 做实时聚合。Kafka 的localhost:9092宿主机视角与broker:29092容器内视角两个地址正是后续所有生产者/消费者代码配置bootstrap.servers时需要区分的关键点。八、常见问题排查宿主机无法连接 Kafka确认ADVERTISED_LISTENERS中对外监听器广告的是localhost:9092而非broker:9092容器无法互相访问确认kafka-spark-network网络已提前创建且两个 compose 文件的networks.default.name一致并声明为external: trueSpark Worker 未注册到 Master检查depends_on顺序、SPARK_MASTER_HOST是否指向spark-master以及 Worker 的SPARK_WORKER_CORES/SPARK_WORKER_MEMORY是否超出本机资源首次构建失败spark-base需从 Apache 归档站下载 Spark 3.3.1网络受限时可提前下载并调整 spark-base.Dockerfile 中的下载逻辑。九、参考资料与延伸阅读本模块完整目录https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp如需克隆仓库使用该地址git clone仓库内相关文件docker 目录 README本文档原始出处根目录合并版 docker-compose.ymlkafka 子目录 docker-compose.ymlspark 子目录 docker-compose.ymlspark 分层 DockerfilePython 流处理模块 README【免费下载链接】data-engineering-zoomcampData Engineering Zoomcamp is a free 9-week course on building production-ready data pipelines. Join the course here 项目地址: https://gitcode.com/GitHub_Trending/da/data-engineering-zoomcamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/12 17:12:33

蜜罐技术解析与Hfish开源蜜罐实战部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 18:58:38

gpt-image-2 技术解析与工程实践:从 API 接入到提示词调优

1. 为什么 gpt-image-2 值得单独整理一份资源清单 这两年 AI 绘图模型迭代速度快到让人有点追不过来,但 gpt-image-2 发布之后,我明显感觉到它和上一代产品在“可用性”上的差距拉开了。以前我们讨论图像模型,核心关注点是“画得像不像、美不…

2026/11/13 19:11:49

大同高压电工证考什么千万别踩坑 初学者怎么避开报名陷阱

大同高压电工证考什么千万别踩坑 初学者怎么避开报名陷阱 不知道去哪报名怕被中介坑?大同高压电工证考什么,这是很多新手第一个想到的问题。别以为这只是个考试,背后藏着的坑多得让你防不胜防。我认识一个朋友,花了几千块报名,结果考试内容完全没讲过,…

2026/11/13 19:11:49

瑞金电工证考试时间报名入口与办理流程

电工证考试时间怎么算?学历不高怕报不上名?听真实经历怎么说 你是不是也担心自己学历不高,考电工证会不会被拒?其实很多人都有这个顾虑,特别是像我这样从技校毕业的,当时也纠结了好一阵子。后来我发现, 瑞金电工证考试时间…

2026/11/13 19:11:49

西峡考电工证在哪里,学历不高也能报名,全国通用!

西峡考电工证在哪里,学历不高也能报名,全国通用! 你是不是也担心自己学历不高,怕报不了电工证?其实不用慌,西峡考电工证在哪里,关键不是学历,而是你是否真正掌握了电工操作的技能和知识。电工证是全国通用的,考下来以后找工作、换岗、提升待遇都有用…

2026/11/13 19:11:49

电工证提交材料是什么 30天拿证怎么避坑

电工证提交材料是什么 30天拿证怎么避坑 怕考不过白交培训费?别急,先搞懂电工证提交材料是什么,再看多久拿证才靠谱! 作为一名在郑州做工程类工作的应届生,我太清楚了,电工证不是可有可无的“装饰品”,而是真正能让你在职场里“升职加薪”的硬通货…

2026/11/13 19:11:49

全南哪里考电工证好点内部消息告诉你怎么选

全南哪里考电工证好点内部消息告诉你怎么选 你是不是正在为找工作发愁?特种作业证成了你能不能上岗的关键,尤其是电工证,几乎是很多行业的入门门槛。而你在全南,听说 全南哪里考电工证好点…

2026/11/13 19:06:48

达濠年审电工证怎么考?电子证书怎么拿?找工作必看攻略

达濠年审电工证怎么考?电子证书怎么拿?找工作必看攻略 你是不是正为找不到电工相关的工作发愁?是不是看到招聘要求里写着“必须持有特种作业操作证”?别急,本文直接告诉你: 达濠年审电工证 怎么考、怎么拿电子证书,让你轻松应对岗位需求。…

2026/11/12 20:35:13

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/13 0:01:06

办上海高压电工证良心建议:别被中介坑了,自己看这篇就够了

办上海高压电工证良心建议:别被中介坑了,自己看这篇就够了 你是不是也像我一样,第一次听说“高压电工证”这个名词,就感觉一头雾水?其实很多人都跟我一样,不知道去哪报名、怕被中介坑,结果花了冤枉钱还考不上。今天我就从一个在商丘培训过的学员角度,…

2026/11/13 0:01:06

黎里考电工证在哪里值不值得考

黎里考电工证在哪里值不值得考 之前考的证在外省能不能转过来?这是很多在外地工作、准备回老家发展的朋友最关心的问题。特别是在黎里地区,很多从事电力相关工作的朋友,都面临这样一个难题: 外省的电工证能否在本地使用?值不值得考?…

2026/11/13 0:01:06

毕节哪里考电工证 怎么报名学历不高也能上手

毕节哪里考电工证 怎么报名学历不高也能上手 你是不是也和我一样,学历不高,想着考个电工证,但又担心自己条件不够,怕报不上名?其实不然,只要符合条件,学历不高也能考电工证。今天就来聊聊【毕节哪里考电工证】这个问题,还有怎么报名,让你一步到位不…

2026/11/12 22:10:13

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑