如何理解 Apache Flink 中的 slot 和 task
How to understand slot and task in Apache Flink
我已经阅读了很多关于这个问题的文档,但我仍然对插槽和任务这两个概念感到困惑。
让我们看一下 WordCount 的例子。
按照我的理解,每个黄色圆圈就是一个算子,Flink可以做一些优化,就是可以将多个算子合并成一个算子链。在这个例子中,Source
和map()
可以合并成如下:
整个流变为三个任务: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 + Map
和 Sink
的子任务共享一个槽。但是另外两个子任务不会找到slot(因为前面说到同一个任务的两个子任务不能共享一个slot)
我已经阅读了很多关于这个问题的文档,但我仍然对插槽和任务这两个概念感到困惑。
让我们看一下 WordCount 的例子。
按照我的理解,每个黄色圆圈就是一个算子,Flink可以做一些优化,就是可以将多个算子合并成一个算子链。在这个例子中,Source
和map()
可以合并成如下:
整个流变为三个任务: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 + Map
和 Sink
的子任务共享一个槽。但是另外两个子任务不会找到slot(因为前面说到同一个任务的两个子任务不能共享一个slot)