根据Flink文档,存在两个维度来影响任务可用的资源量:
- 任务管理器的数量
- 任务管理器可用的任务插槽数
每个TaskManager有一个插槽意味着每个任务组都在一个单独的JVM中运行(例如,可以在一个独立的容器中启动(。拥有多个插槽意味着更多的子任务共享同一JVM。同一JVM中的任务共享TCP连接(通过多路复用(和检测信号消息它们还可以共享数据集和数据结构,从而减少每个任务的开销
使用文档中的这一行,似乎总是错误地增加每个任务管理器的任务槽数,而不是增加任务管理器数。
一个具体的场景:如果我在Kubernetes中部署了一个作业集群(假设有16个CPU核心可用(,并且有一个由一个源+一个映射函数+一个汇点组成的管道,那么我默认拥有一个带有16个插槽的TaskManager。
这是最佳配置吗?有没有一种情况下,我更喜欢16个TaskManager,每个都有一个插槽,或者TaskManager和插槽的组合可以利用所有16个CPU核心?
没有最优配置,因为一般情况下无法定义"最优"。每个TM只有一个插槽的配置提供了良好的隔离,而且通常更容易管理和推理。
如果运行多个作业,多插槽配置可能会将不同作业的任务安排到一个TM。如果TM出现故障,例如,因为两个任务中的任何一个消耗了太多内存,两个作业都将重新启动。另一方面,每个TM运行一个插槽可能会留下更多未使用的内存。如果每个集群只运行一个作业,那么每个TM可以运行多个插槽。