Flink:并行度和槽数之间有什么关系
Flink: what is the relationship between parallelism and slot nums
看来分配的槽数应该等于并行度。
并且任务管理器的数量应等于并行度/(每个 TM 的插槽)。
但是下面的应用不是这样的
拓扑图如下。
并行度设置为 140,每个 TM 一个插槽。
但是只分配了 115 个插槽。
应用程序在几分钟后抛出异常。
异常提示“无法在 300000 毫秒的超时时间内分配所有需要的插槽。所需的插槽:470,已分配的插槽:388”。
这里有几个问题。
- “所需插槽数:470”,这个数字的计算似乎与插槽份额无关。为什么?
- “slots allocated: 388”,其实我只剩下195个slots,分配的slots是115个,为什么?
- 并行度设置为140,但只分配了115个槽。为什么?
你需要检查配置parameters:slotSharingGroup,看起来每个操作员的参数(slotSharingGroup)是different.so任务需要470个槽。参数详情:https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/stream/operators/
当调度程序显示“需要的槽:470,已分配的槽:388”时,我相信这是在说调度程序需要为 470 个任务找到槽,但只成功为其中的 388 个找到槽。 470 是执行图中的任务总数:140 + 140 + 50 + 140。
现在回答你的问题:
当插槽共享完全启用时(这是默认设置),则作业需要的插槽数与具有最高并行度的任务的并行度一样多。在你的例子中是 140.
但仅仅因为一个作业 wants/needs 140 个槽位并不意味着集群能够提供那么多槽位。由于某种原因,只启动了 115 个任务管理器。可能某些资源或配额已用完。
在同事的帮助下,终于找到重点了
确实是资源用完了
虽然整体来说,还是有一些空余的记忆和核心。
但在机器看来,部分机器有一些空闲内存,但没有足够的内核。而其他机器有一些空闲内核,但没有足够的内存。
情况就像下面的table(我们的情况一个TM需要4G)。
因此,容器可以在 none 这些机器上启动。因为我们找不到内存和内核都足够的机器。
并且应用程序在 CREATING 时挂起。
关于异常中的消息(在版本 1.6.4 中抛出):“无法在 300000 毫秒的超时时间内分配所有需要的插槽。所需的插槽:470,已分配的插槽:388”。我想,考虑到数量,这里的'slot'实际上是'subtask',而不是'core'。
在1.11.0版本中,异常中的消息发生了变化,它说'Could not allocate the required slot within slot request timeout. Please make sure that the cluster has enough resources.'这个描述可能更合适。
看来分配的槽数应该等于并行度。
并且任务管理器的数量应等于并行度/(每个 TM 的插槽)。
但是下面的应用不是这样的
拓扑图如下。
并行度设置为 140,每个 TM 一个插槽。
但是只分配了 115 个插槽。
应用程序在几分钟后抛出异常。
异常提示“无法在 300000 毫秒的超时时间内分配所有需要的插槽。所需的插槽:470,已分配的插槽:388”。
这里有几个问题。
- “所需插槽数:470”,这个数字的计算似乎与插槽份额无关。为什么?
- “slots allocated: 388”,其实我只剩下195个slots,分配的slots是115个,为什么?
- 并行度设置为140,但只分配了115个槽。为什么?
你需要检查配置parameters:slotSharingGroup,看起来每个操作员的参数(slotSharingGroup)是different.so任务需要470个槽。参数详情:https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/stream/operators/
当调度程序显示“需要的槽:470,已分配的槽:388”时,我相信这是在说调度程序需要为 470 个任务找到槽,但只成功为其中的 388 个找到槽。 470 是执行图中的任务总数:140 + 140 + 50 + 140。
现在回答你的问题:
当插槽共享完全启用时(这是默认设置),则作业需要的插槽数与具有最高并行度的任务的并行度一样多。在你的例子中是 140.
但仅仅因为一个作业 wants/needs 140 个槽位并不意味着集群能够提供那么多槽位。由于某种原因,只启动了 115 个任务管理器。可能某些资源或配额已用完。
在同事的帮助下,终于找到重点了
确实是资源用完了
虽然整体来说,还是有一些空余的记忆和核心。 但在机器看来,部分机器有一些空闲内存,但没有足够的内核。而其他机器有一些空闲内核,但没有足够的内存。
情况就像下面的table(我们的情况一个TM需要4G)。
因此,容器可以在 none 这些机器上启动。因为我们找不到内存和内核都足够的机器。 并且应用程序在 CREATING 时挂起。
关于异常中的消息(在版本 1.6.4 中抛出):“无法在 300000 毫秒的超时时间内分配所有需要的插槽。所需的插槽:470,已分配的插槽:388”。我想,考虑到数量,这里的'slot'实际上是'subtask',而不是'core'。
在1.11.0版本中,异常中的消息发生了变化,它说'Could not allocate the required slot within slot request timeout. Please make sure that the cluster has enough resources.'这个描述可能更合适。