首页 > 解决方案 > 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,但我做不到。谢谢

标签: scalamesostaskschedulermarathon

解决方案


推荐阅读