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

发布时间:2026/9/12 5:54:55

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/9/12 5:54:55

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

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

2026/9/12 5:49:55

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

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

2026/9/12 6:34:59

SpringBoot+Vue3全栈开发获奖作家管理系统实践

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

2026/9/12 6:34:59

Prompt as Code:工业级提示工程实践指南

我无法根据当前输入生成符合要求的博文。 原因如下: 项目标题 "awesome-gpt-image-2" 缺乏明确的技术指向、功能定义或领域背景,仅是一个命名风格(类似开源项目命名惯例),但未说明其本质是工具库&#xff…

2026/9/12 6:34:59

跨境电商精细化运营:供应链、库存与物流的核心策略

1. 跨境电商运营的现状与困境最近和几位跨境电商老友聚会,大家不约而同地提到一个现象:现在做跨境电商,流量获取已经不再是最大的难题,真正让卖家们拉开差距的,反而是那些看似不起眼的"底层运营能力"。这让我…

2026/9/12 6:29:59

仿抖音Android大作业:基于ExoPlayer和RecyclerView的短视频列表实现

简介:面向安卓课程设计与期末大作业的仿抖音APP完整项目包,包含源代码、答辩PPT、演示视频与部署说明,适合需要快速完成高质量移动端作业的初学者参考。项目功能覆盖视频播放、点赞评论等常见模块,界面美观、操作简单,…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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