如何理解 Apache Flink 中的 slot 和 task

How to understand slot and task in Apache Flink

我已经阅读了很多关于这个问题的文档,但我仍然对插槽和任务这两个概念感到困惑。

让我们看一下 WordCount 的例子。

按照我的理解,每个黄色圆圈就是一个算子,Flink可以做一些优化,就是可以将多个算子合并成一个算子链。在这个例子中,Sourcemap()可以合并成如下:

整个流变为三个任务:Source + map()KeyBy()/window()/apply()Slink

如果我没看错的话,在Flink的TaskManager中一个slot就是一个线程,所以我现在很困惑。在这个例子中,我们有三个任务,那么这是否意味着我们必须有三个插槽(每个任务都有自己的线程),或者是否意味着我们必须为此示例创建一个具有三个插槽的 TaskManager?如果 TaskManager 只有一个或两个插槽怎么办?如果我们的插槽少于三个,会抛出一些异常吗?

一个插槽不是一个线程。一个插槽可以有多个线程。

一个任务可以有多个并行实例,称为子任务。每个 子任务 在一个单独的线程中 运行。

来自不同任务的多个子任务可以聚集在一起并共享一个插槽。这组子任务称为 slot-sharing group。请注意,同一任务的两个子任务(同一任务的并行实例)不能共享一个插槽。

任务管理器中的插槽数表示它可以支持的最大并行度。例如,如果您的作业对每个操作员的并行度为 1。它可以是 运行 在具有一个插槽的任务管理器中。原因是所有的子任务共享同一个slot,属于一个slot-sharing group

让我们考虑另一个例子。假设您有一个带一个槽的任务管理器,并且所有运算符的字数统计作业的并行度为 1,除了 KeyBy()/window()/apply() 有 3 个。当您提交此作业时,它将失败,因为您只有一个槽。 KeyBy()/window()/apply() 的一个子任务将与 Source + MapSink 的子任务共享一个槽。但是另外两个子任务不会找到slot(因为前面说到同一个任务的两个子任务不能共享一个slot)