资源分配和抢占涉及到的配置参数

资源分配

  • FSParentQueue.assignContainer
    满足不存在ReservedContainer && 队列ResourceUsage < maxResource
  • FSLeafQueue.assignContainer
    满足不存在ReservedContainer && 队列ResourceUsage < maxResource
  • FSAppAttempt. assignContainer
    1.满足!reserved && !hasContainerForNode(priority, node)`
    2.判断资源分配的locality

hasContainerForNode具体逻辑
1.如果liveContainer==0,并且这个Application的AM是一个managedAM,那么在分配container的时候必须考虑是否超过了当前队列的maAMShare配置的最大AM比例值FairShare * maxAMShare
1.nodemanager节点剩余可用资源 > 请求的container资源
&&
请求的container资源 +队列 ResourceUsage < 队列MaxShare(MaxResources)

  • assignContainer过程的FairSharePolicy比较器
    需要瓜分的总资源为 totalmaxShare 与 (总资源-fix固定资源) 最小值
 int totalMaxShare = 0;//non-fix队列的所有max-share之和
    for (Schedulable sched : schedulables) {//对于non-fixed队列,计算maxShare之和
      int maxShare = getResourceValue(sched.getMaxShare(), type);
      totalMaxShare = (int) Math.min((long)maxShare + (long)totalMaxShare,
          Integer.MAX_VALUE);
      if (totalMaxShare == Integer.MAX_VALUE) {
        break;
      }
    }

    //集群总资源,减去 已经计算完毕的fix队列的资源,得到剩下的non-fix的资源总量,这一部分资源,是可分配的资源
    int totalResource = Math.max((getResourceValue(totalResources, type) -
        takenResources), 0);
    //所有non-fix队列的maxShare加起来小于 totalResource(集群总资源减去fix队列资源量的和的剩余值),则只需要所有maxShare的和就可以了,否则,需要totalResuorce(集群总资源减去fix队列资源量的和的剩余值)
    totalResource = Math.min(totalMaxShare, totalResource);
  • Demand代表队列资源需求量,即处于等待或者运行状态下的应用程序需求的资源量
  • 实际最小资源份额:minShare = Min(资源需求量Demand,配置的最小资源MinShare)
  • 是否饥饿:isNeedy = 资源使用量 < minShare(实际最小资源份额)
  • 资源分配比:minShareRatio = 资源使用量 / Max(mindshare, 1)
  • 资源使用权重比:useToWeightRatio = 资源使用量 / 权重


    image.png

资源抢占

  • 抢占条件

1.集群已经开启了抢占:即yarn.scheduler.fair.preemption是否配置为true

  1. 整体集群资源利用率是否已经超过了yarn.scheduler.fair.preemption.cluster-utilization-threshold的配置值,默认为0.8f
    如果以上条件均满足,则可以进行抢占相关的工作
  • 计算需要抢占的资源
- MinShare 
时间超过minSharePreemptionTimeout,Scheduler还没有获得minShare的资源,则进行抢占 

Target = Min(MinShare, Demand)//如果Demand为0,说明队列没在用,也就不会计算抢占资源
resDueToMinShare = Max(0, Target - ResourceUsage)

- FairShare 
如果超过fairSharePreemptionTimeout,Scheduler还没有获得fairShare的资源,则进行抢占

Target = Min(FairShare, Demand)//如果Demand为0,说明队列没在用,也就不会计算抢占资源
resDueToFairShare = Max(0, Target - ResourceUsage)

最终一个队列可抢占资源 取 上面两种两种情况 得到的 resDueToMinShare 和 resDueToFairShare的最大者
resToPreempt = Max(resDueToMinShare, resDueToFairShare)

FSParentQueue.preemptContainer()

FairSharePolicy比较器,找出对该被抢占的队列
当前资源的欠缺或者充裕程度,资源越充裕,越可能被选中

FSLeafQueue.preemptContainer()

FairSharePolicy比较器,找出对该被抢占app
当前资源的欠缺或者充裕程度,资源越充裕,越可能被选中

FSAppAttempt.preemptContainer()

RMContainerComparator比较器选择一个优先级较低的container,如果优先级相同,则比较containerId并选择一个id比较小的container。

你可能感兴趣的:(资源分配和抢占涉及到的配置参数)