From 7f3c4ca8b3a945dca50e18cf96f6ae8e6877a6d9 Mon Sep 17 00:00:00 2001 From: liubin04 Date: Tue, 5 Jul 2022 11:47:37 +0800 Subject: [PATCH] YARN-11206. Consider queue's max capacity as max am resource limit for labeled partition --- .../scheduler/capacity/LeafQueue.java | 2 + .../TestApplicationLimitsByPartition.java | 39 +++++++++++++++++++ .../scheduler/capacity/TestUtils.java | 35 +++++++++++++++++ 3 files changed, 76 insertions(+) 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 64b15363792..8614267166e 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 @@ -746,6 +746,8 @@ public Resource calculateAndGetAMResourceLimitPerPartition( synchronized (queueResourceLimitsInfo){ queueCurrentLimit = queueResourceLimitsInfo.getQueueCurrentLimit(); } + }else { + queueCurrentLimit = getEffectiveMaxCapacity(nodePartition); } float amResourcePercent = queueCapacities.getMaxAMResourcePercentage( 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/TestApplicationLimitsByPartition.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/TestApplicationLimitsByPartition.java index 9ff066d9ef5..d1728f750e8 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/TestApplicationLimitsByPartition.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/TestApplicationLimitsByPartition.java @@ -269,6 +269,45 @@ public RMNodeLabelsManager createNodeLabelManager() { rm1.close(); } + @Test(timeout = 120000) + public void testCalculateAMResourceLimitPerPartition() throws Exception { + + simpleNodeLabelMappingToManager(); + CapacitySchedulerConfiguration config = (CapacitySchedulerConfiguration) + TestUtils.getConfigurationWithNodeLabels(conf); + config.setResourceComparator(DominantResourceCalculator.class); + + // Now inject node label manager with this updated config + MockRM rm1 = new MockRM(config) { + @Override + public RMNodeLabelsManager createNodeLabelManager() { + return mgr; + } + }; + + rm1.getRMContext().setNodeLabelManager(mgr); + rm1.start(); + MockNM nm1 = rm1.registerNode("h1:1234", 100 * GB, 100); // label = x + MockNM nm3 = rm1.registerNode("h3:1234", 100 * GB, 100); // label = + + CapacityScheduler cs = (CapacityScheduler) rm1.getResourceScheduler(); + LeafQueue a = (LeafQueue) cs.getQueue("a"); + Assert.assertNotNull(a); + + assertEquals(Resource.newInstance(100 * GB, 100), + a.getEffectiveMaxCapacity("x")); + assertEquals(Resource.newInstance(10 * GB, 10), + a.calculateAndGetAMResourceLimitPerPartition("x")); + + LeafQueue c = (LeafQueue) cs.getQueue("c"); + Assert.assertNotNull(c); + + assertEquals(Resource.newInstance(7 * GB, 7), + c.calculateAndGetAMResourceLimit()); + + rm1.close(); + } + @Test(timeout = 120000) public void testAtleastOneAMRunPerPartition() throws Exception { /* 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/TestUtils.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/TestUtils.java index 44b445156dd..69a5e253440 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/TestUtils.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/TestUtils.java @@ -321,6 +321,41 @@ public static Configuration getConfigurationWithQueueLabels(Configuration config return conf; } + public static Configuration getConfigurationWithNodeLabels(Configuration config) { + CapacitySchedulerConfiguration conf = + new CapacitySchedulerConfiguration(config); + + // Define top-level queues + conf.setQueues(CapacitySchedulerConfiguration.ROOT, new String[] {"a", "b", "c", "d"}); + conf.setCapacityByLabel(CapacitySchedulerConfiguration.ROOT, "x", 100); + + final String A = CapacitySchedulerConfiguration.ROOT + ".a"; + conf.setCapacity(A, 10); + conf.setMaximumCapacity(A, 50); + conf.setAccessibleNodeLabels(A, toSet("x")); + conf.setCapacityByLabel(A, "x", 30); + conf.setMaximumCapacityByLabel(A, "x", 100); + + final String B = CapacitySchedulerConfiguration.ROOT + ".b"; + conf.setCapacity(B, 20); + conf.setMaximumCapacity(A, 50); + conf.setAccessibleNodeLabels(B, toSet("x")); + conf.setCapacityByLabel(B, "x", 70); + conf.setMaximumCapacityByLabel(B, "x", 100); + + final String C = CapacitySchedulerConfiguration.ROOT + ".c"; + conf.setCapacity(C, 30); + conf.setMaximumCapacity(C, 70); + conf.setAccessibleNodeLabels(C, RMNodeLabelsManager.EMPTY_STRING_SET); + + final String D = CapacitySchedulerConfiguration.ROOT + ".d"; + conf.setCapacity(D, 40); + conf.setMaximumCapacity(D, 70); + conf.setAccessibleNodeLabels(D, RMNodeLabelsManager.EMPTY_STRING_SET); + + return conf; + } + public static Configuration getComplexConfigurationWithQueueLabels( Configuration config) { CapacitySchedulerConfiguration conf = -- 2.24.3 (Apple Git-128)