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 be9a0e36391..b78540bbb67 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 @@ -76,6 +76,7 @@ import java.util.Set; import java.util.concurrent.locks.ReentrantReadWriteLock; +import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.DOT; import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.UNDEFINED; public abstract class AbstractCSQueue implements CSQueue { @@ -95,6 +96,7 @@ final ResourceCalculator resourceCalculator; Set accessibleLabels; + Set configuredLabels; Set resourceTypes; final RMNodeLabelsManager labelManager; String defaultLabelExpression; @@ -208,7 +210,7 @@ protected void setupConfigurableCapacities() { protected void setupConfigurableCapacities( CapacitySchedulerConfiguration configuration) { CSQueueUtils.loadCapacitiesByLabelsFromConf(getQueuePath(), queueCapacities, - configuration); + configuration, getConfiguredLabels()); } @Override @@ -360,10 +362,7 @@ protected void setupQueueConfigs(Resource clusterResource, writeLock.lock(); try { - if (isDynamicQueue() && getParent() instanceof ParentQueue) { - ((ParentQueue) getParent()).getAutoCreatedQueueTemplate() - .setTemplateEntriesForChild(configuration, getQueuePath()); - } + handleAutoQueueTemplates(configuration); // get labels this.accessibleLabels = configuration.getAccessibleNodeLabels(getQueuePath()); @@ -387,6 +386,9 @@ protected void setupQueueConfigs(Resource clusterResource, this.defaultLabelExpression = parent.getDefaultNodeLabelExpression(); } + this.configuredLabels = csContext.getCapacitySchedulerQueueManager() + .getConfiguredNodeLabels().getLabelsByQueue(getQueuePath()); + // After we setup labels, we can setup capacities setupConfigurableCapacities(configuration); updateAbsoluteCapacities(); @@ -478,6 +480,27 @@ protected void setupQueueConfigs(Resource clusterResource, } } + protected void handleAutoQueueTemplates( + CapacitySchedulerConfiguration configuration) { + if (isDynamicQueue() && getParent() instanceof ParentQueue) { + ((ParentQueue) getParent()).getAutoCreatedQueueTemplate() + .setTemplateEntriesForChild(configuration, getQueuePath()); + + String parentTemplate = String.format("%s.%s", getParent().getQueuePath(), + AutoCreatedQueueTemplate.AUTO_QUEUE_TEMPLATE_PREFIX); + parentTemplate = parentTemplate.substring(0, parentTemplate.lastIndexOf( + DOT)); + Set parentNodeLabels = csContext + .getCapacitySchedulerQueueManager().getConfiguredNodeLabels() + .getLabelsByQueue(parentTemplate); + + if (parentNodeLabels != null && parentNodeLabels.size() > 1) { + csContext.getCapacitySchedulerQueueManager().getConfiguredNodeLabels() + .setLabelsByQueue(queuePath, new HashSet<>(parentNodeLabels)); + } + } + } + private void setupMaximumAllocation(CapacitySchedulerConfiguration csConf) { String myQueuePath = getQueuePath(); Resource clusterMax = ResourceUtils @@ -559,8 +582,7 @@ protected boolean checkConfigTypeIsAbsoluteResource(String queuePath, protected void updateConfigurableResourceRequirement(String queuePath, Resource clusterResource) { - CapacitySchedulerConfiguration conf = csContext.getConfiguration(); - Set configuredNodelabels = conf.getConfiguredNodeLabels(queuePath); + Set configuredNodelabels = getConfiguredLabels(); for (String label : configuredNodelabels) { Resource minResource = getMinimumAbsoluteResource(queuePath, label); @@ -1566,8 +1588,7 @@ private void deriveCapacityFromAbsoluteConfigurations(String label, } void updateEffectiveResources(Resource clusterResource) { - Set configuredNodelabels = - csContext.getConfiguration().getConfiguredNodeLabels(getQueuePath()); + Set configuredNodelabels = getConfiguredLabels(); for (String label : configuredNodelabels) { Resource resourceByLabel = labelManager.getResourceByLabel(label, clusterResource); @@ -1704,4 +1725,7 @@ public void setLastSubmittedTimestamp(long lastSubmittedTimestamp) { } } + public Set getConfiguredLabels() { + return configuredLabels; + } } 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/AutoCreatedLeafQueue.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/AutoCreatedLeafQueue.java index dd77a8088c0..00e32e52def 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/AutoCreatedLeafQueue.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/AutoCreatedLeafQueue.java @@ -19,7 +19,6 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; import org.apache.hadoop.yarn.api.records.Resource; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceLimits; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerDynamicEditException; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.QueueEntitlement; @@ -28,6 +27,8 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.HashSet; +import java.util.Set; /** * Leaf queues which are auto created by an underlying implementation of @@ -122,6 +123,23 @@ public void validateConfigurations(AutoCreatedLeafQueueConfig template) } } + @Override + protected void handleAutoQueueTemplates( + CapacitySchedulerConfiguration configuration) { + String parentTemplate = String.format("%s.%s", getParent().getQueuePath(), + CapacitySchedulerConfiguration + .AUTO_CREATED_LEAF_QUEUE_TEMPLATE_PREFIX); + Set parentNodeLabels = csContext + .getCapacitySchedulerQueueManager().getConfiguredNodeLabels() + .getLabelsByQueue(parentTemplate); + + if (parentNodeLabels != null && parentNodeLabels.size() > 1) { + csContext.getCapacitySchedulerQueueManager().getConfiguredNodeLabels() + .setLabelsByQueue(getQueuePath(), + new HashSet<>(parentNodeLabels)); + } + } + private void validate(final CSQueue newlyParsedQueue) throws IOException { if (!(newlyParsedQueue instanceof AutoCreatedLeafQueue) || !newlyParsedQueue .getQueuePath().equals(getQueuePath())) { 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 e2865cf5c1b..f43ea300017 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 @@ -66,13 +66,12 @@ public static float computeAbsoluteMaximumCapacity( return (parentAbsMaxCapacity * maximumCapacity); } - public static void loadCapacitiesByLabelsFromConf(String queuePath, - QueueCapacities queueCapacities, CapacitySchedulerConfiguration csConf) { + public static void loadCapacitiesByLabelsFromConf( + String queuePath, QueueCapacities queueCapacities, + CapacitySchedulerConfiguration csConf, Set nodeLabels) { queueCapacities.clearConfigurableFields(); - Set configuredNodelabels = - csConf.getConfiguredNodeLabels(queuePath); - for (String label : configuredNodelabels) { + for (String label : nodeLabels) { if (label.equals(CommonNodeLabelsManager.NO_LABEL)) { queueCapacities.setCapacity(label, csConf.getNonLabeledQueueCapacity(queuePath) / 100); 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 074e3711ba7..c63e36d67c0 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 @@ -1563,6 +1563,42 @@ public boolean getIntraQueuePreemptionDisabled(String queue, return configuredNodeLabels; } + /** + * Get configured node labels for all queues that have accessible-node-labels + * prefixed properties set. + * @return configured node labels + */ + public Map> getConfiguredNodeLabelsByQueue() { + Map> labelsByQueue = new HashMap<>(); + Map schedulerEntries = getPropsWithPrefix( + CapacitySchedulerConfiguration.PREFIX); + + for (Map.Entry stringStringEntry + : schedulerEntries.entrySet()) { + String key = stringStringEntry.getKey(); + // Consider all keys that has accessible-node-labels prefix, excluding + // .accessible-node-labels itself + if (key.contains(ACCESSIBLE_NODE_LABELS + DOT)) { + // Find in + // .accessible-node-labels..property + int labelStartIdx = + key.indexOf(ACCESSIBLE_NODE_LABELS) + + ACCESSIBLE_NODE_LABELS.length() + 1; + int labelEndIndx = key.indexOf('.', labelStartIdx); + String labelName = key.substring(labelStartIdx, labelEndIndx); + // Find queuePath and exclude "." at the end + String queuePath = key.substring(0, key.indexOf( + ACCESSIBLE_NODE_LABELS) - 1); + if (!labelsByQueue.containsKey(queuePath)) { + labelsByQueue.put(queuePath, new HashSet<>()); + labelsByQueue.get(queuePath).add(RMNodeLabelsManager.NO_LABEL); + } + labelsByQueue.get(queuePath).add(labelName); + } + } + return labelsByQueue; + } + public Integer getDefaultApplicationPriorityConfPerQueue(String queue) { Integer defaultPriority = getInt(getQueuePrefix(queue) + DEFAULT_APPLICATION_PRIORITY, 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/CapacitySchedulerQueueManager.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/CapacitySchedulerQueueManager.java index a86a2536d05..e5b41cede3a 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/CapacitySchedulerQueueManager.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/CapacitySchedulerQueueManager.java @@ -84,6 +84,7 @@ public CSQueue hook(CSQueue queue) { private QueueStateManager queueStateManager; + private ConfiguredNodeLabels configuredNodeLabels; /** * Construct the service. @@ -98,6 +99,7 @@ public CapacitySchedulerQueueManager(Configuration conf, this.labelManager = labelManager; this.queueStateManager = new QueueStateManager<>(); this.appPriorityACLManager = appPriorityACLManager; + this.configuredNodeLabels = new ConfiguredNodeLabels(); } @Override @@ -165,6 +167,7 @@ public void setCapacitySchedulerContext( */ public void initializeQueues(CapacitySchedulerConfiguration conf) throws IOException { + configuredNodeLabels = new ConfiguredNodeLabels(conf); root = parseQueue(this.csContext, conf, null, CapacitySchedulerConfiguration.ROOT, queues, queues, NOOP); setQueueAcls(authorizer, appPriorityACLManager, queues); @@ -180,6 +183,7 @@ public void reinitializeQueues(CapacitySchedulerConfiguration newConf) throws IOException { // Parse new queues CSQueueStore newQueues = new CSQueueStore(); + configuredNodeLabels = new ConfiguredNodeLabels(newConf); CSQueue newRoot = parseQueue(this.csContext, newConf, null, CapacitySchedulerConfiguration.ROOT, newQueues, queues, NOOP); @@ -619,6 +623,15 @@ public LeafQueue createQueue(ApplicationPlacementContext queue) return parentsToCreate; } + /** + * Get {@code ConfiguredNodeLabels} which contains the configured node labels + * for all queues. + * @return configured node labels + */ + public ConfiguredNodeLabels getConfiguredNodeLabels() { + return configuredNodeLabels; + } + private LeafQueue createAutoQueue(ApplicationPlacementContext queue) throws SchedulerDynamicEditException { List parentsToCreate = determineMissingParents(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/ConfiguredNodeLabels.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/ConfiguredNodeLabels.java new file mode 100644 index 00000000000..8142eae05e2 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ConfiguredNodeLabels.java @@ -0,0 +1,77 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; + +import org.apache.hadoop.thirdparty.com.google.common.collect.ImmutableSet; +import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Contains node labels for all queues extracted from configuration properties. + * A queue has a configured node label if it has a property set with an + * accessible-node-labels prefix. + * Example: + * yarn.scheduler.capacity.root.accessible-node-labels.test-label.capacity + */ +public class ConfiguredNodeLabels { + private final Map> configuredNodeLabelsByQueue; + private static final Set NO_LABEL = + ImmutableSet.of(RMNodeLabelsManager.NO_LABEL); + + public ConfiguredNodeLabels() { + configuredNodeLabelsByQueue = new HashMap<>(); + } + + public ConfiguredNodeLabels( + CapacitySchedulerConfiguration conf) { + this.configuredNodeLabelsByQueue = conf.getConfiguredNodeLabelsByQueue(); + } + + /** + * Returns a set of configured node labels for a queue. If no labels are set + * for a queue, it defaults to a one element immutable collection containing + * empty label. + * @param queuePath path of the queue + * @return configured node labels or an immutable set containing the empty + * label + */ + public Set getLabelsByQueue(String queuePath) { + Set labels = configuredNodeLabelsByQueue.get(queuePath); + + if (labels == null) { + return NO_LABEL; + } + + return labels; + } + + /** + * Set node labels for a specific queue. + * @param queuePath path of the queue + * @param nodeLabels configured node labels to set + */ + public void setLabelsByQueue( + String queuePath, Collection nodeLabels) { + configuredNodeLabelsByQueue.put(queuePath, new HashSet<>(nodeLabels)); + } +} 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 71732f65e34..caf7f322f84 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 @@ -147,15 +147,23 @@ @SuppressWarnings({ "unchecked", "rawtypes" }) public LeafQueue(CapacitySchedulerContext cs, String queueName, CSQueue parent, CSQueue old) throws IOException { - this(cs, cs.getConfiguration(), queueName, parent, old); + this(cs, cs.getConfiguration(), queueName, parent, old, false); + } + + public LeafQueue(CapacitySchedulerContext cs, + CapacitySchedulerConfiguration configuration, + String queueName, CSQueue parent, CSQueue old) + throws IOException { + this(cs, configuration, queueName, parent, old, false); } public LeafQueue(CapacitySchedulerContext cs, CapacitySchedulerConfiguration configuration, - String queueName, CSQueue parent, CSQueue old) throws - IOException { + String queueName, CSQueue parent, CSQueue old, boolean isDynamicQueue) + throws IOException { super(cs, configuration, queueName, parent, old); this.scheduler = cs; + setDynamicQueue(isDynamicQueue); this.usersManager = new UsersManager(metrics, this, labelManager, scheduler, resourceCalculator); 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/ManagedParentQueue.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/ManagedParentQueue.java index 88fae00f1b4..e415ac12795 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/ManagedParentQueue.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/ManagedParentQueue.java @@ -37,6 +37,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; /** * Auto Creation enabled Parent queue. This queue initially does not have any @@ -164,10 +165,13 @@ private void reinitializeQueueManagementPolicy() throws IOException { CapacitySchedulerConfiguration conf = super.initializeLeafQueueConfigs(leafQueueTemplateConfPrefix); builder.configuration(conf); + String templateQueuePath = csContext.getConfiguration() + .getAutoCreatedQueueTemplateConfPrefix(getQueuePath()); - for (String nodeLabel : conf - .getConfiguredNodeLabels(csContext.getConfiguration() - .getAutoCreatedQueueTemplateConfPrefix(getQueuePath()))) { + Set templateConfiguredNodeLabels = csContext + .getCapacitySchedulerQueueManager().getConfiguredNodeLabels() + .getLabelsByQueue(templateQueuePath); + for (String nodeLabel : templateConfiguredNodeLabels) { Resource templateMinResource = conf.getMinimumResourceRequirement( nodeLabel, csContext.getConfiguration() .getAutoCreatedQueueTemplateConfPrefix(getQueuePath()), @@ -182,10 +186,10 @@ private void reinitializeQueueManagementPolicy() throws IOException { //Load template capacities QueueCapacities queueCapacities = new QueueCapacities(false); - CSQueueUtils.loadCapacitiesByLabelsFromConf(csContext.getConfiguration() - .getAutoCreatedQueueTemplateConfPrefix(getQueuePath()), + CSQueueUtils.loadCapacitiesByLabelsFromConf(templateQueuePath, queueCapacities, - csContext.getConfiguration()); + csContext.getConfiguration(), + templateConfiguredNodeLabels); /** 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 6b6dd5afd3e..eba78c8c8f1 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 @@ -119,9 +119,16 @@ private ParentQueue(CapacitySchedulerContext cs, CapacitySchedulerConfiguration csConf, String queueName, CSQueue parent, CSQueue old) throws IOException { + this(cs, csConf, queueName, parent, old, false); + } + private ParentQueue(CapacitySchedulerContext cs, + CapacitySchedulerConfiguration csConf, String queueName, CSQueue parent, + CSQueue old, boolean isDynamicQueue) + throws IOException { super(cs, queueName, parent, old); this.scheduler = cs; this.rootQueue = (parent == null); + setDynamicQueue(isDynamicQueue); float rawCapacity = csConf.getNonLabeledQueueCapacity(getQueuePath()); @@ -506,11 +513,11 @@ private CSQueue createNewQueue(String childQueuePath, boolean isLeaf) if (isLeaf) { childQueue = new LeafQueue(csContext, getConfForAutoCreatedQueue(childQueuePath, isLeaf), queueShortName, - this, null); + this, null, true); } else{ childQueue = new ParentQueue(csContext, getConfForAutoCreatedQueue(childQueuePath, isLeaf), queueShortName, - this, null); + this, null, true); } childQueue.setDynamicQueue(true); // It should be sufficient now, we don't need to set more, because weights @@ -1266,8 +1273,7 @@ public void updateClusterResource(Resource clusterResource, } // Update effective capacity in all parent queue. - Set configuredNodelabels = csContext.getConfiguration() - .getConfiguredNodeLabels(getQueuePath()); + Set configuredNodelabels = getConfiguredLabels(); for (String label : configuredNodelabels) { calculateEffectiveResourcesAndCapacity(label, clusterResource); } 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/TestCapacitySchedulerNewQueueAutoCreation.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/TestCapacitySchedulerNewQueueAutoCreation.java index b96c1e48968..d7c0450eeb8 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/TestCapacitySchedulerNewQueueAutoCreation.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/TestCapacitySchedulerNewQueueAutoCreation.java @@ -696,6 +696,21 @@ public void testAutoCreatedQueueTemplateConfig() throws Exception { cs.reinitialize(csConf, mockRM.getRMContext()); Assert.assertEquals("weight is not explicitly set", 4f, a2.getQueueCapacities().getWeight(), 1e-6); + + // Set the capacity of label TEST + csConf.set(AutoCreatedQueueTemplate.getAutoQueueTemplatePrefix( + "root.c") + "accessible-node-labels.TEST.capacity", "6w"); + csConf.setQueues("root", new String[]{"a", "b", "c"}); + csConf.setAutoQueueCreationV2Enabled("root.c", true); + cs.reinitialize(csConf, mockRM.getRMContext()); + LeafQueue c1 = createQueue("root.c.c1"); + Assert.assertEquals("weight is not set for label TEST", 6f, + c1.getQueueCapacities().getWeight("TEST"), 1e-6); + cs.reinitialize(csConf, mockRM.getRMContext()); + c1 = (LeafQueue) cs.getQueue("root.c.c1"); + Assert.assertEquals("weight is not set for label TEST", 6f, + c1.getQueueCapacities().getWeight("TEST"), 1e-6); + } @Test