资源分配
- 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 = 资源使用量 / 权重
资源抢占
- 抢占条件
1.集群已经开启了抢占:即yarn.scheduler.fair.preemption是否配置为true
- 整体集群资源利用率是否已经超过了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。