我已经设置了一个 3 节点集群,它非常均匀地分配任务(步骤?作业?),直到最近的集群都分配给了一台机器。
拓扑(我们仍然使用这个术语来表示 flink 吗?):
kafka (3 topics on different feeds) -> flatmap -> union -> map
这个设置有什么东西会告诉集群管理器把所有东西都放在一台机器上吗?
另外 - 图像中的“未设置”值是什么?我错过了一些步骤?还是一些待实现的 UI 功能?
我已经设置了一个 3 节点集群,它非常均匀地分配任务(步骤?作业?),直到最近的集群都分配给了一台机器。
拓扑(我们仍然使用这个术语来表示 flink 吗?):
kafka (3 topics on different feeds) -> flatmap -> union -> map
这个设置有什么东西会告诉集群管理器把所有东西都放在一台机器上吗?
另外 - 图像中的“未设置”值是什么?我错过了一些步骤?还是一些待实现的 UI 功能?
实际上,Flink 将您的作业安排在单个 TaskManager 上是有目的的。为了理解它,让我快速解释一下 Flink 的资源调度算法。
首先,在 Flink 世界中,一个 slot 可以容纳多个任务(operator 的并行实例)。事实上,它可以容纳每个算子的一个并行实例。原因是 Flink 不仅以流方式执行流式作业,而且还执行批处理作业。使用流式传输方式,我的意思是 Flink 将数据流图的所有算子联机,以便中间结果可以直接流式传输到下游算子并在其中使用。默认情况下,Flink 会尝试将每个算子的一项任务合并到一个插槽中。
当 Flink 将任务调度到不同的插槽时,它会尝试将任务与其输入放在一起,以避免不必要的网络通信。对于源,托管取决于实施。例如,对于基于文件的源,Flink 尝试将本地文件输入拆分分配给不同的任务。
因此,如果我们将此应用于您的工作,那么我们会看到以下内容。您有三个具有并行性的不同源 1. 所有源都属于同一个资源共享组,因此每个算子的单个任务将部署到同一个插槽。初始插槽是从可用实例中随机选择的(实际上它取决于在TaskManager
注册的顺序JobManager
),然后被填满。假设选择的插槽在 machine 上node1
。
接下来我们有三个平面地图算子,它们的并行度为 2。在这里,每个平面地图算子的两个子任务之一可以部署到已经容纳三个源的同一个插槽。然而,第二个子任务必须放置在一个新的插槽中。当这种情况发生时,Flink 会尝试选择一个空闲槽,该槽与部署任务输入之一的槽位于同一位置(再次减少网络通信)。由于只有一个 slotnode1
被占用,因此31
仍然是空闲的,它会将每个 flatMap 算子的第二个子任务也部署到node1
.
现在同样适用于翻转窗口减少操作。Flink 尝试将窗口操作符的所有任务与其输入放在一起。由于它的所有输入都在运行node1
并且node1
有足够的空闲槽来容纳窗口操作符的 6 个子任务,因此它们将被调度到node1
. 需要注意的是,1 个窗口任务将在包含三个源和每个 flatMap 运算符的一个任务的插槽中运行。
我希望这能解释为什么 Flink 只使用单台机器的插槽来执行你的工作。
问题是您要在未键控(未分组)流上构建全局窗口,因此该窗口必须在一台机器上运行。
也许您还可以以不同的方式表达您的应用程序逻辑,以便您可以对流进行分组。
“(未设置)”部分可能是 Flink 的DataStream
API 中的一个问题,它没有设置默认的运算符名称。针对DataSet
API 实现的作业将如下所示: