Flink Task Slot(任务槽)与并行度(Parallelism)的关系
在 Apache Flink 中,Task Slot(任务槽) 与 Parallelism(并行度) 是两个容易混淆但至关重要的概念。理解它们的关系对于资源规划和性能调优非常关键。
可以用一句话总结它们的关系:Task Slot 是静态的资源容量(有多少个坑位),而 Parallelism 是动态的执行需求(要同时干多少活)。
以下是详细的对比与原理解析:
1. 基本概念定义
Task Slot (任务槽)
- 定义:Task Slot 是 TaskManager(工作进程) 中的资源切片。
- 性质:静态配置。
- 作用:它表示一个 TaskManager 并发执行能力的上限。一个 TaskManager 有 3 个 Slot,意味着它将其管理的内存分成了 3 份,可以同时运行 3 个独立的任务链。
- 资源隔离:Slot 之间主要隔离内存(Managed Memory),但通常共享 CPU(在同一个 JVM 进程内)。
Parallelism (并行度)
- 定义:一个特定算子(Operator,如 Map、KeyBy、Sink)被切分为多少个 SubTask(子任务) 并行执行。
- 性质:动态配置(可以在代码中、提交任务时指定)。
- 作用:决定了任务处理数据的速度和吞吐量。并行度为 2,意味着有两个线程同时在处理这个算子的逻辑。
2. 形象的比喻
想象一个工厂(TaskManager):
- Task Slot 是工厂里的工位。如果工厂有 3 个工位,它最多只能容纳 3 条生产线同时工作。这是物理限制。
- Parallelism 是老板指派的工人数量。老板说:“这个搬砖的任务(Source)需要 2 个人做,那个砌墙的任务(Map)需要 4 个人做”。
3. 核心关系与机制
(1) 数量关系:供需平衡
为了让 Flink 任务正常运行,集群的总 Slot 数量必须大于等于任务中最大的并行度。
- 公式:
Total Slots in Cluster >= Job Max Parallelism - 注意:不是所有算子并行度之和,而是最大的那个算子的并行度(得益于 Slot Sharing,见下文)。
(2) Slot Sharing(槽位共享)—— 关键机制
这是 Flink 最独特的设计之一。默认情况下,Flink 允许来自同一个 Job 的不同 Task 的 SubTask 共享同一个 Slot。
- 为什么共享?
- 一个 Slot 可以保存整个管道(Pipeline):从 Source 到 Map 再到 Sink。
- 避免资源浪费:Source 通常计算量小,Window Aggregation 计算量大。如果独占 Slot,Source 的 Slot 会很闲,Window 的会很忙。共享后,繁忙和空闲的互补。
- 结果:
- 一个 Slot 中可能运行多个线程(Source 线程、Map 线程等)。
- 一个 Job 需要的 Slot 总数 = 该 Job 中并行度最高的那个算子的并行度。
(3) 举例说明
假设有一个 Flink Job:Source (并行度=2) -> Map (并行度=6) -> Sink (并行度=6)。
- 如果不开启 Slot Sharing(理论情况):
- 你需要 2 + 6 + 6 = 14 个 Slots。
- 开启 Slot Sharing(默认情况):
- Flink 会将 Source(1)+Map(1)+Sink(1) 放入 Slot 1。
- Source(2)+Map(2)+Sink(2) 放入 Slot 2。
- Map(3)+Sink(3) 放入 Slot 3... 以此类推。
- 最终需要的 Slot 数量:6 个(即最大并行度)。
4. 配置方式对比
| 维度 | Task Slot | Parallelism |
|---|---|---|
| 配置位置 | flink-conf.yaml |
代码算子、flink-conf.yaml、Web UI、CLI 参数 |
| 参数名 | taskmanager.numberOfTaskSlots |
parallelism.default 或 -p |
| 生效范围 | 整个 TaskManager 启动时固定 | 可以针对每个算子单独设置,也可以全局设置 |
| 调整时机 | 需重启 TaskManager | 提交任务时可变,或通过 Savepoint 重启调整 |
5. 常见问题与最佳实践
Slot 设置多少合适?
- 通常建议将
taskmanager.numberOfTaskSlots设置为 TaskManager 所在机器的 CPU 核心数(每个 Slot 分配 1 个 Core)。这能确保每个 Slot 有独立的 CPU 资源,减少上下文切换。
- 通常建议将
并行度设置多少合适?
- 取决于数据量和 Slot 总数。
- 一般建议并行度设为 Slot 总数的倍数,以确保负载均衡。
Slot 隔离了什么?
- Slot 目前主要隔离内存。CPU 是通过时间片轮转共享的,并没有严格隔离(除非使用较新的 CPU 绑定功能)。因此,如果一个 Slot 里的任务发生了死循环,可能会影响该 TM 上其他 Slot 的性能。
总结
- Task Slot 是容器,决定了集群的并发能力上限。
- Parallelism 是指令,决定了任务的实际并发执行数。
- 得益于 Slot Sharing,一个 Flink 任务所需的 Slot 数量等于其最大并行度。