Apache flink ApacheFlink-是否可以平均分配插槽共享组?

Apache flink ApacheFlink-是否可以平均分配插槽共享组?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我们有一个包含操作的管道,分为两个工作负载-Source->Transform在第一组中,是CPU密集型工作负载,它们被放在同一个插槽共享组中,比如说Source。和Sink,RAM密集型工作负载,因为它使用批量上传并在内存中保存大量数据。它被发送到sink插槽共享组 此外,我们有一个不同的并行级别Source->Transform工作负载和Sink工作负载,因为第一个工作负载受到源并行性的限制。例如,我们的Source->Transform并行度为50,而Sink并行度为78。我们有8个TMs

我们有一个包含操作的管道,分为两个工作负载-
Source->Transform
在第一组中,是CPU密集型工作负载,它们被放在同一个插槽共享组中,比如说
Source
。和
Sink
,RAM密集型工作负载,因为它使用批量上传并在内存中保存大量数据。它被发送到
sink
插槽共享组

此外,我们有一个不同的并行级别
Source->Transform
工作负载和
Sink
工作负载,因为第一个工作负载受到源并行性的限制。例如,我们的
Source->Transform
并行度为50,而
Sink
并行度为78。我们有8个TMs,每个TMs有16个核(因此也有插槽)

在这种情况下,对于我们来说,理想的插槽分配策略似乎是在每个TM上为
源->转换
分配6-7个插槽,其余的为
接收器
分配主要CPU-RAM工作负载,以便大致均匀地分布在所有TMs上

所以,我想知道是否有一些配置设置会告诉我们平均分配插槽共享组

我只找到了config参数,但我不确定它是否真的均匀分布了插槽共享组,而不仅仅是插槽-例如,我得到了带有10个
Source->Transform
任务的TMs,而我预期是6个还是7个

所以,问题是是否有可能让Flink在集群中平均分配插槽共享组?或者可能还有其他的可能性吗


似乎有点像我的问题,但我主要是问有关槽共享组的分布。本主题也仅包含使用的建议,但可能从那时起有所改变。

我曾经尝试过实现这一点,但问题是Flink没有提供启用操作员放置的功能。我能做的最后一件事就是使用
.map(…).slotSharingGroup(“name”)。正如有关“”的文档所述:

设置操作的插槽共享组。弗林克将把手术 将同一插槽共享组放入同一插槽中,同时保持 其他插槽中没有插槽共享组的操作。这 可用于隔离插槽。插槽共享组继承自 如果所有输入操作都在同一插槽共享中,则输入操作 小组。默认插槽共享组的名称为“默认”, 可以通过调用 SlotShareingGroup(“默认”)

someStream.filter(…).slotSharingGroup(“名称”)


因此,我根据我拥有的任务槽数量以及并行性定义了不同的组。

我找到了一种解决方法,以获得槽共享组的均匀分布

从flink 1.9.2开始,引入了偶数任务分布功能,可以通过
flink-conf.yaml
中的
cluster.allowed-spread-out-slots:true
打开该功能。我试图启用它,但没有成功。在挖掘了一点之后,我找到了开发人员的评论,其中指出此功能仅在独立模式下工作,因为它需要预先分配资源-:

该功能仅保证在调度时注册的一组TMs中分散任务。因此,当您使用活动纱线模式并提交第一份作业时,将不会注册任何TMs。因此,Flink将分配第一个容器,填满它,然后只分配一个新容器。然而,如果您在独立模式下启动Flink,或者在您的第一个工作完成后,仍然有一些TMs注册,那么下一个工作将分散

因此,我们的想法是从增加空闲容器超时设置开始,首先提交一些短暂的假作业,这将简单地从纱线中获取所需的资源量并完成,然后立即启动将分配给已分配容器的主管道,在本例中,
cluster.allower-spread-out-slots:true
执行此操作并均匀分配所有插槽共享组

综上所述,为了在作业中获得均匀分布的插槽共享组,我们做了以下工作:

  • resourcemanager.taskmanager超时时间已增加,以允许在为空闲任务管理器释放容器之前提交主作业。我把时间增加到1分钟,这就足够了
  • 启动了
    纱线会话
    ,并向其动态提交作业
  • 调整主作业以首先调用一个只分配资源的假作业。在我的例子中,这段简单的代码在配置主管道之前完成了以下步骤:
  • val env=StreamExecutionEnvironment.getExecutionEnvironment
    val job=env
    .fromElements(0)
    .map{x=>
    x*2
    }
    .setParallelism(parallelismMax)
    .print()
    val jobResult=env.execute(“资源预分配作业”)
    println(jobResult)
    打印(“完成。正在启动主作业!”)
    
    谢谢您的帮助!然而,这并没有回答这个问题,因为它已经询问了如何平均分配插槽共享组。我们有两个插槽共享组-
    接收器
    ,具有不同的并行性。问题是,同一插槽共享组
    中的任务是随机分布的-我们可以在单个TM中让同一
    任务占用所有16个插槽,反之亦然-只有
    接收器
    插槽共享组的TMs。