以技术洞察驱动商业进化

Prosperlytics Lab · 实验记录 003

Install Kafka & Flink Date Posted:2025-12-22Cr…

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-taskmanager container 反复 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
+

留下评论