Apache flink 在Flink中,同一插槽中是否可以有一个运算符的多个子任务?

Apache flink 在Flink中,同一插槽中是否可以有一个运算符的多个子任务?,apache-flink,Apache Flink,我已经探索ApacheFlink几天了,我对任务槽的概念有些怀疑。虽然有人问了几个问题,但有一点我不明白 我正在使用一个玩具应用程序进行测试,运行一个本地集群。我禁用了操作员链接 我从文档中知道插槽允许内存隔离,而不是CPU隔离。阅读文档时,任务槽似乎是一个Java线程 1当我以parallelism=1部署应用程序时,所有操作员的子任务都部署在同一个插槽中。但是,如果我从AbstractStreamOperator的open方法打印当前线程ID,我会看到不同子任务的不同ID。那么,它们不是共享

我已经探索ApacheFlink几天了,我对任务槽的概念有些怀疑。虽然有人问了几个问题,但有一点我不明白

我正在使用一个玩具应用程序进行测试,运行一个本地集群。我禁用了操作员链接

我从文档中知道插槽允许内存隔离,而不是CPU隔离。阅读文档时,任务槽似乎是一个Java线程

1当我以parallelism=1部署应用程序时,所有操作员的子任务都部署在同一个插槽中。但是,如果我从AbstractStreamOperator的open方法打印当前线程ID,我会看到不同子任务的不同ID。那么,它们不是共享同一个线程,即插槽吗

2如果我将并行度从1更改为3,我需要3个插槽才能正确重新部署应用程序。文档确认插槽的数量限制了我的并行性。但是为什么在同一个插槽中可以有不同运算符的子任务,而在同一个插槽中不能有相同运算符的子任务


谢谢你的解释

插槽的概念是将可用资源分成更小的部分。可用的托管内存均匀分布在所有插槽中。CPU周期和JVM堆内存不是正确隔离的wrt插槽

在每个插槽中,您可以部署一个或多个任务。Flink任务由专用线程执行。因此,如果在同一插槽中部署了多个任务,则可以在同一插槽中运行多个线程

任务表示单个Flink运算符或多个可链接运算符的并行实例。链接并不总是可能的或需要的,但如果应用,它将融合操作符,以便它们由相同的任务线程执行。这通常效率更高,因为上下文切换更少,并且没有将记录移交给不同的线程

为了提高资源利用率,特别是对于需要少量资源的任务,并使运行Flink程序需要多少插槽的推理更容易,Flink支持插槽共享。插槽共享意味着不同运营商的并行实例可以部署到同一个插槽。由于这个特性,Flink创建了尽可能长的不同操作符的管道,并将它们部署到同一个插槽中。这也有一个很好的效果,那就是你增加了生产者和他们各自的消费者的合用地。由于此功能,用户知道他们只需要提供一个拓扑的所有操作符的最大并行度所需的插槽数


但是,由于您仍然希望在所有可用的TaskExecutor中分布运算符的并行实例,Flink不支持将同一运算符的并行实例部署到同一插槽。如果您想这样做,那么您应该简单地将各个操作符的并行度降低到1。

插槽的思想是将可用资源分成更小的部分。可用的托管内存均匀分布在所有插槽中。CPU周期和JVM堆内存不是正确隔离的wrt插槽

在每个插槽中,您可以部署一个或多个任务。Flink任务由专用线程执行。因此,如果在同一插槽中部署了多个任务,则可以在同一插槽中运行多个线程

任务表示单个Flink运算符或多个可链接运算符的并行实例。链接并不总是可能的或需要的,但如果应用,它将融合操作符,以便它们由相同的任务线程执行。这通常效率更高,因为上下文切换更少,并且没有将记录移交给不同的线程

为了提高资源利用率,特别是对于需要少量资源的任务,并使运行Flink程序需要多少插槽的推理更容易,Flink支持插槽共享。插槽共享意味着不同运营商的并行实例可以部署到同一个插槽。由于这个特性,Flink创建了尽可能长的不同操作符的管道,并将它们部署到同一个插槽中。这也有一个很好的效果,那就是你增加了生产者和他们各自的消费者的合用地。由于此功能,用户知道他们只需要提供一个拓扑的所有操作符的最大并行度所需的插槽数

但是,由于您仍然希望在所有可用的TaskExecutor中分布运算符的并行实例,Flink不支持将同一运算符的并行实例部署到同一插槽。如果您想这样做,那么您应该简单地将相应操作符的并行度降低到1