考虑一个Flink集群,其中包含一些节点,每个节点都有一个多核处理器。如果我们根据内核数量和相等的内存份额配置插槽数量,Apache Flink如何在节点和空闲插槽之间分配任务?他们受到公平对待吗?
当我们根据节点上可用内核的数量配置任务槽时,有没有办法使Flink能够平等地处理插槽
例如,假设我们平均分区数据并在分区上运行相同的任务。 Flink使用来自某些节点的所有插槽,同时一些节点完全免费。具有较少CPU核心数的节点输出结果的速度比具有该过程中涉及的更多CPU核心数的节点快得多。除此之外,这个加速比率与每个节点中使用的核心数量不成比例。换句话说,如果在一个节点中占用一个核心而在另一个节点中占用两个核心,相当地将每个核心视为一个时隙,每个时隙应该在几乎相同的时间内在同一任务上输出结果,而不管哪个节点他们属于。但是,这不是这种情况。
有了这个假设,我会说节点不会被平等对待。这又产生了与可用节点数量不成比例的结果。我们不能说增加插槽数量必然会降低时间成本。
我很感激Apache Flink社区的任何评论!
答案 0 :(得分:1)
自版本> = 1.5起,Flink的默认策略认为每个插槽在资源方面都是相同的。在此假设下,将资源放在何处都无所谓,因为所有插槽都应相同。鉴于此,放置任务的主要目的是将它们与它们的输入并置,以最小化网络I / O。
如果我们现在处于一个独立的设置中,我们有固定数量的TaskManagers
运行,则Flink将以任意方式(不提供保证)为来源选择插槽,然后将其使用者放置在相同的插槽中如果可能的话。
当在Farn可以启动新的TaskManagers
的Yarn或Mesos上运行Flink时,Flink将在请求新的TaskManager
之前先用完现有TaskManagers
的所有插槽。在这种情况下,您将看到所有源都将以尽可能少的TaskManagers
结尾。
由于CPU并非独立于wrt插槽(它们是共享资源),因此上述假设并非在所有情况下都成立。因此,在某些情况下,如果您有一组固定的TaskExecutors
,则实际上尽可能分散任务以利用共享的CPU资源是有益的。
为了支持这种调度策略,Flink社区通过FLINK-12122添加了任务分散策略。为了使用更类似于FLIP-6之前行为的调度策略,在该策略中Flink尝试将工作负载分散到所有可用cluster.evenly-spread-out-slots: true
上,需要在{{1}中设置flink-conf.yaml
}
答案 1 :(得分:0)
非常老的线程,但是有一个newer thread回答了当前版本的问题。
使用Flink 1.5,我们增加了资源弹性。这意味着Flink现在能够在诸如Yarn或Mesos的群集管理框架上分配新容器。由于这些更改(这也适用于独立模式),Flink不再需要一组固定的TaskManager,因为如果需要,它将启动新容器(在独立模式下不起作用)。因此,系统很难做出关于将属于单个作业的插槽扩展到多个TM的决定。当您考虑到像您这样的工作可能会受益于这种策略,而另一些工作可能会因为共同定位其职位而受益时,情况就变得更加艰难。如果要对多个作业进行调度,而这些作业是系统不完全了解的,因为它们是按顺序提交的,这将变得更加复杂。因此,Flink当前假定插槽请求可以由任何TaskManager满足。