diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 8bc614d64a8..b91281e8c8e 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -281,6 +281,9 @@ Release 2.7.0 - UNRELEASED YARN-3181. FairScheduler: Fix up outdated findbugs issues. (kasha) + YARN-3124. Fixed CS LeafQueue/ParentQueue to use QueueCapacities to track + capacities-by-label. (Wangda Tan via jianhe) + OPTIMIZATIONS YARN-2990. FairScheduler's delay-scheduling always waits for node-local and diff --git a/hadoop-yarn-project/hadoop-yarn/dev-support/findbugs-exclude.xml b/hadoop-yarn-project/hadoop-yarn/dev-support/findbugs-exclude.xml index 09a9d2eb891..70f1a71fbcb 100644 --- a/hadoop-yarn-project/hadoop-yarn/dev-support/findbugs-exclude.xml +++ b/hadoop-yarn-project/hadoop-yarn/dev-support/findbugs-exclude.xml @@ -194,6 +194,8 @@ + + diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java index 753fb14bf13..eb7218b6ec0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java @@ -44,23 +44,15 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceUsage; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerUtils; import org.apache.hadoop.yarn.util.resource.ResourceCalculator; -import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Sets; public abstract class AbstractCSQueue implements CSQueue { CSQueue parent; final String queueName; - float capacity; - float maximumCapacity; - float absoluteCapacity; - float absoluteMaxCapacity; - float absoluteUsedCapacity = 0.0f; - - float usedCapacity = 0.0f; volatile int numContainers; - final Resource minimumAllocation; + Resource minimumAllocation; Resource maximumAllocation; QueueState state; final QueueMetrics metrics; @@ -70,10 +62,6 @@ public abstract class AbstractCSQueue implements CSQueue { Set accessibleLabels; RMNodeLabelsManager labelManager; String defaultLabelExpression; - Map absoluteCapacityByNodeLabels; - Map capacitiyByNodeLabels; - Map absoluteMaxCapacityByNodeLabels; - Map maxCapacityByNodeLabels; Map acls = new HashMap(); @@ -83,15 +71,17 @@ public abstract class AbstractCSQueue implements CSQueue { // Track resource usage-by-label like used-resource/pending-resource, etc. ResourceUsage queueUsage; + // Track capacities like used-capcity/abs-used-capacity/capacity/abs-capacity, + // etc. + QueueCapacities queueCapacities; + private final RecordFactory recordFactory = RecordFactoryProvider.getRecordFactory(null); - private CapacitySchedulerContext csContext; + protected CapacitySchedulerContext csContext; protected YarnAuthorizationProvider authorizer = null; public AbstractCSQueue(CapacitySchedulerContext cs, String queueName, CSQueue parent, CSQueue old) throws IOException { - this.minimumAllocation = cs.getMinimumResourceCapability(); - this.maximumAllocation = cs.getMaximumResourceCapability(); this.labelManager = cs.getRMContext().getNodeLabelManager(); this.parent = parent; this.queueName = queueName; @@ -102,68 +92,55 @@ public abstract class AbstractCSQueue implements CSQueue { QueueMetrics.forQueue(getQueuePath(), parent, cs.getConfiguration().getEnableUserMetrics(), cs.getConf()); - - // get labels - this.accessibleLabels = cs.getConfiguration().getAccessibleNodeLabels(getQueuePath()); - this.defaultLabelExpression = cs.getConfiguration() - .getDefaultNodeLabelExpression(getQueuePath()); - // inherit from parent if labels not set - if (this.accessibleLabels == null && parent != null) { - this.accessibleLabels = parent.getAccessibleNodeLabels(); - } - SchedulerUtils.checkIfLabelInClusterNodeLabels(labelManager, - this.accessibleLabels); - - // inherit from parent if labels not set - if (this.defaultLabelExpression == null && parent != null - && this.accessibleLabels.containsAll(parent.getAccessibleNodeLabels())) { - this.defaultLabelExpression = parent.getDefaultNodeLabelExpression(); - } - - // set capacity by labels - capacitiyByNodeLabels = - cs.getConfiguration().getNodeLabelCapacities(getQueuePath(), accessibleLabels, - labelManager); - - // set maximum capacity by labels - maxCapacityByNodeLabels = - cs.getConfiguration().getMaximumNodeLabelCapacities(getQueuePath(), - accessibleLabels, labelManager); this.csContext = cs; + + // initialize ResourceUsage queueUsage = new ResourceUsage(); queueEntity = new PrivilegedEntity(EntityType.QUEUE, getQueuePath()); - authorizer = YarnAuthorizationProvider.getInstance(cs.getConf()); + + // initialize QueueCapacities + queueCapacities = new QueueCapacities(parent == null); + } + + protected void setupConfigurableCapacities() { + CSQueueUtils.loadUpdateAndCheckCapacities( + getQueuePath(), + accessibleLabels, + csContext.getConfiguration(), + queueCapacities, + parent == null ? null : parent.getQueueCapacities(), + csContext.getRMContext().getNodeLabelManager()); } @Override public synchronized float getCapacity() { - return capacity; + return queueCapacities.getCapacity(); } @Override public synchronized float getAbsoluteCapacity() { - return absoluteCapacity; + return queueCapacities.getAbsoluteCapacity(); } @Override public float getAbsoluteMaximumCapacity() { - return absoluteMaxCapacity; + return queueCapacities.getAbsoluteMaximumCapacity(); } @Override public synchronized float getAbsoluteUsedCapacity() { - return absoluteUsedCapacity; + return queueCapacities.getAbsoluteUsedCapacity(); } @Override public float getMaximumCapacity() { - return maximumCapacity; + return queueCapacities.getMaximumCapacity(); } @Override public synchronized float getUsedCapacity() { - return usedCapacity; + return queueCapacities.getUsedCapacity(); } @Override @@ -216,12 +193,12 @@ public abstract class AbstractCSQueue implements CSQueue { @Override public synchronized void setUsedCapacity(float usedCapacity) { - this.usedCapacity = usedCapacity; + queueCapacities.setUsedCapacity(usedCapacity); } @Override public synchronized void setAbsoluteUsedCapacity(float absUsedCapacity) { - this.absoluteUsedCapacity = absUsedCapacity; + queueCapacities.setAbsoluteUsedCapacity(absUsedCapacity); } /** @@ -230,21 +207,16 @@ public abstract class AbstractCSQueue implements CSQueue { */ synchronized void setMaxCapacity(float maximumCapacity) { // Sanity check - CSQueueUtils.checkMaxCapacity(getQueueName(), capacity, maximumCapacity); + CSQueueUtils.checkMaxCapacity(getQueueName(), + queueCapacities.getCapacity(), maximumCapacity); float absMaxCapacity = CSQueueUtils.computeAbsoluteMaximumCapacity(maximumCapacity, parent); - CSQueueUtils.checkAbsoluteCapacity(getQueueName(), absoluteCapacity, + CSQueueUtils.checkAbsoluteCapacity(getQueueName(), + queueCapacities.getAbsoluteCapacity(), absMaxCapacity); - this.maximumCapacity = maximumCapacity; - this.absoluteMaxCapacity = absMaxCapacity; - } - - @Override - public float getAbsActualCapacity() { - // for now, simply return actual capacity = guaranteed capacity for parent - // queue - return absoluteCapacity; + queueCapacities.setMaximumCapacity(maximumCapacity); + queueCapacities.setAbsoluteMaximumCapacity(absMaxCapacity); } @Override @@ -252,39 +224,39 @@ public abstract class AbstractCSQueue implements CSQueue { return defaultLabelExpression; } - synchronized void setupQueueConfigs(Resource clusterResource, float capacity, - float absoluteCapacity, float maximumCapacity, float absoluteMaxCapacity, - QueueState state, Map acls, - Set labels, String defaultLabelExpression, - Map nodeLabelCapacities, - Map maximumNodeLabelCapacities, - boolean reservationContinueLooking, Resource maxAllocation) + synchronized void setupQueueConfigs(Resource clusterResource) throws IOException { - // Sanity check - CSQueueUtils.checkMaxCapacity(getQueueName(), capacity, maximumCapacity); - CSQueueUtils.checkAbsoluteCapacity(getQueueName(), absoluteCapacity, - absoluteMaxCapacity); + // get labels + this.accessibleLabels = + csContext.getConfiguration().getAccessibleNodeLabels(getQueuePath()); + this.defaultLabelExpression = csContext.getConfiguration() + .getDefaultNodeLabelExpression(getQueuePath()); - this.capacity = capacity; - this.absoluteCapacity = absoluteCapacity; - - this.maximumCapacity = maximumCapacity; - this.absoluteMaxCapacity = absoluteMaxCapacity; - - this.state = state; - - this.acls = acls; + // inherit from parent if labels not set + if (this.accessibleLabels == null && parent != null) { + this.accessibleLabels = parent.getAccessibleNodeLabels(); + } + SchedulerUtils.checkIfLabelInClusterNodeLabels(labelManager, + this.accessibleLabels); - // set labels - this.accessibleLabels = labels; + // inherit from parent if labels not set + if (this.defaultLabelExpression == null && parent != null + && this.accessibleLabels.containsAll(parent.getAccessibleNodeLabels())) { + this.defaultLabelExpression = parent.getDefaultNodeLabelExpression(); + } + + // After we setup labels, we can setup capacities + setupConfigurableCapacities(); - // set label expression - this.defaultLabelExpression = defaultLabelExpression; + this.minimumAllocation = csContext.getMinimumResourceCapability(); + this.maximumAllocation = + csContext.getConfiguration().getMaximumAllocationPerQueue( + getQueuePath()); - // copy node label capacity - this.capacitiyByNodeLabels = new HashMap(nodeLabelCapacities); - this.maxCapacityByNodeLabels = - new HashMap(maximumNodeLabelCapacities); + authorizer = YarnAuthorizationProvider.getInstance(csContext.getConf()); + + this.state = csContext.getConfiguration().getState(getQueuePath()); + this.acls = csContext.getConfiguration().getAcls(getQueuePath()); // Update metrics CSQueueUtils.updateQueueStatistics( @@ -311,34 +283,19 @@ public abstract class AbstractCSQueue implements CSQueue { } } } - - // calculate absolute capacity by each node label - this.absoluteCapacityByNodeLabels = - CSQueueUtils.computeAbsoluteCapacityByNodeLabels( - this.capacitiyByNodeLabels, parent); - - // calculate maximum capacity by each node label - this.absoluteMaxCapacityByNodeLabels = - CSQueueUtils.computeAbsoluteMaxCapacityByNodeLabels( - maximumNodeLabelCapacities, parent); - - // check absoluteMaximumNodeLabelCapacities is valid - CSQueueUtils.checkAbsoluteCapacitiesByLabel(getQueueName(), - absoluteCapacityByNodeLabels, absoluteCapacityByNodeLabels); - - this.reservationsContinueLooking = reservationContinueLooking; + + this.reservationsContinueLooking = csContext.getConfiguration() + .getReservationContinueLook(); this.preemptionDisabled = isQueueHierarchyPreemptionDisabled(this); - - this.maximumAllocation = maxAllocation; } protected QueueInfo getQueueInfo() { QueueInfo queueInfo = recordFactory.newRecordInstance(QueueInfo.class); queueInfo.setQueueName(queueName); queueInfo.setAccessibleNodeLabels(accessibleLabels); - queueInfo.setCapacity(capacity); - queueInfo.setMaximumCapacity(maximumCapacity); + queueInfo.setCapacity(queueCapacities.getCapacity()); + queueInfo.setMaximumCapacity(queueCapacities.getMaximumCapacity()); queueInfo.setQueueState(state); queueInfo.setDefaultNodeLabelExpression(defaultLabelExpression); queueInfo.setCurrentCapacity(getUsedCapacity()); @@ -388,51 +345,6 @@ public abstract class AbstractCSQueue implements CSQueue { --numContainers; } - @Private - public float getCapacityByNodeLabel(String label) { - if (StringUtils.equals(label, RMNodeLabelsManager.NO_LABEL)) { - if (null == parent) { - return 1f; - } - return getCapacity(); - } - - if (!capacitiyByNodeLabels.containsKey(label)) { - return 0f; - } else { - return capacitiyByNodeLabels.get(label); - } - } - - @Private - public float getAbsoluteCapacityByNodeLabel(String label) { - if (StringUtils.equals(label, RMNodeLabelsManager.NO_LABEL)) { - if (null == parent) { - return 1f; - } - return getAbsoluteCapacity(); - } - - if (!absoluteCapacityByNodeLabels.containsKey(label)) { - return 0f; - } else { - return absoluteCapacityByNodeLabels.get(label); - } - } - - @Private - public float getAbsoluteMaximumCapacityByNodeLabel(String label) { - if (StringUtils.equals(label, RMNodeLabelsManager.NO_LABEL)) { - return getAbsoluteMaximumCapacity(); - } - - if (!absoluteMaxCapacityByNodeLabels.containsKey(label)) { - return 0f; - } else { - return absoluteMaxCapacityByNodeLabels.get(label); - } - } - @Private public boolean getReservationContinueLooking() { return reservationsContinueLooking; @@ -442,21 +354,21 @@ public abstract class AbstractCSQueue implements CSQueue { public Map getACLs() { return acls; } - - @Private - public Resource getUsedResourceByLabel(String nodeLabel) { - return queueUsage.getUsed(nodeLabel); - } - - @VisibleForTesting - public ResourceUsage getResourceUsage() { - return queueUsage; - } @Private public boolean getPreemptionDisabled() { return preemptionDisabled; } + + @Private + public QueueCapacities getQueueCapacities() { + return queueCapacities; + } + + @Private + public ResourceUsage getQueueResourceUsage() { + return queueUsage; + } /** * The specified queue is preemptable if system-wide preemption is turned on diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java index 46ee93c9f25..5cf38c19ae3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueue.java @@ -35,6 +35,7 @@ import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainer; import org.apache.hadoop.yarn.server.resourcemanager.rmcontainer.RMContainerEventType; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ActiveUsersManager; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceUsage; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerApp; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode; @@ -75,15 +76,6 @@ extends org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue { * @return configured queue capacity */ public float getCapacity(); - - /** - * Get actual capacity of the queue, this may be different from - * configured capacity when mis-config take place, like add labels to the - * cluster - * - * @return actual queue capacity - */ - public float getAbsActualCapacity(); /** * Get capacity of the parent of the queue as a function of the @@ -143,14 +135,6 @@ extends org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue { */ public Resource getUsedResources(); - /** - * Get the currently utilized resources which allocated at nodes with label - * specified - * - * @return used resources by the queue and it's children - */ - public Resource getUsedResourceByLabel(String nodeLabel); - /** * Get the current run-state of the queue * @return current run-state @@ -279,31 +263,22 @@ extends org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue { */ public void attachContainer(Resource clusterResource, FiCaSchedulerApp application, RMContainer container); - - /** - * Get absolute capacity by label of this queue can use - * @param nodeLabel - * @return absolute capacity by label of this queue can use - */ - public float getAbsoluteCapacityByNodeLabel(String nodeLabel); - - /** - * Get absolute max capacity by label of this queue can use - * @param nodeLabel - * @return absolute capacity by label of this queue can use - */ - public float getAbsoluteMaximumCapacityByNodeLabel(String nodeLabel); - - /** - * Get capacity by node label - * @param nodeLabel - * @return capacity by node label - */ - public float getCapacityByNodeLabel(String nodeLabel); /** * Check whether disable_preemption property is set for this queue * @return true if disable_preemption is set, false if not */ public boolean getPreemptionDisabled(); + + /** + * Get QueueCapacities of this queue + * @return queueCapacities + */ + public QueueCapacities getQueueCapacities(); + + /** + * Get ResourceUsage of this queue + * @return resourceUsage + */ + public ResourceUsage getQueueResourceUsage(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueUtils.java index f458057c35d..865b0b41979 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueUtils.java @@ -17,13 +17,14 @@ */ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; +import java.util.HashSet; +import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager; +import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.apache.hadoop.yarn.server.utils.Lock; import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.Resources; @@ -34,6 +35,9 @@ class CSQueueUtils { final static float EPSILON = 0.0001f; + /* + * Used only by tests + */ public static void checkMaxCapacity(String queueName, float capacity, float maximumCapacity) { if (maximumCapacity < 0.0f || maximumCapacity > 1.0f) { @@ -43,6 +47,9 @@ class CSQueueUtils { } } + /* + * Used only by tests + */ public static void checkAbsoluteCapacity(String queueName, float absCapacity, float absMaxCapacity) { if (absMaxCapacity < (absCapacity - EPSILON)) { @@ -53,19 +60,33 @@ class CSQueueUtils { } } - public static void checkAbsoluteCapacitiesByLabel(String queueName, - Map absCapacities, - Map absMaximumCapacities) { - for (Entry entry : absCapacities.entrySet()) { - String label = entry.getKey(); - float absCapacity = entry.getValue(); - float absMaxCapacity = absMaximumCapacities.get(label); - if (absMaxCapacity < (absCapacity - EPSILON)) { - throw new IllegalArgumentException("Illegal call to setMaxCapacity. " - + "Queue '" + queueName + "' has " + "an absolute capacity (" - + absCapacity + ") greater than " - + "its absolute maximumCapacity (" + absMaxCapacity + ") of label=" - + label); + /** + * Check sanity of capacities: + * - capacity <= maxCapacity + * - absCapacity <= absMaximumCapacity + */ + private static void capacitiesSanityCheck(String queueName, + QueueCapacities queueCapacities) { + for (String label : queueCapacities.getExistingNodeLabels()) { + float capacity = queueCapacities.getCapacity(label); + float maximumCapacity = queueCapacities.getMaximumCapacity(label); + if (capacity > maximumCapacity) { + throw new IllegalArgumentException("Illegal queue capacity setting, " + + "(capacity=" + capacity + ") > (maximum-capacity=" + + maximumCapacity + "). When label=[" + label + "]"); + } + + // Actually, this may not needed since we have verified capacity <= + // maximumCapacity. And the way we compute absolute capacity (abs(x) = + // cap(x) * cap(x.parent) * ...) is a monotone increasing function. But + // just keep it here to make sure our compute abs capacity method works + // correctly. + float absCapacity = queueCapacities.getAbsoluteCapacity(label); + float absMaxCapacity = queueCapacities.getAbsoluteMaximumCapacity(label); + if (absCapacity > absMaxCapacity) { + throw new IllegalArgumentException("Illegal queue capacity setting, " + + "(abs-capacity=" + absCapacity + ") > (abs-maximum-capacity=" + + absMaxCapacity + "). When label=[" + label + "]"); } } } @@ -77,37 +98,94 @@ class CSQueueUtils { return (parentAbsMaxCapacity * maximumCapacity); } - public static Map computeAbsoluteCapacityByNodeLabels( - Map nodeLabelToCapacities, CSQueue parent) { - if (parent == null) { - return nodeLabelToCapacities; - } - - Map absoluteCapacityByNodeLabels = - new HashMap(); - for (Entry entry : nodeLabelToCapacities.entrySet()) { - String label = entry.getKey(); - float capacity = entry.getValue(); - absoluteCapacityByNodeLabels.put(label, - capacity * parent.getAbsoluteCapacityByNodeLabel(label)); - } - return absoluteCapacityByNodeLabels; + /** + * This method intends to be used by ReservationQueue, ReservationQueue will + * not appear in configuration file, so we shouldn't do load capacities + * settings in configuration for reservation queue. + */ + public static void updateAndCheckCapacitiesByLabel(String queuePath, + QueueCapacities queueCapacities, QueueCapacities parentQueueCapacities) { + updateAbsoluteCapacitiesByNodeLabels(queueCapacities, parentQueueCapacities); + + capacitiesSanityCheck(queuePath, queueCapacities); + } + + /** + * Do following steps for capacities + * - Load capacities from configuration + * - Update absolute capacities for new capacities + * - Check if capacities/absolute-capacities legal + */ + public static void loadUpdateAndCheckCapacities(String queuePath, + Set accessibleLabels, CapacitySchedulerConfiguration csConf, + QueueCapacities queueCapacities, QueueCapacities parentQueueCapacities, + RMNodeLabelsManager nlm) { + loadCapacitiesByLabelsFromConf(queuePath, accessibleLabels, nlm, + queueCapacities, csConf); + + updateAbsoluteCapacitiesByNodeLabels(queueCapacities, parentQueueCapacities); + + capacitiesSanityCheck(queuePath, queueCapacities); } - public static Map computeAbsoluteMaxCapacityByNodeLabels( - Map maximumNodeLabelToCapacities, CSQueue parent) { - if (parent == null) { - return maximumNodeLabelToCapacities; + // Considered NO_LABEL, ANY and null cases + private static Set normalizeAccessibleNodeLabels(Set labels, + RMNodeLabelsManager mgr) { + Set accessibleLabels = new HashSet(); + if (labels != null) { + accessibleLabels.addAll(labels); } - Map absoluteMaxCapacityByNodeLabels = - new HashMap(); - for (Entry entry : maximumNodeLabelToCapacities.entrySet()) { - String label = entry.getKey(); - float maxCapacity = entry.getValue(); - absoluteMaxCapacityByNodeLabels.put(label, - maxCapacity * parent.getAbsoluteMaximumCapacityByNodeLabel(label)); + if (accessibleLabels.contains(CommonNodeLabelsManager.ANY)) { + accessibleLabels.addAll(mgr.getClusterNodeLabels()); + } + accessibleLabels.add(CommonNodeLabelsManager.NO_LABEL); + + return accessibleLabels; + } + + private static void loadCapacitiesByLabelsFromConf(String queuePath, + Set labels, RMNodeLabelsManager mgr, + QueueCapacities queueCapacities, CapacitySchedulerConfiguration csConf) { + queueCapacities.clearConfigurableFields(); + labels = normalizeAccessibleNodeLabels(labels, mgr); + + for (String label : labels) { + if (label.equals(CommonNodeLabelsManager.NO_LABEL)) { + queueCapacities.setCapacity(CommonNodeLabelsManager.NO_LABEL, + csConf.getNonLabeledQueueCapacity(queuePath) / 100); + queueCapacities.setMaximumCapacity(CommonNodeLabelsManager.NO_LABEL, + csConf.getNonLabeledQueueMaximumCapacity(queuePath) / 100); + } else { + queueCapacities.setCapacity(label, + csConf.getLabeledQueueCapacity(queuePath, label) / 100); + queueCapacities.setMaximumCapacity(label, + csConf.getLabeledQueueMaximumCapacity(queuePath, label) / 100); + } + } + } + + // Set absolute capacities for {capacity, maximum-capacity} + private static void updateAbsoluteCapacitiesByNodeLabels( + QueueCapacities queueCapacities, QueueCapacities parentQueueCapacities) { + for (String label : queueCapacities.getExistingNodeLabels()) { + float capacity = queueCapacities.getCapacity(label); + if (capacity > 0f) { + queueCapacities.setAbsoluteCapacity( + label, + capacity + * (parentQueueCapacities == null ? 1 : parentQueueCapacities + .getAbsoluteCapacity(label))); + } + + float maxCapacity = queueCapacities.getMaximumCapacity(label); + if (maxCapacity > 0f) { + queueCapacities.setAbsoluteMaximumCapacity( + label, + maxCapacity + * (parentQueueCapacities == null ? 1 : parentQueueCapacities + .getAbsoluteMaximumCapacity(label))); + } } - return absoluteMaxCapacityByNodeLabels; } @Lock(CSQueue.class) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java index b49a60a6b94..3528c2d6178 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java @@ -278,6 +278,9 @@ public class CapacitySchedulerConfiguration extends ReservationSchedulerConfigur } private String getNodeLabelPrefix(String queue, String label) { + if (label.equals(CommonNodeLabelsManager.NO_LABEL)) { + return getQueuePrefix(queue); + } return getQueuePrefix(queue) + ACCESSIBLE_NODE_LABELS + DOT + label + DOT; } @@ -316,7 +319,7 @@ public class CapacitySchedulerConfiguration extends ReservationSchedulerConfigur getMaximumApplicationMasterResourcePercent()); } - public float getCapacity(String queue) { + public float getNonLabeledQueueCapacity(String queue) { float capacity = queue.equals("root") ? 100.0f : getFloat( getQueuePrefix(queue) + CAPACITY, UNDEFINED); if (capacity < MINIMUM_CAPACITY_VALUE || capacity > MAXIMUM_CAPACITY_VALUE) { @@ -338,7 +341,7 @@ public class CapacitySchedulerConfiguration extends ReservationSchedulerConfigur ", capacity=" + capacity); } - public float getMaximumCapacity(String queue) { + public float getNonLabeledQueueMaximumCapacity(String queue) { float maxCapacity = getFloat(getQueuePrefix(queue) + MAXIMUM_CAPACITY, MAXIMUM_CAPACITY_VALUE); maxCapacity = (maxCapacity == DEFAULT_MAXIMUM_CAPACITY_VALUE) ? @@ -442,57 +445,29 @@ public class CapacitySchedulerConfiguration extends ReservationSchedulerConfigur return Collections.unmodifiableSet(set); } - public Map getNodeLabelCapacities(String queue, - Set labels, RMNodeLabelsManager mgr) { - Map nodeLabelCapacities = new HashMap(); - - if (labels == null) { - return nodeLabelCapacities; + private float internalGetLabeledQueueCapacity(String queue, String label, String suffix, + float defaultValue) { + String capacityPropertyName = getNodeLabelPrefix(queue, label) + suffix; + float capacity = getFloat(capacityPropertyName, defaultValue); + if (capacity < MINIMUM_CAPACITY_VALUE + || capacity > MAXIMUM_CAPACITY_VALUE) { + throw new IllegalArgumentException("Illegal capacity of " + capacity + + " for node-label=" + label + " in queue=" + queue + + ", valid capacity should in range of [0, 100]."); } - - for (String label : labels.contains(CommonNodeLabelsManager.ANY) ? mgr - .getClusterNodeLabels() : labels) { - String capacityPropertyName = getNodeLabelPrefix(queue, label) + CAPACITY; - float capacity = getFloat(capacityPropertyName, 0f); - if (capacity < MINIMUM_CAPACITY_VALUE - || capacity > MAXIMUM_CAPACITY_VALUE) { - throw new IllegalArgumentException("Illegal capacity of " + capacity - + " for node-label=" + label + " in queue=" + queue - + ", valid capacity should in range of [0, 100]."); - } - if (LOG.isDebugEnabled()) { - LOG.debug("CSConf - getCapacityOfLabel: prefix=" - + getNodeLabelPrefix(queue, label) + ", capacity=" + capacity); - } - - nodeLabelCapacities.put(label, capacity / 100f); + if (LOG.isDebugEnabled()) { + LOG.debug("CSConf - getCapacityOfLabel: prefix=" + + getNodeLabelPrefix(queue, label) + ", capacity=" + capacity); } - return nodeLabelCapacities; + return capacity; } - public Map getMaximumNodeLabelCapacities(String queue, - Set labels, RMNodeLabelsManager mgr) { - Map maximumNodeLabelCapacities = new HashMap(); - if (labels == null) { - return maximumNodeLabelCapacities; - } - - for (String label : labels.contains(CommonNodeLabelsManager.ANY) ? mgr - .getClusterNodeLabels() : labels) { - float maxCapacity = - getFloat(getNodeLabelPrefix(queue, label) + MAXIMUM_CAPACITY, - 100f); - if (maxCapacity < MINIMUM_CAPACITY_VALUE - || maxCapacity > MAXIMUM_CAPACITY_VALUE) { - throw new IllegalArgumentException("Illegal " + "capacity of " - + maxCapacity + " for label=" + label + " in queue=" + queue); - } - LOG.debug("CSConf - getCapacityOfLabel: prefix=" - + getNodeLabelPrefix(queue, label) + ", capacity=" + maxCapacity); - - maximumNodeLabelCapacities.put(label, maxCapacity / 100f); - } - return maximumNodeLabelCapacities; + public float getLabeledQueueCapacity(String queue, String label) { + return internalGetLabeledQueueCapacity(queue, label, CAPACITY, 0f); + } + + public float getLabeledQueueMaximumCapacity(String queue, String label) { + return internalGetLabeledQueueCapacity(queue, label, MAXIMUM_CAPACITY, 100f); } public String getDefaultNodeLabelExpression(String queue) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java index 525822302f7..38d4712de09 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java @@ -122,49 +122,7 @@ public class LeafQueue extends AbstractCSQueue { super(cs, queueName, parent, old); this.scheduler = cs; - this.activeUsersManager = new ActiveUsersManager(metrics); - this.minimumAllocationFactor = - Resources.ratio(resourceCalculator, - Resources.subtract(maximumAllocation, minimumAllocation), - maximumAllocation); - - float capacity = getCapacityFromConf(); - float absoluteCapacity = parent.getAbsoluteCapacity() * capacity; - - float maximumCapacity = - (float)cs.getConfiguration().getMaximumCapacity(getQueuePath()) / 100; - float absoluteMaxCapacity = - CSQueueUtils.computeAbsoluteMaximumCapacity(maximumCapacity, parent); - - int userLimit = cs.getConfiguration().getUserLimit(getQueuePath()); - float userLimitFactor = - cs.getConfiguration().getUserLimitFactor(getQueuePath()); - - int maxApplications = - cs.getConfiguration().getMaximumApplicationsPerQueue(getQueuePath()); - if (maxApplications < 0) { - int maxSystemApps = cs.getConfiguration().getMaximumSystemApplications(); - maxApplications = (int)(maxSystemApps * absoluteCapacity); - } - maxApplicationsPerUser = - (int)(maxApplications * (userLimit / 100.0f) * userLimitFactor); - - float maxAMResourcePerQueuePercent = cs.getConfiguration() - .getMaximumApplicationMasterResourcePerQueuePercent(getQueuePath()); - - QueueState state = cs.getConfiguration().getState(getQueuePath()); - - Map acls = - cs.getConfiguration().getAcls(getQueuePath()); - - setupQueueConfigs(cs.getClusterResource(), capacity, absoluteCapacity, - maximumCapacity, absoluteMaxCapacity, userLimit, userLimitFactor, - maxApplications, maxAMResourcePerQueuePercent, maxApplicationsPerUser, - state, acls, cs.getConfiguration().getNodeLocalityDelay(), accessibleLabels, - defaultLabelExpression, this.capacitiyByNodeLabels, - this.maxCapacityByNodeLabels, - cs.getConfiguration().getReservationContinueLook(), - cs.getConfiguration().getMaximumAllocationPerQueue(getQueuePath())); + this.activeUsersManager = new ActiveUsersManager(metrics); if(LOG.isDebugEnabled()) { LOG.debug("LeafQueue:" + " name=" + queueName @@ -176,35 +134,13 @@ public class LeafQueue extends AbstractCSQueue { this.pendingApplications = new TreeSet(applicationComparator); this.activeApplications = new TreeSet(applicationComparator); - } - - // externalizing in method, to allow overriding - protected float getCapacityFromConf() { - return (float)scheduler.getConfiguration().getCapacity(getQueuePath()) / 100; + + setupQueueConfigs(cs.getClusterResource()); } - protected synchronized void setupQueueConfigs( - Resource clusterResource, - float capacity, float absoluteCapacity, - float maximumCapacity, float absoluteMaxCapacity, - int userLimit, float userLimitFactor, - int maxApplications, float maxAMResourcePerQueuePercent, - int maxApplicationsPerUser, QueueState state, - Map acls, int nodeLocalityDelay, - Set labels, String defaultLabelExpression, - Map capacitieByLabel, - Map maximumCapacitiesByLabel, - boolean revervationContinueLooking, - Resource maxAllocation) throws IOException { - super.setupQueueConfigs(clusterResource, capacity, absoluteCapacity, - maximumCapacity, absoluteMaxCapacity, state, acls, labels, - defaultLabelExpression, capacitieByLabel, maximumCapacitiesByLabel, - revervationContinueLooking, maxAllocation); - // Sanity check - CSQueueUtils.checkMaxCapacity(getQueueName(), capacity, maximumCapacity); - float absCapacity = getParent().getAbsoluteCapacity() * capacity; - CSQueueUtils.checkAbsoluteCapacity(getQueueName(), absCapacity, - absoluteMaxCapacity); + protected synchronized void setupQueueConfigs(Resource clusterResource) + throws IOException { + super.setupQueueConfigs(clusterResource); this.lastClusterResource = clusterResource; updateAbsoluteCapacityResource(clusterResource); @@ -214,16 +150,24 @@ public class LeafQueue extends AbstractCSQueue { // and all queues may not be realized yet, we'll use (optimistic) // absoluteMaxCapacity (it will be replaced with the more accurate // absoluteMaxAvailCapacity during headroom/userlimit/allocation events) - updateHeadroomInfo(clusterResource, absoluteMaxCapacity); + updateHeadroomInfo(clusterResource, + queueCapacities.getAbsoluteMaximumCapacity()); - this.absoluteCapacity = absCapacity; + CapacitySchedulerConfiguration conf = csContext.getConfiguration(); + userLimit = conf.getUserLimit(getQueuePath()); + userLimitFactor = conf.getUserLimitFactor(getQueuePath()); - this.userLimit = userLimit; - this.userLimitFactor = userLimitFactor; - - this.maxApplications = maxApplications; - this.maxAMResourcePerQueuePercent = maxAMResourcePerQueuePercent; - this.maxApplicationsPerUser = maxApplicationsPerUser; + maxApplications = conf.getMaximumApplicationsPerQueue(getQueuePath()); + if (maxApplications < 0) { + int maxSystemApps = conf.getMaximumSystemApplications(); + maxApplications = + (int) (maxSystemApps * queueCapacities.getAbsoluteCapacity()); + } + maxApplicationsPerUser = + (int)(maxApplications * (userLimit / 100.0f) * userLimitFactor); + + maxAMResourcePerQueuePercent = + conf.getMaximumApplicationMasterResourcePerQueuePercent(getQueuePath()); if (!SchedulerUtils.checkQueueLabelExpression(this.accessibleLabels, this.defaultLabelExpression)) { @@ -239,7 +183,7 @@ public class LeafQueue extends AbstractCSQueue { getAccessibleNodeLabels().iterator(), ','))); } - this.nodeLocalityDelay = nodeLocalityDelay; + nodeLocalityDelay = conf.getNodeLocalityDelay(); // re-init this since max allocation could have changed this.minimumAllocationFactor = @@ -253,21 +197,21 @@ public class LeafQueue extends AbstractCSQueue { } StringBuilder labelStrBuilder = new StringBuilder(); - if (labels != null) { - for (String s : labels) { + if (accessibleLabels != null) { + for (String s : accessibleLabels) { labelStrBuilder.append(s); labelStrBuilder.append(","); } } LOG.info("Initializing " + queueName + "\n" + - "capacity = " + capacity + + "capacity = " + queueCapacities.getCapacity() + " [= (float) configuredCapacity / 100 ]" + "\n" + - "asboluteCapacity = " + absoluteCapacity + + "asboluteCapacity = " + queueCapacities.getAbsoluteCapacity() + " [= parentAbsoluteCapacity * capacity ]" + "\n" + - "maxCapacity = " + maximumCapacity + + "maxCapacity = " + queueCapacities.getMaximumCapacity() + " [= configuredMaxCapacity ]" + "\n" + - "absoluteMaxCapacity = " + absoluteMaxCapacity + + "absoluteMaxCapacity = " + queueCapacities.getAbsoluteMaximumCapacity() + " [= 1.0 maximumCapacity undefined, " + "(parentAbsoluteMaxCapacity * maximumCapacity) / 100 otherwise ]" + "\n" + @@ -282,7 +226,7 @@ public class LeafQueue extends AbstractCSQueue { "maxApplicationsPerUser = " + maxApplicationsPerUser + " [= (int)(maxApplications * (userLimit / 100.0f) * " + "userLimitFactor) ]" + "\n" + - "usedCapacity = " + usedCapacity + + "usedCapacity = " + queueCapacities.getUsedCapacity() + " [= usedResourcesMemory / " + "(clusterResourceMemory * absoluteCapacity)]" + "\n" + "absoluteUsedCapacity = " + absoluteUsedCapacity + @@ -441,8 +385,8 @@ public class LeafQueue extends AbstractCSQueue { public String toString() { return queueName + ": " + - "capacity=" + capacity + ", " + - "absoluteCapacity=" + absoluteCapacity + ", " + + "capacity=" + queueCapacities.getCapacity() + ", " + + "absoluteCapacity=" + queueCapacities.getAbsoluteCapacity() + ", " + "usedResources=" + queueUsage.getUsed() + ", " + "usedCapacity=" + getUsedCapacity() + ", " + "absoluteUsedCapacity=" + getAbsoluteUsedCapacity() + ", " + @@ -505,23 +449,7 @@ public class LeafQueue extends AbstractCSQueue { + ", trying to set it to: " + newMax); } - setupQueueConfigs( - clusterResource, - newlyParsedLeafQueue.capacity, newlyParsedLeafQueue.absoluteCapacity, - newlyParsedLeafQueue.maximumCapacity, - newlyParsedLeafQueue.absoluteMaxCapacity, - newlyParsedLeafQueue.userLimit, newlyParsedLeafQueue.userLimitFactor, - newlyParsedLeafQueue.maxApplications, - newlyParsedLeafQueue.maxAMResourcePerQueuePercent, - newlyParsedLeafQueue.getMaxApplicationsPerUser(), - newlyParsedLeafQueue.state, newlyParsedLeafQueue.acls, - newlyParsedLeafQueue.getNodeLocalityDelay(), - newlyParsedLeafQueue.accessibleLabels, - newlyParsedLeafQueue.defaultLabelExpression, - newlyParsedLeafQueue.capacitiyByNodeLabels, - newlyParsedLeafQueue.maxCapacityByNodeLabels, - newlyParsedLeafQueue.reservationsContinueLooking, - newlyParsedLeafQueue.getMaximumAllocation()); + setupQueueConfigs(clusterResource); // queue metrics are updated, more resource may be available // activate the pending applications if possible @@ -1034,7 +962,8 @@ public class LeafQueue extends AbstractCSQueue { application.getCurrentReservation()), labelManager.getResourceByLabel(label, clusterResource)); - if (potentialNewWithoutReservedCapacity <= absoluteMaxCapacity) { + if (potentialNewWithoutReservedCapacity <= queueCapacities + .getAbsoluteMaximumCapacity()) { if (LOG.isDebugEnabled()) { LOG.debug("try to use reserved: " + getQueueName() @@ -1048,8 +977,9 @@ public class LeafQueue extends AbstractCSQueue { + Resources.divide(resourceCalculator, clusterResource, queueUsage.getUsed(), clusterResource) + " required " + required + " potentialNewWithoutReservedCapacity: " - + potentialNewWithoutReservedCapacity + " ( " + " max-capacity: " - + absoluteMaxCapacity + ")"); + + potentialNewWithoutReservedCapacity + " ( " + + " max-capacity: " + + queueCapacities.getAbsoluteMaximumCapacity() + ")"); } // we could potentially use this node instead of reserved node return true; @@ -1058,7 +988,8 @@ public class LeafQueue extends AbstractCSQueue { // Otherwise, if any of the label of this node beyond queue limit, we // cannot allocate on this node. Consider a small epsilon here. - if (potentialNewCapacity > getAbsoluteMaximumCapacityByNodeLabel(label) + 1e-4) { + if (potentialNewCapacity > queueCapacities + .getAbsoluteMaximumCapacity(label) + 1e-4) { canAssign = false; break; } @@ -1073,7 +1004,8 @@ public class LeafQueue extends AbstractCSQueue { queueUsage.getUsed(label), labelManager.getResourceByLabel(label, clusterResource)) + " potentialNewCapacity: " + potentialNewCapacity + " ( " - + " max-capacity: " + absoluteMaxCapacity + ")"); + + " max-capacity: " + queueCapacities.getAbsoluteMaximumCapacity() + + ")"); } } @@ -1162,7 +1094,7 @@ public class LeafQueue extends AbstractCSQueue { Resources.multiplyAndNormalizeUp(resourceCalculator, labelManager.getResourceByLabel(firstLabel, clusterResource), - getAbsoluteCapacityByNodeLabel(firstLabel), + queueCapacities.getAbsoluteCapacity(firstLabel), minimumAllocation)); } else { // else there's no label on request, just to use absolute capacity as @@ -1170,7 +1102,7 @@ public class LeafQueue extends AbstractCSQueue { queueCapacity = Resources.multiplyAndNormalizeUp(resourceCalculator, labelManager .getResourceByLabel(CommonNodeLabelsManager.NO_LABEL, clusterResource), - absoluteCapacity, minimumAllocation); + queueCapacities.getAbsoluteCapacity(), minimumAllocation); } // Allow progress for queues with miniscule capacity @@ -1815,12 +1747,9 @@ public class LeafQueue extends AbstractCSQueue { } private void updateAbsoluteCapacityResource(Resource clusterResource) { - - absoluteCapacityResource = Resources.multiplyAndNormalizeUp( - resourceCalculator, - clusterResource, - absoluteCapacity, minimumAllocation); - + absoluteCapacityResource = + Resources.multiplyAndNormalizeUp(resourceCalculator, clusterResource, + queueCapacities.getAbsoluteCapacity(), minimumAllocation); } @Override @@ -1831,7 +1760,8 @@ public class LeafQueue extends AbstractCSQueue { // Update headroom info based on new cluster resource value // absoluteMaxCapacity now, will be replaced with absoluteMaxAvailCapacity // during allocation - updateHeadroomInfo(clusterResource, absoluteMaxCapacity); + updateHeadroomInfo(clusterResource, + queueCapacities.getAbsoluteMaximumCapacity()); // Update metrics CSQueueUtils.updateQueueStatistics( @@ -2004,35 +1934,13 @@ public class LeafQueue extends AbstractCSQueue { getParent().detachContainer(clusterResource, application, rmContainer); } } - - @Override - public float getAbsActualCapacity() { - //? Is this actually used by anything at present? - // There is a findbugs warning -re lastClusterResource (now excluded), - // when this is used, verify that the access is mt correct and remove - // the findbugs exclusion if possible - if (Resources.lessThanOrEqual(resourceCalculator, lastClusterResource, - lastClusterResource, Resources.none())) { - return absoluteCapacity; - } - - Resource resourceRespectLabels = - labelManager == null ? lastClusterResource : labelManager - .getQueueResource(queueName, accessibleLabels, lastClusterResource); - float absActualCapacity = - Resources.divide(resourceCalculator, lastClusterResource, - resourceRespectLabels, lastClusterResource); - - return absActualCapacity > absoluteCapacity ? absoluteCapacity - : absActualCapacity; - } public void setCapacity(float capacity) { - this.capacity = capacity; + queueCapacities.setCapacity(capacity); } public void setAbsoluteCapacity(float absoluteCapacity) { - this.absoluteCapacity = absoluteCapacity; + queueCapacities.setAbsoluteCapacity(absoluteCapacity); } public void setMaxApplications(int maxApplications) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java index 29a8ba3e20a..a26b0aa7924 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java @@ -87,7 +87,7 @@ public class ParentQueue extends AbstractCSQueue { this.rootQueue = (parent == null); - float rawCapacity = cs.getConfiguration().getCapacity(getQueuePath()); + float rawCapacity = cs.getConfiguration().getNonLabeledQueueCapacity(getQueuePath()); if (rootQueue && (rawCapacity != CapacitySchedulerConfiguration.MAXIMUM_CAPACITY_VALUE)) { @@ -95,46 +95,20 @@ public class ParentQueue extends AbstractCSQueue { "capacity of " + rawCapacity + " for queue " + queueName + ". Must be " + CapacitySchedulerConfiguration.MAXIMUM_CAPACITY_VALUE); } - - float capacity = (float) rawCapacity / 100; - float parentAbsoluteCapacity = - (rootQueue) ? 1.0f : parent.getAbsoluteCapacity(); - float absoluteCapacity = parentAbsoluteCapacity * capacity; - - float maximumCapacity = - (float) cs.getConfiguration().getMaximumCapacity(getQueuePath()) / 100; - float absoluteMaxCapacity = - CSQueueUtils.computeAbsoluteMaximumCapacity(maximumCapacity, parent); - - QueueState state = cs.getConfiguration().getState(getQueuePath()); - - Map acls = - cs.getConfiguration().getAcls(getQueuePath()); - - setupQueueConfigs(cs.getClusterResource(), capacity, absoluteCapacity, - maximumCapacity, absoluteMaxCapacity, state, acls, accessibleLabels, - defaultLabelExpression, capacitiyByNodeLabels, maxCapacityByNodeLabels, - cs.getConfiguration().getReservationContinueLook()); this.childQueues = new TreeSet(queueComparator); + + setupQueueConfigs(cs.getClusterResource()); LOG.info("Initialized parent-queue " + queueName + " name=" + queueName + ", fullname=" + getQueuePath()); } - synchronized void setupQueueConfigs(Resource clusterResource, float capacity, - float absoluteCapacity, float maximumCapacity, float absoluteMaxCapacity, - QueueState state, Map acls, - Set accessibleLabels, String defaultLabelExpression, - Map nodeLabelCapacities, - Map maximumCapacitiesByLabel, - boolean reservationContinueLooking) throws IOException { - super.setupQueueConfigs(clusterResource, capacity, absoluteCapacity, - maximumCapacity, absoluteMaxCapacity, state, acls, accessibleLabels, - defaultLabelExpression, nodeLabelCapacities, maximumCapacitiesByLabel, - reservationContinueLooking, maximumAllocation); - StringBuilder aclsString = new StringBuilder(); + synchronized void setupQueueConfigs(Resource clusterResource) + throws IOException { + super.setupQueueConfigs(clusterResource); + StringBuilder aclsString = new StringBuilder(); for (Map.Entry e : acls.entrySet()) { aclsString.append(e.getKey() + ":" + e.getValue().getAclString()); } @@ -148,10 +122,10 @@ public class ParentQueue extends AbstractCSQueue { } LOG.info(queueName + - ", capacity=" + capacity + - ", asboluteCapacity=" + absoluteCapacity + - ", maxCapacity=" + maximumCapacity + - ", asboluteMaxCapacity=" + absoluteMaxCapacity + + ", capacity=" + this.queueCapacities.getCapacity() + + ", asboluteCapacity=" + this.queueCapacities.getAbsoluteCapacity() + + ", maxCapacity=" + this.queueCapacities.getMaximumCapacity() + + ", asboluteMaxCapacity=" + this.queueCapacities.getAbsoluteMaximumCapacity() + ", state=" + state + ", acls=" + aclsString + ", labels=" + labelStrBuilder.toString() + "\n" + @@ -167,19 +141,19 @@ public class ParentQueue extends AbstractCSQueue { } float delta = Math.abs(1.0f - childCapacities); // crude way to check // allow capacities being set to 0, and enforce child 0 if parent is 0 - if (((capacity > 0) && (delta > PRECISION)) || - ((capacity == 0) && (childCapacities > 0))) { + if (((queueCapacities.getCapacity() > 0) && (delta > PRECISION)) || + ((queueCapacities.getCapacity() == 0) && (childCapacities > 0))) { throw new IllegalArgumentException("Illegal" + " capacity of " + childCapacities + " for children of queue " + queueName); } // check label capacities for (String nodeLabel : labelManager.getClusterNodeLabels()) { - float capacityByLabel = getCapacityByNodeLabel(nodeLabel); + float capacityByLabel = queueCapacities.getCapacity(nodeLabel); // check children's labels float sum = 0; for (CSQueue queue : childQueues) { - sum += queue.getCapacityByNodeLabel(nodeLabel); + sum += queue.getQueueCapacities().getCapacity(nodeLabel); } if ((capacityByLabel > 0 && Math.abs(1.0f - sum) > PRECISION) || (capacityByLabel == 0) && (sum > 0)) { @@ -255,8 +229,8 @@ public class ParentQueue extends AbstractCSQueue { public String toString() { return queueName + ": " + "numChildQueue= " + childQueues.size() + ", " + - "capacity=" + capacity + ", " + - "absoluteCapacity=" + absoluteCapacity + ", " + + "capacity=" + queueCapacities.getCapacity() + ", " + + "absoluteCapacity=" + queueCapacities.getAbsoluteCapacity() + ", " + "usedResources=" + queueUsage.getUsed() + "usedCapacity=" + getUsedCapacity() + ", " + "numApps=" + getNumApplications() + ", " + @@ -264,9 +238,8 @@ public class ParentQueue extends AbstractCSQueue { } @Override - public synchronized void reinitialize( - CSQueue newlyParsedQueue, Resource clusterResource) - throws IOException { + public synchronized void reinitialize(CSQueue newlyParsedQueue, + Resource clusterResource) throws IOException { // Sanity check if (!(newlyParsedQueue instanceof ParentQueue) || !newlyParsedQueue.getQueuePath().equals(getQueuePath())) { @@ -277,18 +250,7 @@ public class ParentQueue extends AbstractCSQueue { ParentQueue newlyParsedParentQueue = (ParentQueue)newlyParsedQueue; // Set new configs - setupQueueConfigs(clusterResource, - newlyParsedParentQueue.capacity, - newlyParsedParentQueue.absoluteCapacity, - newlyParsedParentQueue.maximumCapacity, - newlyParsedParentQueue.absoluteMaxCapacity, - newlyParsedParentQueue.state, - newlyParsedParentQueue.acls, - newlyParsedParentQueue.accessibleLabels, - newlyParsedParentQueue.defaultLabelExpression, - newlyParsedParentQueue.capacitiyByNodeLabels, - newlyParsedParentQueue.maxCapacityByNodeLabels, - newlyParsedParentQueue.reservationsContinueLooking); + setupQueueConfigs(clusterResource); // Re-configure existing child queues and add new ones // The CS has already checked to ensure all existing child queues are present! @@ -513,7 +475,7 @@ public class ParentQueue extends AbstractCSQueue { labelManager.getResourceByLabel(label, clusterResource)); // if any of the label doesn't beyond limit, we can allocate on this node if (currentAbsoluteLabelUsedCapacity >= - getAbsoluteMaximumCapacityByNodeLabel(label)) { + queueCapacities.getAbsoluteMaximumCapacity(label)) { if (LOG.isDebugEnabled()) { LOG.debug(getQueueName() + " used=" + queueUsage.getUsed() + " current-capacity (" + queueUsage.getUsed(label) + ") " @@ -541,7 +503,8 @@ public class ParentQueue extends AbstractCSQueue { Resources.subtract(queueUsage.getUsed(), reservedResources), clusterResource); - if (capacityWithoutReservedCapacity <= absoluteMaxCapacity) { + if (capacityWithoutReservedCapacity <= queueCapacities + .getAbsoluteMaximumCapacity()) { if (LOG.isDebugEnabled()) { LOG.debug("parent: try to use reserved: " + getQueueName() + " usedResources: " + queueUsage.getUsed().getMemory() @@ -551,7 +514,7 @@ public class ParentQueue extends AbstractCSQueue { / clusterResource.getMemory() + " potentialNewWithoutReservedCapacity: " + capacityWithoutReservedCapacity + " ( " + " max-capacity: " - + absoluteMaxCapacity + ")"); + + queueCapacities.getAbsoluteMaximumCapacity() + ")"); } // we could potentially use this node instead of reserved node return true; @@ -761,13 +724,6 @@ public class ParentQueue extends AbstractCSQueue { } } } - - @Override - public float getAbsActualCapacity() { - // for now, simply return actual capacity = guaranteed capacity for parent - // queue - return absoluteCapacity; - } public synchronized int getNumApplications() { return numApplications; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/PlanQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/PlanQueue.java index f8b11ebf0dc..7b53ad5e497 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/PlanQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/PlanQueue.java @@ -19,8 +19,6 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import org.apache.hadoop.yarn.api.records.Resource; @@ -99,16 +97,7 @@ public class PlanQueue extends ParentQueue { } // Set new configs - setupQueueConfigs(clusterResource, newlyParsedParentQueue.getCapacity(), - newlyParsedParentQueue.getAbsoluteCapacity(), - newlyParsedParentQueue.getMaximumCapacity(), - newlyParsedParentQueue.getAbsoluteMaximumCapacity(), - newlyParsedParentQueue.getState(), newlyParsedParentQueue.getACLs(), - newlyParsedParentQueue.accessibleLabels, - newlyParsedParentQueue.defaultLabelExpression, - newlyParsedParentQueue.capacitiyByNodeLabels, - newlyParsedParentQueue.maxCapacityByNodeLabels, - newlyParsedParentQueue.getReservationContinueLooking()); + setupQueueConfigs(clusterResource); updateQuotas(newlyParsedParentQueue.userLimit, newlyParsedParentQueue.userLimitFactor, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/QueueCapacities.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/QueueCapacities.java index a0e6d8c9b17..962a636eb02 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/QueueCapacities.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/QueueCapacities.java @@ -19,12 +19,18 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; +import org.apache.commons.lang.StringUtils; import org.apache.hadoop.yarn.nodelabels.CommonNodeLabelsManager; +import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; + +import com.google.common.collect.Sets; public class QueueCapacities { private static final String NL = CommonNodeLabelsManager.NO_LABEL; @@ -32,13 +38,15 @@ public class QueueCapacities { private Map capacitiesMap; private ReadLock readLock; private WriteLock writeLock; + private final boolean isRoot; - public QueueCapacities() { + public QueueCapacities(boolean isRoot) { ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); readLock = lock.readLock(); writeLock = lock.writeLock(); capacitiesMap = new HashMap(); + this.isRoot = isRoot; } // Usage enum here to make implement cleaner @@ -58,6 +66,18 @@ public class QueueCapacities { public Capacities() { capacitiesArr = new float[CapacityType.values().length]; } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{used=" + capacitiesArr[0] + "%, "); + sb.append("abs_used=" + capacitiesArr[1] + "%, "); + sb.append("max_cap=" + capacitiesArr[2] + "%, "); + sb.append("abs_max_cap=" + capacitiesArr[3] + "%, "); + sb.append("cap=" + capacitiesArr[4] + "%, "); + sb.append("abs_cap=" + capacitiesArr[5] + "%}"); + return sb.toString(); + } } private float _get(String label, CapacityType type) { @@ -127,6 +147,10 @@ public class QueueCapacities { } public float getCapacity(String label) { + if (StringUtils.equals(label, RMNodeLabelsManager.NO_LABEL) && isRoot) { + return 1f; + } + return _get(label, CapacityType.CAP); } @@ -144,6 +168,9 @@ public class QueueCapacities { } public float getAbsoluteCapacity(String label) { + if (StringUtils.equals(label, RMNodeLabelsManager.NO_LABEL) && isRoot) { + return 1f; + } return _get(label, CapacityType.ABS_CAP); } @@ -188,4 +215,43 @@ public class QueueCapacities { public void setAbsoluteMaximumCapacity(String label, float value) { _set(label, CapacityType.ABS_MAX_CAP, value); } + + /** + * Clear configurable fields, like + * (absolute)capacity/(absolute)maximum-capacity, this will be used by queue + * reinitialize, when we reinitialize a queue, we will first clear all + * configurable fields, and load new values + */ + public void clearConfigurableFields() { + try { + writeLock.lock(); + for (String label : capacitiesMap.keySet()) { + _set(label, CapacityType.CAP, 0); + _set(label, CapacityType.MAX_CAP, 0); + _set(label, CapacityType.ABS_CAP, 0); + _set(label, CapacityType.ABS_MAX_CAP, 0); + } + } finally { + writeLock.unlock(); + } + } + + public Set getExistingNodeLabels() { + try { + readLock.lock(); + return new HashSet(capacitiesMap.keySet()); + } finally { + readLock.unlock(); + } + } + + @Override + public String toString() { + try { + readLock.lock(); + return this.capacitiesMap.toString(); + } finally { + readLock.unlock(); + } + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java index c4424b57df4..a8d17cfd0d1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java @@ -62,11 +62,11 @@ public class ReservationQueue extends LeafQueue { throw new IOException("Trying to reinitialize " + getQueuePath() + " from " + newlyParsedQueue.getQueuePath()); } + super.reinitialize(newlyParsedQueue, clusterResource); CSQueueUtils.updateQueueStatistics( parent.schedulerContext.getResourceCalculator(), newlyParsedQueue, parent, parent.schedulerContext.getClusterResource(), parent.schedulerContext.getMinimumResourceCapability()); - super.reinitialize(newlyParsedQueue, clusterResource); updateQuotas(parent.getUserLimitForReservation(), parent.getUserLimitFactor(), parent.getMaxApplicationsForReservations(), @@ -108,9 +108,9 @@ public class ReservationQueue extends LeafQueue { maxApplicationsPerUser = maxAppsPerUserForReservation; } - // used by the super constructor, we initialize to zero - protected float getCapacityFromConf() { - return 0f; + @Override + protected void setupConfigurableCapacities() { + CSQueueUtils.updateAndCheckCapacitiesByLabel(getQueuePath(), + queueCapacities, parent == null ? null : parent.getQueueCapacities()); } - } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCSQueueUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCSQueueUtils.java index d643c9dc0ef..5135ba9be9d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCSQueueUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCSQueueUtils.java @@ -202,33 +202,33 @@ public class TestCSQueueUtils { LOG.info("t2 l2q2 " + result); //some usage, but below the base capacity - root.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); - l1q2.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); + root.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); + l1q2.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); result = CSQueueUtils.getAbsoluteMaxAvailCapacity( resourceCalculator, clusterResource, l2q2); assertEquals( 0.4f, result, 0.000001f); LOG.info("t2 l2q2 " + result); //usage gt base on parent sibling - root.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.3f)); - l1q2.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.3f)); + root.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.3f)); + l1q2.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.3f)); result = CSQueueUtils.getAbsoluteMaxAvailCapacity( resourceCalculator, clusterResource, l2q2); assertEquals( 0.3f, result, 0.000001f); LOG.info("t2 l2q2 " + result); //same as last, but with usage also on direct parent - root.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); - l1q1.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); + root.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); + l1q1.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.1f)); result = CSQueueUtils.getAbsoluteMaxAvailCapacity( resourceCalculator, clusterResource, l2q2); assertEquals( 0.3f, result, 0.000001f); LOG.info("t2 l2q2 " + result); //add to direct sibling, below the threshold of effect at present - root.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); - l1q1.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); - l2q1.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); + root.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); + l1q1.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); + l2q1.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); result = CSQueueUtils.getAbsoluteMaxAvailCapacity( resourceCalculator, clusterResource, l2q2); assertEquals( 0.3f, result, 0.000001f); @@ -236,9 +236,9 @@ public class TestCSQueueUtils { //add to direct sibling, now above the threshold of effect //(it's cumulative with prior tests) - root.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); - l1q1.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); - l2q1.getResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); + root.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); + l1q1.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); + l2q1.getQueueResourceUsage().incUsed(Resources.multiply(clusterResource, 0.2f)); result = CSQueueUtils.getAbsoluteMaxAvailCapacity( resourceCalculator, clusterResource, l2q2); assertEquals( 0.1f, result, 0.000001f); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java index 38d9d27f3c5..fabf47de467 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacityScheduler.java @@ -389,11 +389,11 @@ public class TestCapacityScheduler { public void testMaximumCapacitySetup() { float delta = 0.0000001f; CapacitySchedulerConfiguration conf = new CapacitySchedulerConfiguration(); - assertEquals(CapacitySchedulerConfiguration.MAXIMUM_CAPACITY_VALUE,conf.getMaximumCapacity(A),delta); + assertEquals(CapacitySchedulerConfiguration.MAXIMUM_CAPACITY_VALUE,conf.getNonLabeledQueueMaximumCapacity(A),delta); conf.setMaximumCapacity(A, 50.0f); - assertEquals(50.0f, conf.getMaximumCapacity(A),delta); + assertEquals(50.0f, conf.getNonLabeledQueueMaximumCapacity(A),delta); conf.setMaximumCapacity(A, -1); - assertEquals(CapacitySchedulerConfiguration.MAXIMUM_CAPACITY_VALUE,conf.getMaximumCapacity(A),delta); + assertEquals(CapacitySchedulerConfiguration.MAXIMUM_CAPACITY_VALUE,conf.getNonLabeledQueueMaximumCapacity(A),delta); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNodeLabelUpdate.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNodeLabelUpdate.java index 923c0a34990..1e339d9ec40 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNodeLabelUpdate.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNodeLabelUpdate.java @@ -91,7 +91,8 @@ public class TestCapacitySchedulerNodeLabelUpdate { String label) { CapacityScheduler scheduler = (CapacityScheduler) rm.getResourceScheduler(); CSQueue queue = scheduler.getQueue(queueName); - Assert.assertEquals(memory, queue.getUsedResourceByLabel(label).getMemory()); + Assert.assertEquals(memory, queue.getQueueResourceUsage().getUsed(label) + .getMemory()); } @Test (timeout = 30000) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueCapacities.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueCapacities.java index 6d2a42180f3..d543f801162 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueCapacities.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueCapacities.java @@ -99,7 +99,7 @@ public class TestQueueCapacities { } private void internalTestModifyAndRead(String label) throws Exception { - QueueCapacities qc = new QueueCapacities(); + QueueCapacities qc = new QueueCapacities(false); // First get returns 0 always Assert.assertEquals(0f, get(qc, suffix, label), 1e-8); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueParsing.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueParsing.java index f821e64d3c9..34f7c2c0a2d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueParsing.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestQueueParsing.java @@ -468,18 +468,18 @@ public class TestQueueParsing { // check capacity of A2 CSQueue qA2 = capacityScheduler.getQueue("a2"); Assert.assertEquals(0.7, qA2.getCapacity(), DELTA); - Assert.assertEquals(0.5, qA2.getCapacityByNodeLabel("red"), DELTA); + Assert.assertEquals(0.5, qA2.getQueueCapacities().getCapacity("red"), DELTA); Assert.assertEquals(0.07, qA2.getAbsoluteCapacity(), DELTA); - Assert.assertEquals(0.25, qA2.getAbsoluteCapacityByNodeLabel("red"), DELTA); + Assert.assertEquals(0.25, qA2.getQueueCapacities().getAbsoluteCapacity("red"), DELTA); Assert.assertEquals(0.1275, qA2.getAbsoluteMaximumCapacity(), DELTA); - Assert.assertEquals(0.3, qA2.getAbsoluteMaximumCapacityByNodeLabel("red"), DELTA); + Assert.assertEquals(0.3, qA2.getQueueCapacities().getAbsoluteMaximumCapacity("red"), DELTA); // check capacity of B3 CSQueue qB3 = capacityScheduler.getQueue("b3"); Assert.assertEquals(0.18, qB3.getAbsoluteCapacity(), DELTA); - Assert.assertEquals(0.125, qB3.getAbsoluteCapacityByNodeLabel("red"), DELTA); + Assert.assertEquals(0.125, qB3.getQueueCapacities().getAbsoluteCapacity("red"), DELTA); Assert.assertEquals(0.35, qB3.getAbsoluteMaximumCapacity(), DELTA); - Assert.assertEquals(1, qB3.getAbsoluteMaximumCapacityByNodeLabel("red"), DELTA); + Assert.assertEquals(1, qB3.getQueueCapacities().getAbsoluteMaximumCapacity("red"), DELTA); } private void @@ -691,8 +691,8 @@ public class TestQueueParsing { // check root queue's capacity by label -- they should be all zero CSQueue root = capacityScheduler.getQueue(CapacitySchedulerConfiguration.ROOT); - Assert.assertEquals(0, root.getCapacityByNodeLabel("red"), DELTA); - Assert.assertEquals(0, root.getCapacityByNodeLabel("blue"), DELTA); + Assert.assertEquals(0, root.getQueueCapacities().getCapacity("red"), DELTA); + Assert.assertEquals(0, root.getQueueCapacities().getCapacity("blue"), DELTA); CSQueue a = capacityScheduler.getQueue("a"); Assert.assertEquals(0.10, a.getAbsoluteCapacity(), DELTA); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java index 94040b5db22..ba5c73be693 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesCapacitySched.java @@ -395,9 +395,9 @@ public class TestRMWebServicesCapacitySched extends JerseyTestBase { String qshortName = qArr[qArr.length - 1]; assertEquals("usedCapacity doesn't match", 0, info.usedCapacity, 1e-3f); - assertEquals("capacity doesn't match", csConf.getCapacity(q), + assertEquals("capacity doesn't match", csConf.getNonLabeledQueueCapacity(q), info.capacity, 1e-3f); - float expectCapacity = csConf.getMaximumCapacity(q); + float expectCapacity = csConf.getNonLabeledQueueMaximumCapacity(q); float expectAbsMaxCapacity = parentAbsMaxCapacity * (info.maxCapacity/100); if (CapacitySchedulerConfiguration.UNDEFINED == expectCapacity) { expectCapacity = 100;