Multithreading 在ApacheFlink中,一个任务是一个线程吗

Multithreading 在ApacheFlink中,一个任务是一个线程吗,multithreading,parallel-processing,apache-flink,flink-streaming,Multithreading,Parallel Processing,Apache Flink,Flink Streaming,我是弗林克的新手。据我所知,在Flink中,TaskManager可以划分为多个插槽,一个插槽可以分配多个任务,一个任务就是一个线程 让我们看看WordCount示例: 据我所知,一个任务就是一个线程,有三个任务:Source+map(),keyBy()/window()/apply()和Sink。所以它们每个都有自己的线程,这意味着我们需要三个线程来完成这个示例。我们可以将三个任务(三个线程)放在一个插槽中 然而,现在我正在阅读它的官方文件: Flink程序由多个任务组成(转换/运算符、,

我是弗林克的新手。据我所知,在Flink中,TaskManager可以划分为多个插槽,一个插槽可以分配多个任务,一个任务就是一个线程

让我们看看WordCount示例:

据我所知,一个任务就是一个线程,有三个任务:
Source+map()
keyBy()/window()/apply()
Sink
。所以它们每个都有自己的线程,这意味着我们需要三个线程来完成这个示例。我们可以将三个任务(三个线程)放在一个插槽中

然而,现在我正在阅读它的官方文件:

Flink程序由多个任务组成(转换/运算符、, 数据源和接收器)将一项任务拆分为多个并行任务 执行的实例,每个并行实例处理一个子集 任务的输入数据。任务的并行实例数 这就是所谓的平行性

如何理解“一个任务被分解为多个并行执行实例”?“多个并行执行实例”是否意味着多线程?那么一个任务可以是多线程


我现在很困惑。

措辞不完美;任务有时在不同的上下文中有不同的含义

在您的示例中,您将显示包含3个任务的程序的逻辑表示。由于它是一种逻辑表示,因此无法执行,因此考虑线程没有任何意义

当执行这样的逻辑表示时,它会被转换为物理表示。在最简单的情况下,每个逻辑任务生成N个物理任务,其中N是该任务的并行度。为了让它更明显,我们开始调用物理任务子任务

可以粗略地说,每个子任务对应一个线程。但是,在操作符链的情况下,子任务合并到一个链并执行到一个线程中


因此,在您的示例中,线程的数量由三个任务的并行度决定。这样就得到了N1+N2+N3个线程。如果所有任务具有相同的并行度,则为3*N。

谢谢。现在清楚多了。还有一个问题:在本例中,如果我为子任务
Source+map()
设置了两个并行度,这是否意味着两个线程将为相同的逻辑表示子任务
Source+map()
?如果是这样的话,这是否意味着我可能会获得更好的性能,并且我不需要担心多线程问题,例如争用条件?例如,如果我设置了两个度,表示三个字即将出现,
aaa
bbb
aaa
。因此,一个线程可能持有
aaa
bbb
,而另一个线程持有最后一个
aaa
。我的意思是,第一个线程将标记
aaa:1bbb:1
,第二个线程将标记
aaa:1
,然后,Flink将合并两个结果并标记
aaa:2bbb:1
。我的理解正确吗?如果任务合并到操作符链中,它们只由一个物理子任务和线程处理。因此
Source+map()。你用文字做的例子是正确的;合并是通过keyBy进行的,它将相等的键(本例中为单词)混洗到同一个子任务=线程。