java-flink-cluster未使用集群


0

我设置了一个3节点的集群来分发任务(步骤? job ?)直到最近一次分配到一台机器之前,都是相当均匀的。

拓扑学(我们还用这个词来形容 Flink吗?):

Kafka (3个不同提要的主题)->flatmap->union->map

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

另外-图像中的“未设置”值是什么?我错过了哪一步?还是一些要实现的UI功能?

2 答案


0

问题是,您正在一个无眼(未分组)流上构建一个全局窗口,因此该窗口必须在一台计算机上运行。

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

“(notset)”部分可能是Flink的datastreamapi中的一个问题,它没有设置默认的操作符名称。


0

实际上, Flink是故意把你的 job 安排在一个TaskManager上的。为了理解它,让我快速 explain一下Flink的资源调度算法。

首先,在Flink世界中,一个插槽可以容纳多个任务(操作符的并行实例)。实际上,它可以容纳每个操作符的一个并行实例。原因是Flink不仅以流方式执行 streaming job,而且还执行批 job。使用流式方式,我的意思是Flink使数据流图的所有操作符在线,这样中间结果就可以直接流到下游操作符,在那里它们被消费。默认情况下,Flink尝试将每个操作符的一个任务 coalesce 到一个插槽中。

当Flink将任务调度到不同的时隙时,它会尝试将任务与其输入一起定位,以避免不必要的网络通信。对于源,合用位置取决于实现。例如,对于基于文件的源,Flink尝试将 local文件输入拆分分配给不同的任务。

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

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

这同样适用于翻转窗口的reduce操作。Flink试图将窗口操作符的所有任务与其输入一起定位。由于它的所有输入都在node1上运行,并且node1有足够的空闲插槽来容纳window操作符的6个子任务,因此它们将被调度到node1。需要注意的是,一个窗口任务将在包含三个源代码和每个flatMap操作符的一个任务的插槽中运行。

我希望这能 explain为什么Flink只使用一台机器的插槽来执行你的任务。


我来回答

写文章

提问题

面试题