在ApacheFlink中是一个任务一个线程

gg58donl  于 2021-06-26  发布在  Flink
关注(0)|答案(1)|浏览(433)

我是flink的新手。据我所知,在flink中,taskmanager可以划分为多个槽,一个槽可以分配多个任务,一个任务就是一个线程。
让我们看看示例wordcount:

按照我的理解,一个任务就是一个线程,有三个任务: Source + map() , keyBy()/window()/apply() 以及 Sink . 所以每一个都有自己的线程,这意味着这个例子需要三个线程。我们可以将三个任务(三个线程)放入一个插槽中。
不过,现在我在看它的官方文件:https://ci.apache.org/projects/flink/flink-docs-stable/dev/parallel.html
flink程序由多个任务组成(转换/运算符、数据源和接收器)。一个任务被分成几个并行示例来执行,每个并行示例处理任务输入数据的一个子集。任务的并行示例数称为其并行性。
如何理解“一个任务被分解成几个并行的执行示例”?“多个并行执行示例”是否意味着多线程?所以一个任务可以是多线程?
我现在很困惑。

iibxawm4

iibxawm41#

措辞不完善;任务在不同的语境中有时有不同的含义。
在您的示例中,您显示了一个包含3个任务的程序的逻辑表示。因为它是一个逻辑表示,所以它不能被执行,因此考虑线程没有任何意义。
当执行这样的逻辑表示时,它被转换成物理表示。在最简单的情况下,为每个逻辑任务生成n个物理任务,其中n是该任务的并行度。为了让它更明显,我们开始调用物理任务子任务。
可以粗略地说,每个子任务对应一个线程。但是,在操作符链的情况下,子任务被合并到一个链中并执行到一个线程中。
因此在您的示例中,线程的数量是由三个任务的并行度决定的。所以你得到n1+n2+n3线程。如果所有任务都具有相同的并行度,则为3*n。

相关问题