Exemplo n.º 1
0
 internal virtual bool CanAssignToThisQueue(Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                            clusterResource, ICollection <string> nodeLabels, ResourceLimits currentResourceLimits
                                            , Org.Apache.Hadoop.Yarn.Api.Records.Resource nowRequired, Org.Apache.Hadoop.Yarn.Api.Records.Resource
                                            resourceCouldBeUnreserved)
 {
     lock (this)
     {
         // Get label of this queue can access, it's (nodeLabel AND queueLabel)
         ICollection <string> labelCanAccess;
         if (null == nodeLabels || nodeLabels.IsEmpty())
         {
             labelCanAccess = new HashSet <string>();
             // Any queue can always access any node without label
             labelCanAccess.AddItem(RMNodeLabelsManager.NoLabel);
         }
         else
         {
             labelCanAccess = new HashSet <string>(accessibleLabels.Contains(CommonNodeLabelsManager
                                                                             .Any) ? nodeLabels : Sets.Intersection(accessibleLabels, nodeLabels));
         }
         foreach (string label in labelCanAccess)
         {
             // New total resource = used + required
             Org.Apache.Hadoop.Yarn.Api.Records.Resource newTotalResource = Resources.Add(queueUsage
                                                                                          .GetUsed(label), nowRequired);
             Org.Apache.Hadoop.Yarn.Api.Records.Resource currentLimitResource = GetCurrentLimitResource
                                                                                    (label, clusterResource, currentResourceLimits);
             if (Resources.GreaterThan(resourceCalculator, clusterResource, newTotalResource,
                                       currentLimitResource))
             {
                 // if reservation continous looking enabled, check to see if could we
                 // potentially use this node instead of a reserved node if the application
                 // has reserved containers.
                 // TODO, now only consider reservation cases when the node has no label
                 if (this.reservationsContinueLooking && label.Equals(RMNodeLabelsManager.NoLabel) &&
                     Resources.GreaterThan(resourceCalculator, clusterResource, resourceCouldBeUnreserved
                                           , Resources.None()))
                 {
                     // resource-without-reserved = used - reserved
                     Org.Apache.Hadoop.Yarn.Api.Records.Resource newTotalWithoutReservedResource = Resources
                                                                                                   .Subtract(newTotalResource, resourceCouldBeUnreserved);
                     // when total-used-without-reserved-resource < currentLimit, we still
                     // have chance to allocate on this node by unreserving some containers
                     if (Resources.LessThan(resourceCalculator, clusterResource, newTotalWithoutReservedResource
                                            , currentLimitResource))
                     {
                         if (Log.IsDebugEnabled())
                         {
                             Log.Debug("try to use reserved: " + GetQueueName() + " usedResources: " + queueUsage
                                       .GetUsed() + ", clusterResources: " + clusterResource + ", reservedResources: "
                                       + resourceCouldBeUnreserved + ", capacity-without-reserved: " + newTotalWithoutReservedResource
                                       + ", maxLimitCapacity: " + currentLimitResource);
                         }
                         currentResourceLimits.SetAmountNeededUnreserve(Resources.Subtract(newTotalResource
                                                                                           , currentLimitResource));
                         return(true);
                     }
                 }
                 if (Log.IsDebugEnabled())
                 {
                     Log.Debug(GetQueueName() + "Check assign to queue, label=" + label + " usedResources: "
                               + queueUsage.GetUsed(label) + " clusterResources: " + clusterResource + " currentUsedCapacity "
                               + Resources.Divide(resourceCalculator, clusterResource, queueUsage.GetUsed(label
                                                                                                          ), labelManager.GetResourceByLabel(label, clusterResource)) + " max-capacity: "
                               + queueCapacities.GetAbsoluteMaximumCapacity(label) + ")");
                 }
                 return(false);
             }
             return(true);
         }
         // Actually, this will not happen, since labelCanAccess will be always
         // non-empty
         return(false);
     }
 }