From 2f7e584c21f6ad8456d14046ab2bfa8d5977dbf7 Mon Sep 17 00:00:00 2001 From: Sunil G Date: Thu, 20 Aug 2020 19:13:03 +0530 Subject: [PATCH] Revert "YARN-10396. Max applications calculation per queue disregards queue level settings in absolute mode. Contributed by Benjamin Teke." This reverts commit 7369fc31b456e2b90893212f499a30755fab5cc9. --- .../scheduler/capacity/ParentQueue.java | 14 +- .../scheduler/capacity/TestParentQueue.java | 134 ++---------------- 2 files changed, 16 insertions(+), 132 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/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 220172818fc..e080d1cd9e7 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 @@ -1114,18 +1114,8 @@ public class ParentQueue extends AbstractCSQueue { if (childQueue instanceof LeafQueue) { LeafQueue leafQueue = (LeafQueue) childQueue; CapacitySchedulerConfiguration conf = csContext.getConfiguration(); - int maxApplications = - conf.getMaximumApplicationsPerQueue(childQueue.getQueuePath()); - if (maxApplications < 0) { - int maxGlobalPerQueueApps = conf.getGlobalMaximumApplicationsPerQueue(); - if (maxGlobalPerQueueApps > 0) { - maxApplications = (int) (maxGlobalPerQueueApps * - childQueue.getQueueCapacities().getAbsoluteCapacity(label)); - } else { - maxApplications = (int) (conf.getMaximumSystemApplications() - * childQueue.getQueueCapacities().getAbsoluteCapacity(label)); - } - } + int maxApplications = (int) (conf.getMaximumSystemApplications() + * childQueue.getQueueCapacities().getAbsoluteCapacity(label)); leafQueue.setMaxApplications(maxApplications); int maxApplicationsPerUser = Math.min(maxApplications, 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/TestParentQueue.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/TestParentQueue.java index 896bcb1a24c..fe66aba05ef 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/TestParentQueue.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/TestParentQueue.java @@ -109,17 +109,15 @@ public class TestParentQueue { private static final String A = "a"; private static final String B = "b"; - private static final String Q_A = - CapacitySchedulerConfiguration.ROOT + "." + A; - private static final String Q_B = - CapacitySchedulerConfiguration.ROOT + "." + B; private void setupSingleLevelQueues(CapacitySchedulerConfiguration conf) { // Define top-level queues conf.setQueues(CapacitySchedulerConfiguration.ROOT, new String[] {A, B}); + final String Q_A = CapacitySchedulerConfiguration.ROOT + "." + A; conf.setCapacity(Q_A, 30); + final String Q_B = CapacitySchedulerConfiguration.ROOT + "." + B; conf.setCapacity(Q_B, 70); LOG.info("Setup top-level queues a and b"); @@ -131,9 +129,11 @@ public class TestParentQueue { // Define top-level queues conf.setQueues(CapacitySchedulerConfiguration.ROOT, new String[]{A, B}); + final String Q_A = CapacitySchedulerConfiguration.ROOT + "." + A; conf.setMinimumResourceRequirement("", Q_A, QUEUE_A_RESOURCE); + final String Q_B = CapacitySchedulerConfiguration.ROOT + "." + B; conf.setMinimumResourceRequirement("", Q_B, QUEUE_B_RESOURCE); @@ -369,7 +369,9 @@ public class TestParentQueue { public void testSingleLevelQueuesPrecision() throws Exception { // Setup queue configs setupSingleLevelQueues(csConf); + final String Q_A = CapacitySchedulerConfiguration.ROOT + "." + "a"; csConf.setCapacity(Q_A, 30); + final String Q_B = CapacitySchedulerConfiguration.ROOT + "." + "b"; csConf.setCapacity(Q_B, 70.5F); Map queues = new HashMap(); @@ -433,8 +435,10 @@ public class TestParentQueue { // Define top-level queues csConf.setQueues(CapacitySchedulerConfiguration.ROOT, new String[] {A, B, C, D}); + final String Q_A = CapacitySchedulerConfiguration.ROOT + "." + A; conf.setCapacity(Q_A, 10); + final String Q_B = CapacitySchedulerConfiguration.ROOT + "." + B; conf.setCapacity(Q_B, 50); final String Q_C = CapacitySchedulerConfiguration.ROOT + "." + C; @@ -653,6 +657,7 @@ public class TestParentQueue { setupMultiLevelQueues(csConf); // set child queues capacity to 0 when parents not 0 + final String Q_B = CapacitySchedulerConfiguration.ROOT + "." + B; csConf.setCapacity(Q_B + "." + B1, 0); csConf.setCapacity(Q_B + "." + B2, 0); csConf.setCapacity(Q_B + "." + B3, 0); @@ -669,7 +674,9 @@ public class TestParentQueue { setupMultiLevelQueues(csConf); // set parent capacity to 0 when child not 0 + final String Q_B = CapacitySchedulerConfiguration.ROOT + "." + B; csConf.setCapacity(Q_B, 0); + final String Q_A = CapacitySchedulerConfiguration.ROOT + "." + A; csConf.setCapacity(Q_A, 60); Map queues = new HashMap(); @@ -684,11 +691,13 @@ public class TestParentQueue { setupMultiLevelQueues(csConf); // set parent and child capacity to 0 + final String Q_B = CapacitySchedulerConfiguration.ROOT + "." + B; csConf.setCapacity(Q_B, 0); csConf.setCapacity(Q_B + "." + B1, 0); csConf.setCapacity(Q_B + "." + B2, 0); csConf.setCapacity(Q_B + "." + B3, 0); + final String Q_A = CapacitySchedulerConfiguration.ROOT + "." + A; csConf.setCapacity(Q_A, 60); Map queues = new HashMap(); @@ -1016,125 +1025,10 @@ public class TestParentQueue { QUEUE_B_RESOURCE_70PERC); } - @Test - public void testDeriveCapacityFromAbsoluteConfigurations() throws Exception { - // Setup queue configs - setupSingleLevelQueuesWithAbsoluteResource(csConf); - - CSQueueStore queues = new CSQueueStore(); - CSQueue root = CapacitySchedulerQueueManager.parseQueue(csContext, csConf, - null, CapacitySchedulerConfiguration.ROOT, queues, queues, - TestUtils.spyHook); - - // Setup some nodes - int numNodes = 2; - final long memoryPerNode = (QUEUE_A_RESOURCE.getMemorySize() + - QUEUE_B_RESOURCE.getMemorySize()) / numNodes; - int coresPerNode = (QUEUE_A_RESOURCE.getVirtualCores() + - QUEUE_B_RESOURCE.getVirtualCores()) / numNodes; - - Resource clusterResource = Resources.createResource( - numNodes * memoryPerNode, numNodes * coresPerNode); - when(csContext.getNumClusterNodes()).thenReturn(numNodes); - root.updateClusterResource(clusterResource, - new ResourceLimits(clusterResource)); - - // Start testing - // Only MaximumSystemApplications is set in csConf - LeafQueue a = (LeafQueue) queues.get(A); - LeafQueue b = (LeafQueue) queues.get(B); - - float queueAScale = (float) QUEUE_A_RESOURCE.getMemorySize() / - (float) clusterResource.getMemorySize(); - float queueBScale = (float) QUEUE_B_RESOURCE.getMemorySize() / - (float) clusterResource.getMemorySize(); - - assertEquals(queueAScale, a.getQueueCapacities().getCapacity(), - DELTA); - assertEquals(1f, a.getQueueCapacities().getMaximumCapacity(), - DELTA); - assertEquals(queueAScale, a.getQueueCapacities().getAbsoluteCapacity(), - DELTA); - assertEquals(1f, - a.getQueueCapacities().getAbsoluteMaximumCapacity(), DELTA); - assertEquals((int) (csConf.getMaximumSystemApplications() * queueAScale), - a.getMaxApplications()); - assertEquals(a.getMaxApplications(), a.getMaxApplicationsPerUser()); - - assertEquals(queueBScale, - b.getQueueCapacities().getCapacity(), DELTA); - assertEquals(1f, - b.getQueueCapacities().getMaximumCapacity(), DELTA); - assertEquals(queueBScale, - b.getQueueCapacities().getAbsoluteCapacity(), DELTA); - assertEquals(1f, - b.getQueueCapacities().getAbsoluteMaximumCapacity(), DELTA); - assertEquals((int) (csConf.getMaximumSystemApplications() * queueBScale), - b.getMaxApplications()); - assertEquals(b.getMaxApplications(), b.getMaxApplicationsPerUser()); - - // Set GlobalMaximumApplicationsPerQueue in csConf - csConf.setGlobalMaximumApplicationsPerQueue(20000); - root.updateClusterResource(clusterResource, - new ResourceLimits(clusterResource)); - - assertEquals((int) (csConf.getGlobalMaximumApplicationsPerQueue() * - queueAScale), a.getMaxApplications()); - assertEquals(a.getMaxApplications(), a.getMaxApplicationsPerUser()); - assertEquals((int) (csConf.getGlobalMaximumApplicationsPerQueue() * - queueBScale), b.getMaxApplications()); - assertEquals(b.getMaxApplications(), b.getMaxApplicationsPerUser()); - - // Set MaximumApplicationsPerQueue in csConf - int queueAMaxApplications = 30000; - int queueBMaxApplications = 30000; - csConf.set("yarn.scheduler.capacity." + Q_A + ".maximum-applications", - Integer.toString(queueAMaxApplications)); - csConf.set("yarn.scheduler.capacity." + Q_B + ".maximum-applications", - Integer.toString(queueBMaxApplications)); - root.updateClusterResource(clusterResource, - new ResourceLimits(clusterResource)); - - assertEquals(queueAMaxApplications, a.getMaxApplications()); - assertEquals(a.getMaxApplications(), a.getMaxApplicationsPerUser()); - assertEquals(queueBMaxApplications, b.getMaxApplications()); - assertEquals(b.getMaxApplications(), b.getMaxApplicationsPerUser()); - - // Extra cases for testing maxApplicationsPerUser - int halfPercent = 50; - int oneAndQuarterPercent = 125; - a.getUsersManager().setUserLimit(halfPercent); - b.getUsersManager().setUserLimit(oneAndQuarterPercent); - root.updateClusterResource(clusterResource, - new ResourceLimits(clusterResource)); - - assertEquals(a.getMaxApplications() * halfPercent / 100, - a.getMaxApplicationsPerUser()); - // Q_B's limit per user shouldn't be greater - // than the whole queue's application limit - assertEquals(b.getMaxApplications(), b.getMaxApplicationsPerUser()); - - float userLimitFactorQueueA = 0.9f; - float userLimitFactorQueueB = 1.1f; - a.getUsersManager().setUserLimit(halfPercent); - a.getUsersManager().setUserLimitFactor(userLimitFactorQueueA); - b.getUsersManager().setUserLimit(100); - b.getUsersManager().setUserLimitFactor(userLimitFactorQueueB); - root.updateClusterResource(clusterResource, - new ResourceLimits(clusterResource)); - - assertEquals((int) (a.getMaxApplications() * halfPercent * - userLimitFactorQueueA / 100), a.getMaxApplicationsPerUser()); - // Q_B's limit per user shouldn't be greater - // than the whole queue's application limit - assertEquals(b.getMaxApplications(), b.getMaxApplicationsPerUser()); - - } - @After public void tearDown() throws Exception { } - + private ResourceLimits anyResourceLimits() { return any(ResourceLimits.class); }