我已经阅读了很多关于这个问题的文档,但是我仍然被两个概念所迷惑:slot和task。
让我们看看wordcount的例子。
据我所知,每个黄色圆圈都是一个操作符,flink可以做一些优化,这意味着它可以将多个操作符合并到一个操作符链中。在这个例子中, Source
以及 map()
可以合并为如下所示:
整个流程变成三个任务: Source + map()
, KeyBy()/window()/apply()
以及 Slink
.
如果我是对的,一个插槽就是flink的taskmanager中的一个线程,所以我现在很困惑。在本例中,我们有三个任务,那么这是意味着我们必须有三个插槽(每个任务都有自己的线程),还是意味着我们必须为本例创建一个具有三个插槽的taskmanager?如果taskmanager只有一个或两个插槽怎么办?如果我们少于三个插槽,会抛出一些异常吗?
1条答案
按热度按时间pgx2nnw81#
一个插槽不是一个线程。一个插槽可以有多个线程。
一个任务可以有多个并行示例,这些示例称为子任务。每个子任务都在单独的线程中运行。
来自不同任务的多个子任务可以组合在一起并共享一个槽。这组子任务称为插槽共享组。请注意,同一任务的两个子任务(同一任务的并行示例)不能共享一个插槽。
任务管理器中的插槽数表示它可以支持的最大并行度。例如,如果您的作业对每个操作符具有一个并行性。它可以在具有一个插槽的任务管理器中运行。原因是所有子任务共享同一个槽,并且属于一个槽共享组。
让我们考虑另一个例子。假设您有一个具有一个槽位的任务管理器和一个字计数作业,除了
KeyBy()/window()/apply()
它有3个。当您提交此作业时,它将失败,因为您只有一个槽。一个子任务KeyBy()/window()/apply()
将与的子任务共享一个插槽Source + Map
以及Sink
. 但是其他两个子任务找不到槽(因为同一任务的两个子任务不能像前面提到的那样共享槽)