Install Kafka & Flink
Date Posted:2025-12-22
Creator:Rex(Prosperlytics)
实验记录:安装Kafka & Flink
Kafka & Flink 在本地分布式实验室中的部署踩坑总结
本文记录我在 Prosperlytics Distributed Lab 中,基于 Ubuntu Server + Docker 部署 Kafka 与 Flink 的全过程,以及过程中遇到的真实问题与解决思路。
目标不是“最快跑起来”,而是理解每一个组件为什么会失败。
一、实验背景(Background)
在完成以下基础设施之后:
- ✅ 多台 mini PC(5-node)
- ✅ Ubuntu Server 安装
- ✅ hostname / hosts / SSH key 登录
- ✅ Docker & containerd 正常运行
- ✅ Java 17(OpenJDK)统一版本
我开始进入 streaming layer 的搭建阶段,也就是:
- Kafka:事件流(event stream)中枢
- Flink:实时计算 / 状态处理引擎
目标是后续构建一个 quant + risk streaming system,而不是单机脚本。
二、Kafka 安装阶段的主要坑
❌ 坑 1:Kafka 看起来“跑着”,但其实不可用
现象:
docker ps显示 Kafka container 是Up- 但 producer / consumer 连接异常
原因:
- Kafka 高度依赖 ZooKeeper
- ZooKeeper 未启动 / 端口未暴露 → Kafka 表面存活,实则 unusable
KEY:
Kafka 是一个 distributed coordination system,不是单点服务。
解决方式:
- 明确启动顺序:
ZooKeeper → Kafka - 显式暴露端口(2181 / 9092)
- 使用官方 Confluent image,避免隐式配置
❌ 坑 2:端口映射正确,但宿主机无法访问
现象:
- Kafka container 内可以监听
- MacBook / 其他 node 访问失败
原因:
advertised.listeners配置错误- Kafka 向客户端“广播”了 container 内部地址(如 172.x)
解决思路:
- 明确 Kafka 的 对外身份
- 对外地址 ≠ container 内 IP
- 初期实验:直接使用宿主机 IP + 9092
三、Flink 安装阶段的核心踩坑(重点)
Flink 是这次最“教育人”的部分 😅
❌ 坑 3:JobManager 能启动,但 TaskManager 一直消失
现象:
flink-jobmanager正常运行- Web UI(8081)可访问
flink-taskmanagercontainer 反复 crash / disappear
日志关键信息:
Could not register at the ResourceManager
Connection refused
RegistrationTimeoutException
❌ 坑 4:TaskManager 连不上 ResourceManager(6123)
根本原因(非常重要):
JobManager 和 TaskManager 不在同一个 Docker network
默认 docker run:
- JobManager 在一个 bridge network
- TaskManager 在另一个
flink-jobmanager:6123根本无法解析
这不是 Flink 的问题,是 Docker network 认知问题。
✅ 正确理解 Flink 的通信模型
Flink 不是“主从脚本”,而是:
- JobManager = ResourceManager + Dispatcher
- TaskManager 必须 主动注册
- RPC 端口(6123)是 生命线
一句话总结:
Flink 是一个分布式系统,不是一个单容器应用。
✅ 解决方案(你实际走通的路)
- 明确 JobManager container name
- TaskManager 使用同一个 Docker network
- 使用
--link/ 自定义 network(或 docker-compose)
一旦网络打通:
- TaskManager 能成功 register
- Web UI 中能看到 Task Slots
- 系统进入 healthy state
四、关于 /opt、containerd 和 Docker 的一个误区
❓ 为什么 /opt 下有 containerd?
这是一个很常见但容易误解的问题。
事实是:
- Docker 底层依赖
containerd /opt/containerd≠ Flink 安装残留- 这是 runtime infrastructure,不是业务组件
认知升级点:
Docker 本身就是一个 layered system
image / runtime / network / storage 是分开的
五、阶段性总结(What I Learned)
技术层面(Technical)
- Kafka / Flink 都是 network-first systems
docker ps≠ 服务可用- 日志(logs)比状态(status)重要
- 分布式系统 80% 的问题来自 network + identity
六、下一步计划(Next Direction)
接下来我会:
- ✅ 用 Kafka 发送 mock trading events
- ✅ Flink 消费 + stateful processing
- ✅ 引入 Python producer
- ✅ 逐步扩展到 multi-node TaskManager
留下评论