有什么理由更喜欢增加任务管理器的数量而不是每个任务管理器的任务槽?
What are reasons to prefer increasing the number of task managers instead of task slots per task manager?
根据the Flink documentation,有两个维度会影响任务可用的资源量:
- 任务管理员数量
- 任务管理器可用的任务槽数。
Having one slot per TaskManager means each task group runs in a separate JVM (which can be started in a separate container, for example). Having multiple slots means more subtasks share the same JVM. Tasks in the same JVM share TCP connections (via multiplexing) and heartbeat messages. They may also share data sets and data structures, thus reducing the per-task overhead.
对于文档中的这一行,您似乎总是错误地选择增加每个任务管理器的任务槽数量,而不是增加任务管理器的数量。
一个具体的场景:如果我在 Kubernetes 中部署了一个作业集群(假设有 16 个 CPU 核心可用)和一个由一个源 + 一个映射函数 + 一个接收器组成的管道,那么我会默认到拥有一个 TaskManager,该 TaskManager 有 16 个可用插槽。
这是最佳配置吗?有没有一种情况我更喜欢 16 个 TaskManager 每个都有一个插槽,或者可能是 TaskManager 和插槽的组合可以利用所有 16 CPU 个内核?
没有最优配置,因为"optimal"不能笼统定义。每个 TM 具有单个插槽的配置提供了良好的隔离,并且通常更易于管理和推理。
如果您 运行 多个作业,多槽配置可能会将不同作业的任务安排到一个 TM。如果 TM 宕机,例如,因为两个任务中的任何一个消耗了太多内存,两个作业都将重新启动。另一方面,运行每个 TM 一个插槽可能会留下更多未使用的内存。如果每个集群只 运行 一个作业,每个 TM 多个插槽可能没问题。
根据the Flink documentation,有两个维度会影响任务可用的资源量:
- 任务管理员数量
- 任务管理器可用的任务槽数。
Having one slot per TaskManager means each task group runs in a separate JVM (which can be started in a separate container, for example). Having multiple slots means more subtasks share the same JVM. Tasks in the same JVM share TCP connections (via multiplexing) and heartbeat messages. They may also share data sets and data structures, thus reducing the per-task overhead.
对于文档中的这一行,您似乎总是错误地选择增加每个任务管理器的任务槽数量,而不是增加任务管理器的数量。
一个具体的场景:如果我在 Kubernetes 中部署了一个作业集群(假设有 16 个 CPU 核心可用)和一个由一个源 + 一个映射函数 + 一个接收器组成的管道,那么我会默认到拥有一个 TaskManager,该 TaskManager 有 16 个可用插槽。
这是最佳配置吗?有没有一种情况我更喜欢 16 个 TaskManager 每个都有一个插槽,或者可能是 TaskManager 和插槽的组合可以利用所有 16 CPU 个内核?
没有最优配置,因为"optimal"不能笼统定义。每个 TM 具有单个插槽的配置提供了良好的隔离,并且通常更易于管理和推理。
如果您 运行 多个作业,多槽配置可能会将不同作业的任务安排到一个 TM。如果 TM 宕机,例如,因为两个任务中的任何一个消耗了太多内存,两个作业都将重新启动。另一方面,运行每个 TM 一个插槽可能会留下更多未使用的内存。如果每个集群只 运行 一个作业,每个 TM 多个插槽可能没问题。