我是Flink的新手。据我了解,在Flink中,一个TaskManager可以划分为多个插槽,可以为一个插槽分配多个任务,一个任务是一个线程。
让我们看一下示例WordCount:
据我了解,一个任务就是一个线程,共有三个任务:Source + map()
,keyBy()/window()/apply()
和Sink
。因此,它们每个都有自己的线程,这意味着在此示例中我们需要三个线程。我们可以将三个任务(三个线程)放在一个插槽中。
但是,我现在正在阅读其官方文档:https://ci.apache.org/projects/flink/flink-docs-stable/dev/parallel.html
Flink程序包含多个任务(转换/运算符,数据源和接收器)。 一个任务分为多个并行执行实例,每个并行实例处理一个子集任务的输入数据。任务的并行实例数被称为其并行性。
如何理解“一个任务被分成几个并行的执行实例”? “几个并行执行实例”是否意味着多线程?那么一个任务可以是多线程吗?
我现在很困惑。
措辞并不完美;任务有时在不同的上下文中具有不同的含义。
在您的示例中,您显示的是一个具有3个任务的程序的逻辑表示。由于它是逻辑表示,因此无法执行,因此对线程的思考没有任何意义。
[执行这样的逻辑表示时,它会转换为物理表示。在最简单的情况下,对于每个逻辑任务都会生成N个物理任务,其中N是该任务的并行度。为了清楚起见,我们开始将物理任务称为子任务。
您可以粗略地说每个子任务对应一个线程。但是,对于操作员链,子任务将合并为一个链并执行到一个线程中。
因此,在您的示例中,线程数由三个任务的并行度确定。这样就得到了N1 + N2 + N3个线程。如果所有任务具有相同的并行度,则为3 * N。