我对Flink中任务和子任务的概念感到困惑。
如果我把一个操作符(比如MapFunction(的并行性设置为6,那么,总共会有6个MapFunction实例,我认为每个实例都是subtask
,我不确定我是否理解正确(也许我们应该说每个实例是task
(
从Flink源代码的观点来看,任务是一个线程可运行的对象,我想问,当一个线程运行这个可运行对象时,会运行什么,这是否意味着每个运算符实例(或由于运算符链而与其他运算符实例(形成一个任务?
不幸的是,这有点模糊,而且是历史上增长的。如果您有6个MapFunction
,那么将根据代码库生成6个任务,每个任务都运行一个操作符实例(或者更具体地说是一个操作符示例链(。
然而,从概念上讲,这仍然只是一项任务(=一系列运算符(。此级别上的子任务将对应于操作员实例链。
因此,您可以在代码中看到它应该被命名为子任务。文档通常试图更加精确,但在查看代码时会产生不匹配。
另请参阅flink中作业、任务和子任务之间的区别。
当您创建一个flink作业时,它实际上是一个逻辑查询执行计划(QEP(,每个操作符都是一个任务。当这个QEP部署在集群中时,它被称为物理QEP,根据您设置的并行度X,它将为每个操作员有X个子任务。每个子任务实例都将在一个线程中运行,因此它是并行的。
只有当两个子任务之间的流程是简单的正向时,才有可能实现操作员链。例如,后面跟着过滤器的映射可以被链接。但是后面跟着reducer的keyBy在一个称为shuffle的阶段使用哈希分布,在这种情况下,它们不能被链接。
因此,如果操作符被链接,则不同阶段的子任务被链接并由同一线程运行。但是子任务并行实例在不同的线程中运行。