flink - 集群不使用集群

flink - cluster not using cluster

我已经设置了一个 3 节点集群,该集群非常均匀地分配任务(步骤?作业?)直到最近的任务都分配给了一台机器。

拓扑(flink我们还用这个词吗?):

kafka (3 topics on different feeds) -> flatmap -> union -> map

这个设置是否有什么东西可以告诉集群管理器将所有东西都放在一台机器上?

此外 - 图片中的 'not set' 值是多少?我错过了一些步骤?或者一些待实现的 UI 功能?

问题是您正在未加密(未分组)流上构建 global window,因此 window 必须在一台机器上 运行。

也许您也可以用不同的方式表达您的应用程序逻辑,以便您可以对流进行分组。

“(未设置)”部分可能是 Flink DataStream API 中的一个问题,它没有设置默认运算符名称。 针对 DataSet API 实施的作业将如下所示:

其实Flink是故意把你的作业调度到一个TaskManager上的。为了理解它,我快速解释一下Flink的资源调度算法。

首先,在Flink的世界里,一个槽可以容纳多个任务(算子的并行实例)。事实上,它可以容纳每个运算符的一个并行实例。这样做的原因是 Flink 不仅以流式方式执行流式作业,而且还以批处理作业。 streaming fashion 我的意思是 Flink 将数据流图的所有运算符都联机,以便中间结果可以直接流式传输到下游运算符,在那里使用它们。默认情况下,Flink 尝试将每个运算符的一项任务组合在一个槽中。

当 Flink 将任务调度到不同的插槽时,它会尝试将任务与其输入放在一起,以避免不必要的网络通信。对于源,并置取决于实施。例如,对于基于文件的源,Flink 尝试将本地文件输入拆分分配给不同的任务。

因此,如果我们将此应用于您的工作,那么我们会看到以下内容。你有三个不同的源,并行度 1。所有源都属于同一个资源共享组,因此每个操作员的单个任务将部署到同一个槽。初始槽是从可用实例中随机选择的(实际上它取决于 TaskManagerJobManager 注册的顺序)然后填充。假设所选插槽在机器 node1.

接下来我们有三个平面图运算符,它们的并行度为 2。在这里,每个平面图运算符的两个子任务之一可以部署到已经容纳三个源的同一个槽中。然而,第二个子任务必须放在一个新的槽中。当发生这种情况时,Flink 会尝试选择一个空闲插槽,该插槽与部署任务输入之一的插槽位于同一位置(再次减少网络通信)。由于 node1 只有一个插槽被占用,因此 31 仍然空闲,它将每个 flatMap 运算符的第二个子任务也部署到 node1.

同样适用于翻滚 window reduce 操作。 Flink 尝试将 window 运算符的所有任务与其输入放在一起。由于其在 node1node1 上的所有输入 运行 都有足够的空闲槽来容纳 window 运算符的 6 个子任务,因此它们将被安排到 node1.重要的是要注意,1 window 任务将 运行 在包含每个 flatMap 运算符的三个源和一个任务的插槽中。

我希望这能解释为什么 Flink 只使用单台机器的槽来执行你的作业。