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