Apache flink Flink中任务和子任务的真正区别是什么

Apache flink Flink中任务和子任务的真正区别是什么,apache-flink,Apache Flink,我对Flink中任务和子任务的概念感到困惑 如果我把一个操作符(比如MapFunction)的parallism设置为6,那么总共会有6个MapFunction实例,我认为每个实例都是一个子任务,我不确定我是否理解正确(也许我们应该说每个实例都是一个任务) 从Flink源代码的观点来看,Task是一个线程可运行的对象,我想问,当线程运行这个可运行的对象时,会运行什么,这是否意味着每个操作符实例(或者由于操作符链而与其他操作符实例一起)都构成了一个任务?不幸的是,这有点模糊,而且是历史性的增长。如

我对Flink中任务和子任务的概念感到困惑

如果我把一个操作符(比如MapFunction)的parallism设置为6,那么总共会有6个MapFunction实例,我认为每个实例都是一个子任务,我不确定我是否理解正确(也许我们应该说每个实例都是一个任务)


从Flink源代码的观点来看,Task是一个线程可运行的对象,我想问,当线程运行这个可运行的对象时,会运行什么,这是否意味着每个操作符实例(或者由于操作符链而与其他操作符实例一起)都构成了一个任务?

不幸的是,这有点模糊,而且是历史性的增长。如果您有6个
MapFunction
s,那么将根据代码库生成6个任务,每个任务运行一个操作符实例(或者更具体地说是一个操作符实例链)

然而,从概念上讲,这仍然只是一项任务(=一系列操作符)。此级别上的子任务将对应于一系列操作符实例

因此,您可以看到它应该在代码中被命名为子任务。文档通常试图更加精确,但在查看代码时会产生不匹配


另请参见。

创建flink作业时,它实际上是一个逻辑查询执行计划(QEP),每个运算符都是一个任务。当这个QEP部署在集群中时,它被称为物理QEP,并且根据您设置的并行度X,它将为每个操作员提供X个子任务。每个子任务实例将在一个线程中运行,因此它是并行的

只有当两个子任务之间的流是简单的正向时,运算符链才是可能的。例如,可以链接后跟过滤器的贴图。但是一个keyBy后跟一个reducer在一个被称为shuffle的阶段使用散列分布,在这种情况下,它们不能被链接


因此,如果操作符被链接,那么不同阶段的子任务被链接并由同一线程运行。但是子任务并行实例在不同的线程中运行。

谢谢@arvid heise。我想我已经明白你的答案了。从概念(不考虑运算符链)来看,子任务=一个运算符实例,任务=所有运算符实例(即,任务=运算符的子任务)是的,如果忽略运算符链,则任务=执行级别上的运算符。