Flink原理与实践 · 第三章总结
从 WordCount 出发,彻底吃透 Flink 的设计与运行原理
原文整理自《Flink原理与实践》第三章 ,作者鲁蔚征作者:AlgoCraft
发布时间:2025-08-19
一、本章定位:从"跑起来"到"跑明白"
本章回答三个灵魂拷问:
- 代码 → 作业:Flink 如何把用户写的 DataStream 程序翻译成可执行的分布式任务?
- 作业 → 运行:JobManager、TaskManager、Slot 这些角色到底在干什么?
- 运行 → 资源:并行度、算子链、Slot Sharing 如何决定任务最终落在哪台机器、哪个线程?
二、一张图看懂 Flink 数据流图
1. 逻辑视图(Logical Plan)
- 算子(Operator):Source → flatMap → keyBy → timeWindow → sum → Sink
- 数据交换策略:Forward / KeyBy / Broadcast / Rebalance
2. 物理执行图(Physical Plan)
- 并行切片 :每个算子被拆成若干 Sub-task (又称 Instance)。
- 并行度 = Sub-task 个数;可在代码、Client、WebUI 上设置。
- 示例 :并行度=2 ⇒ 每个算子产生 2 个 Sub-task,如
FlatMap[1/2]
、FlatMap[2/2]
。
三、Flink 分布式架构全景
组件 | 作用 | 备注 |
---|---|---|
Client | 把 JAR → JobGraph → 提交给集群 | CLI / REST |
Dispatcher | 为每个作业起 1 个 JobManager | 高可用可多实例 |
JobManager | 作业的"大脑" | 申请资源、生成 ExecutionGraph、故障恢复 |
ResourceManager | 管资源 | 向 YARN / K8s / Standalone 要容器 & Slot |
TaskManager | 作业的"肌肉" | 真正跑 Sub-task,向 RM 注册 Slot |
一句话:Client 提交通关,JM 指挥全局,TM 干活挣钱,RM 管钱袋子。
四、从代码到执行:四张图的演变
官方把"翻译"过程拆成 4 个阶段:
-
StreamGraph
用户代码直接映射出的 DAG,节点=算子。
-
JobGraph
优化阶段:把可以 链在一起 的算子合并成 Operator Chain(JobVertex),减少网络 shuffle。
-
ExecutionGraph
JobManager 把 JobVertex 按并行度 横向展开,形成并行实例 ExecutionVertex。
-
物理执行图
ExecutionVertex 被调度到 TaskManager 的某个 Slot 内,变成真正的线程 / Task。
五、Slot 与资源隔离
-
Slot = TaskManager 资源子集
默认 1 Slot ≈ 1 CPU core + 部分内存。
-
Slot Sharing(槽位共享)
同一个作业的所有 Sub-task 可以塞进 一个 Slot ,减少 IPC 与线程切换,提高利用率。
示例:并行度=6,但只开 2 个 Slot,也能跑满。
-
算子链 vs. Slot Sharing
- 算子链:把算子"纵向"合并进同一线程。
- Slot Sharing:把 Sub-task"横向"塞进同一 Slot。
二者叠加,最终一个 Slot 里可能跑 多条链的多个 Sub-task。
六、实战:把 WordCount 再"解剖"一次
步骤 | 关键动作 |
---|---|
设置并行度 | env.setParallelism(2) |
算子链 | Source→FlatMap 链在一起;keyBy 不能链(发生 shuffle) |
Slot Sharing | Source[1/2]、FlatMap[1/2]、Window[1/2] 共享 Slot1 |
WebUI 观察 | 可看到 5 个 Sub-task 落在 2 个 Slot 内 |
七、本章实验:亲手调优 WordCount
官方实验要求:
- 把分词逻辑从"空格"改为 正则
\\W+
,支持逗号、句号、冒号等。 - 本地模式跑通后,用 Flink CLI 提交到 Standalone 集群。
- 在 WebUI 里查看:
- 并行度、Slot 数量
- Sub-task 与 Slot 的映射关系
- 提交实验报告:代码 + 输出 + WebUI 截图。
八、小结
维度 | 关键词 |
---|---|
图模型 | StreamGraph → JobGraph → ExecutionGraph → 物理图 |
并行度 | 算子子任务数,可全局或单算子设置 |
资源 | Slot、Slot Sharing、Operator Chain |
角色 | Client / Dispatcher / JobManager / ResourceManager / TaskManager |
理解本章后,再回头看任何 Flink 程序,你都能迅速画出它的 逻辑 DAG 、估算 并行度 、预判 资源占用------真正做到"跑起来"也"跑明白"。