在flink中,像“flatmap”、“map”之类的操作符被称为task,如果我将flatmap的parallelism设置为30,那么这个任务有30个子任务。
现在,如果我只有一个插槽,它会在一个插槽中产生多个线程吗?还是每个插槽只有一个线程?
flink会在这个插槽中创建30个线程,还是使用类似于线程池的东西?
编辑:
以上不是一个合适的例子。
假设在作业中我有操作符flatmap和map,它们都有并行度1,我只有一个插槽,这个插槽会创建两个线程吗(链接已禁用)
在flink中,像“flatmap”、“map”之类的操作符被称为task,如果我将flatmap的parallelism设置为30,那么这个任务有30个子任务。
现在,如果我只有一个插槽,它会在一个插槽中产生多个线程吗?还是每个插槽只有一个线程?
flink会在这个插槽中创建30个线程,还是使用类似于线程池的东西?
以上不是一个合适的例子。
假设在作业中我有操作符flatmap和map,它们都有并行度1,我只有一个插槽,这个插槽会创建两个线程吗(链接已禁用)
1条答案
按热度按时间u3r8eeie1#
每个任务槽可以包含多个子任务(运算符)。但是,一个插槽不能包含同一个操作符的多个示例,也就是说,它可以共享不同的示例
flatMap
,map
等子任务,但不是一对相同的子任务map
s。链式运算符在同一个线程中执行,而不是在不同的线程中执行。所以,在你的例子中,如果你指定
flatMap
至30
,flink将需要有30个插槽来分配这些子任务。它无法将所有30个子任务分配到单个插槽。但是,您可以通过指定每个任务管理器的插槽数
taskmanager.numberOfTaskSlots
. 因此,您可以获得一个只有1个vcore的容器,但为其分配30个插槽,从而获得30个单独的线程并将子任务分配给单个vcore。请参阅flink官方文档的任务槽和资源部分。
更新:正如@davidanderson所说,
一个任务槽可能有许多线程。每个子任务都在单独的jvm线程中执行,任务槽基本上就是一个线程池。