在 Apache Flink 中,任务槽(Task Slot) 和 槽共享组(Slot Sharing Group) 是资源管理和任务调度的关键机制。它们决定了 Flink 如何在集群中分配资源并执行任务。
一、任务槽(Task Slot)
1. 定义
Task Slot
是 TaskManager 提供的资源单位,代表一个独立的线程或资源隔离单元。
- 每个
Slot
可以运行多个 SubTask(来自不同 JobVertex),但这些 SubTask 必须属于同一个 Job,并且可以共享 Slot。
2. 配置方式
taskmanager.numberOfTaskSlots: 4
- 一个 TaskManager 可以配置多个 Slot(例如 4 个)。
- 每个 Slot 默认拥有相同的内存资源(可通过
taskmanager.memory.task.heap.size
等参数精细控制)。
3. Slot 的作用
作用 |
描述 |
资源隔离 |
Slot 是资源分配的基本单位,限制并发任务数。 |
并行度支持 |
一个 Job 的并行度不能超过 Slot 总数。 |
资源利用率 |
合理设置 Slot 数量可提升资源利用率和吞吐量。 |
二、槽共享(Slot Sharing)
1. 定义
- 槽共享(Slot Sharing) 是指多个 Operator 或 SubTask 可以运行在同一个 Slot 中。
- 这是 Flink 优化资源利用的重要机制,避免为每个 Operator 单独分配 Slot。
2. Slot Sharing Group
- 通过
slotSharingGroup()
方法将一组 Operator 分配到同一个槽共享组。
- 同一个组内的 Operator 可以共享 Slot,即可以在同一个 Slot 中执行。
示例代码:
stream.map(new MyMapper()).name("Mapper").slotSharingGroup("group1");
stream.keyBy(...).process(new MyProcessFunction()).name("Processor").slotSharingGroup("group1");
- 上述两个 Operator 属于同一个 Slot Sharing Group,Flink 将尝试将它们部署在同一个 Slot 中。
三、Slot 共享的条件
条件 |
描述 |
同一个 Job |
只有同一个 Job 的 Operators 才能共享 Slot。 |
相同 Slot Sharing Group |
Operator 必须属于同一个 Slot Sharing Group。 |
不需要网络传输 |
如果两个 Operator 之间是一对一连接(如 map → map),可以共享 Slot。 |
Keyed Stream |
Keyed Operators 可以共享 Slot,前提是它们的 key 分布一致。 |
四、Slot 分配策略
1. Slot 分配流程
- Flink Scheduler 根据 JobGraph 构建 ExecutionGraph。
- 根据 Slot Sharing Group 和并行度,将 SubTasks 分配到各个 Slot。
- 每个 Slot 包含多个连续的 Operators(SubTasks),形成 Operator Chain。
2. Slot 分配示意图
假设一个 Job 包含如下结构:
Source → Map → Filter → Sink
如果所有 Operators 都允许共享 Slot,则整个链可能被分配到一个 Slot 中。
五、资源分配与并行度关系
TaskManager 数量 |
Slot 数量/TaskManager |
最大并行度 |
2 |
4 |
8 |
3 |
2 |
6 |
1 |
8 |
8 |
注意:Job 的并行度不能超过 Slot 总数。
六、高级配置与优化建议
配置项 |
描述 |
default_slot_sharing_group |
默认 Slot Sharing Group 名称 |
slot.model.type |
设置为 SHARED 或 DEDICATED 控制是否启用共享 |
execution.checkpointing.min-pause-between-checkpoints |
避免 Checkpoint 对 Slot 使用造成影响 |
taskmanager.memory.managed.fraction |
控制 Slot 内存使用比例 |
七、总结对比表
概念 |
描述 |
是否默认启用 |
Task Slot |
TaskManager 的资源单位 |
✅ 默认启用 |
Slot Sharing |
多个 Operator 共享一个 Slot |
✅ 默认启用 |
Slot Sharing Group |
自定义分组控制共享范围 |
❌ 默认不设置 |
DEDICATED Slot |
强制 Operator 独占 Slot |
✅ 支持 |