From f509d98358bcfa9b599c911a90f00c64bc54283b Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Mon, 20 Sep 2021 10:57:32 +0200 Subject: [PATCH 1/4] YARN-10823. Expose all node labels for root without explicit configurations --- .../scheduler/capacity/AbstractCSQueue.java | 10 ++++-- .../capacity/ConfiguredNodeLabels.java | 10 ++++++ .../scheduler/capacity/TestLeafQueue.java | 32 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) 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 f0d06392404c4..02dbb700e2ca0 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 @@ -77,6 +77,7 @@ 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.ROOT; import static org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.UNDEFINED; public abstract class AbstractCSQueue implements CSQueue { @@ -463,8 +464,13 @@ private void initializeNodeLabels( if (csContext.getCapacitySchedulerQueueManager() != null && csContext.getCapacitySchedulerQueueManager() .getConfiguredNodeLabels() != null) { - this.configuredNodeLabels = csContext.getCapacitySchedulerQueueManager() - .getConfiguredNodeLabels().getLabelsByQueue(getQueuePath()); + if (getQueuePath().equals(ROOT)) { + this.configuredNodeLabels = csContext.getCapacitySchedulerQueueManager() + .getConfiguredNodeLabels().getAllConfiguredLabels(); + } else { + this.configuredNodeLabels = csContext.getCapacitySchedulerQueueManager() + .getConfiguredNodeLabels().getLabelsByQueue(getQueuePath()); + } } else { // Fallback to suboptimal but correct logic this.configuredNodeLabels = csContext.getConfiguration() 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 index ba82c6a450f11..e9f5826d03768 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/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 @@ -25,6 +25,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * Contains node labels for all queues extracted from configuration properties. @@ -74,4 +75,13 @@ public void setLabelsByQueue( String queuePath, Collection nodeLabels) { configuredNodeLabelsByQueue.put(queuePath, new HashSet<>(nodeLabels)); } + + /** + * Get all configured node labels aggregated from each queue. + * @return all node labels + */ + public Set getAllConfiguredLabels() { + return configuredNodeLabelsByQueue.values().stream() + .flatMap(Set::stream).collect(Collectors.toSet()); + } } 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/TestLeafQueue.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/TestLeafQueue.java index aa342af0dfd4f..f9126161c60db 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/TestLeafQueue.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/TestLeafQueue.java @@ -53,6 +53,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.apache.hadoop.thirdparty.com.google.common.collect.ImmutableMap; +import org.apache.hadoop.util.Sets; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hadoop.conf.Configuration; @@ -5216,6 +5217,37 @@ public void testMaxApplicationsWithNodeLabels() throws IOException { e.getMaxApplications()); } + @Test + public void testRootHasAllNodeLabelsOfItsDescendants() throws IOException { + CapacitySchedulerConfiguration conf = csConf; + String rootChild = root.getChildQueues().get(0).getQueuePath(); + + conf.setCapacityByLabel(rootChild, "test", 100); + conf.setCapacityByLabel(rootChild + "." + A, "test", 20); + conf.setCapacityByLabel(rootChild + "." + B, "test", 40); + conf.setCapacityByLabel(rootChild + "." + C, "test", 10); + conf.setCapacityByLabel(rootChild + "." + C + "." + C1, "test", 100); + conf.setCapacityByLabel(rootChild + "." + D, "test", 30); + conf.setCapacityByLabel(rootChild + "." + E, "test", 0); + + conf.setCapacityByLabel(rootChild, "test2", 100); + conf.setCapacityByLabel(rootChild + "." + A, "test2", 20); + conf.setCapacityByLabel(rootChild + "." + B, "test2", 40); + conf.setCapacityByLabel(rootChild + "." + C, "test2", 10); + conf.setCapacityByLabel(rootChild + "." + C + "." + C1, "test2", 100); + conf.setCapacityByLabel(rootChild + "." + D, "test2", 30); + conf.setCapacityByLabel(rootChild + "." + E, "test2", 0); + + cs.getCapacitySchedulerQueueManager().reinitConfiguredNodeLabels(conf); + cs.setMaxRunningAppsEnforcer(new CSMaxRunningAppsEnforcer(cs)); + cs.reinitialize(conf, cs.getRMContext()); + + ParentQueue root = (ParentQueue) cs.getRootQueue(); + + Assert.assertEquals(Sets.newHashSet("", "test", "test2"), + root.configuredNodeLabels); + } + @After public void tearDown() throws Exception { if (cs != null) { From ef560cd508c719956dd518e48e27cfc28b136cc3 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Tue, 21 Sep 2021 13:22:34 +0200 Subject: [PATCH 2/4] YARN-10823. Fix default node label if no label is defined --- .../scheduler/capacity/ConfiguredNodeLabels.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 index e9f5826d03768..5ab9c69d403ed 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/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 @@ -81,7 +81,13 @@ public void setLabelsByQueue( * @return all node labels */ public Set getAllConfiguredLabels() { - return configuredNodeLabelsByQueue.values().stream() + Set nodeLabels = configuredNodeLabelsByQueue.values().stream() .flatMap(Set::stream).collect(Collectors.toSet()); + + if (nodeLabels.size() == 0) { + nodeLabels = NO_LABEL; + } + + return nodeLabels; } } From 9ccb438ac85e657b4204d99bf5a8203f34f0c333 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Thu, 23 Sep 2021 13:27:22 +0200 Subject: [PATCH 3/4] YARN-10823. Fix checkstyle issues --- .../resourcemanager/scheduler/capacity/TestLeafQueue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/TestLeafQueue.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/TestLeafQueue.java index f9126161c60db..faca0d1a43889 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/TestLeafQueue.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/TestLeafQueue.java @@ -5242,7 +5242,7 @@ public void testRootHasAllNodeLabelsOfItsDescendants() throws IOException { cs.setMaxRunningAppsEnforcer(new CSMaxRunningAppsEnforcer(cs)); cs.reinitialize(conf, cs.getRMContext()); - ParentQueue root = (ParentQueue) cs.getRootQueue(); + ParentQueue rootQueue = (ParentQueue) cs.getRootQueue(); Assert.assertEquals(Sets.newHashSet("", "test", "test2"), root.configuredNodeLabels); From 957fb89f8ac36e839952df65b952b6d008f8bf33 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Thu, 23 Sep 2021 13:57:22 +0200 Subject: [PATCH 4/4] YARN-10823. Fix build error --- .../resourcemanager/scheduler/capacity/TestLeafQueue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/TestLeafQueue.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/TestLeafQueue.java index faca0d1a43889..4242df83776c1 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/TestLeafQueue.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/TestLeafQueue.java @@ -5245,7 +5245,7 @@ public void testRootHasAllNodeLabelsOfItsDescendants() throws IOException { ParentQueue rootQueue = (ParentQueue) cs.getRootQueue(); Assert.assertEquals(Sets.newHashSet("", "test", "test2"), - root.configuredNodeLabels); + rootQueue.configuredNodeLabels); } @After