scala - Marathon 中需要报价的实例包含已启动或已销毁的任务
问题描述
我在 Marathon 上添加了一个补丁,让它向 Mesos 发送一条消息,以设置使用InstanceWantingOffers列表计算的最低需求资源。最小想要资源的设置是为了防止在匹配之前发送大量报价并加快匹配过程。因此,为此我需要在 Marathon 中找到一个知道当前计划的所有实例并且可以为每个事件触发的类(任务部署、扩展、缩减......),我找到了ReviveOfferState为此上课。计算此最小值的函数被添加到ReviveOfferState类中,因为它包含所有需要报价的实例的列表,并且在每个滴答(永远)执行的函数中调用它。
private def findMinimalResources(instancesWantingOffers: List[OffersWantedInfo]): Resources = {
var actualMinimal = Resources(0, 0, 0, 0, 0);
var minCpus: Double = Double.MaxValue;
var minMem: Double = Double.MaxValue;
var minDisk: Double = Double.MaxValue;
var minGpus: Int = Int.MaxValue;
var minNetworkBandwidth: Int = Int.MaxValue;
logger.debug(s"Scheduled Instances for launch are ${instancesWantingOffers}")
instancesWantingOffers.foreach(instance => {
val requiredResources: Resources = instance.resources;
minCpus = List(minCpus, requiredResources.cpus).min
minMem = List(minMem, requiredResources.mem).min
minDisk = List(minDisk, requiredResources.disk).min
minGpus = List(minGpus, requiredResources.gpus).min
minNetworkBandwidth = List(minNetworkBandwidth, requiredResources.networkBandwidth).min;
})
Resources(minCpus, minMem, minDisk, minGpus, minNetworkBandwidth)
}
该函数在roleReviveVersions函数内部调用
lazy val roleReviveVersions: Map[Role, VersionedRoleState] = {
instancesWantingOffers.keysIterator.map { role =>
val iterator = instancesWantingOffers.getOrElse(role, Map.empty).values
.iterator
.filter(launchAllowedOrCleanUpRequired)
val instancesWantingOffersList = iterator.toList;
val minimalResources = findMinimalResources(instancesWantingOffersList)
if (instancesWantingOffersList.isEmpty)
role -> VersionedRoleState(version, OffersNotWanted)
else
role -> VersionedRoleState(instancesWantingOffersList.map(_.version).max, OffersWanted, minimalResources)
}.toMap
}
问题是在开始时可以正常工作,几分钟后instanceWantingOffers变量包含被杀死或执行的僵尸实例,并且最小资源为假。新的马拉松领袖的选举解决了这个问题,但它又发生了有没有人知道为什么会发生这种情况以及我可以在哪个班级做到这一点,我尝试了OfferMatcher,但我做不到。谢谢
解决方案
推荐阅读
- python - 如何合并两个链表
- c# - 分数系统中的点组合乘数
- r - 使用 dplyr 返回函数列表
- ruby-on-rails - statusText:反应轨道获取请求上的“网关超时”
- javascript - 如何在.net core MVC中打开模式弹出窗口而不点击按钮
- c# - 在 BotFramework v3 中使用 applicationsetting.json 进行设置
- angular - cdk拖放交换行为交换列表
- swift - 如何在 AVAudioPlayer swift 中将 Google 语音播放到文本 api 缓冲音频
- ruby-on-rails - 由 heroku 部署时,生产中出现错误 500
- dart - pubspec.yaml 文件具有更新的时间戳