我可以在Flink的同一插槽中拥有一个操作员的多个子任务吗?

时间:2019-04-09 10:35:36

标签: apache-flink

几天来我一直在探索Apache Flink,并且对Task Slot的概念有些疑问。尽管有人问了几个问题,但我还是没有道理。

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

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

1)当我以并行度= 1部署我的应用程序时,所有操作员的子任务都部署在同一插槽中。但是,如果我从open()的{​​{1}}方法打印当前线程ID,则对于不同的子任务会看到不同的ID。因此,它们不是共享同一线程(即插槽吗?)。

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

谢谢您的解释!

1 个答案:

答案 0 :(得分:3)

插槽的想法是将可用资源切成较小的部分。可用的受管内存在所有插槽之间平均分配。 CPU周期和JVM堆内存未正确隔离wrt插槽。

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

Task表示单个Flink运算符或多个可链接的运算符的并行实例。链接并非总是可能或不需要的,但是如果应用链接,它将使运算符融合在一起,从而使它们由同一Task线程执行。通常这样会更高效,因为上下文切换较少,而且没有将记录移交给其他线程的机会。

为了提高资源利用率(尤其是对于Tasks,它只需要很少的资源)并简化运行Flink程序所需的插槽数量的推论,Flink支持插槽共享。插槽共享意味着可以将不同操作员的并行实例部署到同一插槽。由于此功能,Flink会创建尽可能长的不同操作员管道,并将它们部署到同一插槽。这也具有很好的效果,您可以增加生产者与他们各自的消费者在同一地点的位置。由于此功能,用户知道他们只需要提供与一个拓扑的所有运算符的最大并行度一样多的插槽即可。

但是,由于您仍然希望在所有可用的TaskExecutors上分配运算符的并行实例,因此Flink不支持将同一运算符的并行实例部署到同一插槽。如果要执行此操作,则只需将相应运算符的并行度降低为1