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。