阅读Flink教程示例,我想知道Flink如何将DAG节点分配给Flink集群中的不同任务槽。任何指针都将非常感激。
val windowCounts = text
.flatMap { w => w.split("\\s") }
.map { w => WordWithCount(w, 1) }
.keyBy("word")
.timeWindow(Time.seconds(5), Time.seconds(1))
.sum("count")
调度DAG时Flink尝试做的事情首先是尝试链接尽可能多的运算符。如果操作员有多个输入或随机播放,链条通常会断开。链将在Task
上的单个TaskManager
中执行,并且不涉及链式运算符之间的任何序列化。
在将输入DAG转换为Tasks
之后,Flink将通过将Tasks
分成子任务来并行化DAG。子任务接收并处理父Task的输入的分区。
接下来Flink将为每个子任务分配一个插槽。如果为运算符启用了插槽共享(这是默认设置),则可以将来自不同运营商的子任务调度到相同的Slot
。这不仅可以更容易地理解所需的资源,还可以提供更好的资源利用率。每个子任务由单独的线程执行。
您可以找到有关Flink的调度here的更多信息。