From f3bc59c7529106ccdcbeb240b35a9c20483b2d00 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Wed, 29 Sep 2021 15:53:59 +0200 Subject: [PATCH 1/7] YARN-10949. Simplify AbstractCSQueue#updateMaxAppRelatedField and find a more meaningful name for this method --- .../scheduler/capacity/AbstractCSQueue.java | 48 +--------------- .../scheduler/capacity/LeafQueue.java | 55 ++++++++++++++++++- 2 files changed, 53 insertions(+), 50 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 7473aa30c1189..9bf46264f9f8d 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 @@ -63,6 +63,7 @@ import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.ResourceUtils; import org.apache.hadoop.yarn.util.resource.Resources; +import org.apache.hadoop.yarn.webapp.hamlet2.Hamlet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1475,53 +1476,6 @@ private Resource getOrInheritMaxResource(Resource resourceByLabel, String label) configuredMaxResource, parentMaxResource)); } - void updateMaxAppRelatedField(CapacitySchedulerConfiguration conf, - LeafQueue leafQueue) { - int maxApplications = conf.getMaximumApplicationsPerQueue(queuePath); - int maxGlobalPerQueueApps = conf.getGlobalMaximumApplicationsPerQueue(); - String maxLabel = RMNodeLabelsManager.NO_LABEL; - - if (maxApplications < 0) { - for (String label : configuredNodeLabels) { - int maxApplicationsByLabel = 0; - if (maxGlobalPerQueueApps > 0) { - // In absolute mode, should - // shrink when change to corresponding label capacity. - maxApplicationsByLabel = this.capacityConfigType - != CapacityConfigType.ABSOLUTE_RESOURCE ? - maxGlobalPerQueueApps : - (int) (maxGlobalPerQueueApps * queueCapacities - .getAbsoluteCapacity(label)); - } else { - maxApplicationsByLabel = (int) (conf.getMaximumSystemApplications() - * queueCapacities.getAbsoluteCapacity(label)); - } - if (maxApplicationsByLabel > maxApplications) { - maxApplications = maxApplicationsByLabel; - maxLabel = label; - } - } - } - leafQueue.setMaxApplications(maxApplications); - - int maxApplicationsPerUser = Math.min(maxApplications, - (int) (maxApplications - * (leafQueue.getUsersManager().getUserLimit() / 100.0f) - * leafQueue.getUsersManager().getUserLimitFactor())); - if (leafQueue.getUsersManager().getUserLimitFactor() == -1) { - maxApplicationsPerUser = maxApplications; - } - - leafQueue.setMaxApplicationsPerUser(maxApplicationsPerUser); - LOG.info("LeafQueue:" + leafQueue.getQueuePath() + - "update max app related, maxApplications=" - + maxApplications + ", maxApplicationsPerUser=" - + maxApplicationsPerUser + ", Abs Cap:" + queueCapacities - .getAbsoluteCapacity(maxLabel) + ", Cap: " + queueCapacities - .getCapacity(maxLabel) + ", MaxCap : " + queueCapacities - .getMaximumCapacity(maxLabel)); - } - void deriveCapacityFromAbsoluteConfigurations(String label, Resource clusterResource) { // Update capacity with a float calculated from the parent's minResources 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 2c0593d0fc26c..2aca13bd81803 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 @@ -20,7 +20,6 @@ import java.io.IOException; import java.util.*; -import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -1939,8 +1938,9 @@ public void updateClusterResource(Resource clusterResource, updateAbsoluteCapacities(); super.updateEffectiveResources(clusterResource); - super.updateMaxAppRelatedField(csContext.getConfiguration(), - this); + + // Update maximum applications for the queue and for users + updateMaximumApplications(csContext.getConfiguration()); updateCurrentResourceLimits(currentResourceLimits, clusterResource); @@ -2326,6 +2326,55 @@ public void stopQueue() { } } + void updateMaximumApplications(CapacitySchedulerConfiguration conf) { + int maxApplications = conf.getMaximumApplicationsPerQueue(getQueuePath()); + + int maxGlobalApplications = conf.getGlobalMaximumApplicationsPerQueue(); + if (maxGlobalApplications < 0) { + maxGlobalApplications = conf.getMaximumSystemApplications(); + } + + String maxLabel = RMNodeLabelsManager.NO_LABEL; + if (maxApplications < 0) { + if (this.capacityConfigType == CapacityConfigType.ABSOLUTE_RESOURCE) { + for (String label : configuredNodeLabels) { + int maxApplicationsByLabel = (int) (maxGlobalApplications + * queueCapacities.getAbsoluteCapacity(label)); + if (maxApplicationsByLabel > maxApplications) { + maxApplications = maxApplicationsByLabel; + maxLabel = label; + } + } + } else { + maxApplications = maxGlobalApplications; + } + } + setMaxApplications(maxApplications); + + updateMaxAppsPerUser(); + + LOG.info("LeafQueue:" + getQueuePath() + + "update max app related, maxApplications=" + + maxApplications + ", maxApplicationsPerUser=" + + maxApplicationsPerUser + ", Abs Cap:" + queueCapacities + .getAbsoluteCapacity(maxLabel) + ", Cap: " + queueCapacities + .getCapacity(maxLabel) + ", MaxCap : " + queueCapacities + .getMaximumCapacity(maxLabel)); + } + + private void updateMaxAppsPerUser() { + int maxApplicationsPerUser = maxApplications; + if (getUsersManager().getUserLimitFactor() != -1) { + int maxApplicationsWithUserLimits = (int) (maxApplications + * (getUsersManager().getUserLimit() / 100.0f) + * getUsersManager().getUserLimitFactor()); + maxApplicationsPerUser = Math.min(maxApplications, + maxApplicationsWithUserLimits); + } + + setMaxApplicationsPerUser(maxApplicationsPerUser); + } + /** * Get all valid users in this queue. * @return user list From e5d06191b6f411836f233917be17ab1bb0abf647 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Thu, 30 Sep 2021 14:03:18 +0200 Subject: [PATCH 2/7] YARN-10949. Fix checkstyle errors --- .../scheduler/capacity/AbstractCSQueue.java | 1 - .../scheduler/capacity/LeafQueue.java | 20 +++++++++---------- 2 files changed, 10 insertions(+), 11 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 9bf46264f9f8d..419bab5f1995e 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 @@ -63,7 +63,6 @@ import org.apache.hadoop.yarn.util.resource.ResourceCalculator; import org.apache.hadoop.yarn.util.resource.ResourceUtils; import org.apache.hadoop.yarn.util.resource.Resources; -import org.apache.hadoop.yarn.webapp.hamlet2.Hamlet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 2aca13bd81803..530bb0372ef97 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 @@ -2327,7 +2327,7 @@ public void stopQueue() { } void updateMaximumApplications(CapacitySchedulerConfiguration conf) { - int maxApplications = conf.getMaximumApplicationsPerQueue(getQueuePath()); + int maxAppsForQueue = conf.getMaximumApplicationsPerQueue(getQueuePath()); int maxGlobalApplications = conf.getGlobalMaximumApplicationsPerQueue(); if (maxGlobalApplications < 0) { @@ -2335,27 +2335,27 @@ void updateMaximumApplications(CapacitySchedulerConfiguration conf) { } String maxLabel = RMNodeLabelsManager.NO_LABEL; - if (maxApplications < 0) { + if (maxAppsForQueue < 0) { if (this.capacityConfigType == CapacityConfigType.ABSOLUTE_RESOURCE) { for (String label : configuredNodeLabels) { int maxApplicationsByLabel = (int) (maxGlobalApplications * queueCapacities.getAbsoluteCapacity(label)); - if (maxApplicationsByLabel > maxApplications) { - maxApplications = maxApplicationsByLabel; + if (maxApplicationsByLabel > maxAppsForQueue) { + maxAppsForQueue = maxApplicationsByLabel; maxLabel = label; } } } else { - maxApplications = maxGlobalApplications; + maxAppsForQueue = maxGlobalApplications; } } - setMaxApplications(maxApplications); + setMaxApplications(maxAppsForQueue); updateMaxAppsPerUser(); LOG.info("LeafQueue:" + getQueuePath() + "update max app related, maxApplications=" - + maxApplications + ", maxApplicationsPerUser=" + + maxAppsForQueue + ", maxApplicationsPerUser=" + maxApplicationsPerUser + ", Abs Cap:" + queueCapacities .getAbsoluteCapacity(maxLabel) + ", Cap: " + queueCapacities .getCapacity(maxLabel) + ", MaxCap : " + queueCapacities @@ -2363,16 +2363,16 @@ void updateMaximumApplications(CapacitySchedulerConfiguration conf) { } private void updateMaxAppsPerUser() { - int maxApplicationsPerUser = maxApplications; + int maxAppsPerUser = maxApplications; if (getUsersManager().getUserLimitFactor() != -1) { int maxApplicationsWithUserLimits = (int) (maxApplications * (getUsersManager().getUserLimit() / 100.0f) * getUsersManager().getUserLimitFactor()); - maxApplicationsPerUser = Math.min(maxApplications, + maxAppsPerUser = Math.min(maxApplications, maxApplicationsWithUserLimits); } - setMaxApplicationsPerUser(maxApplicationsPerUser); + setMaxApplicationsPerUser(maxAppsPerUser); } /** From affcba2435bda74fa5bc5143e4df0c942eb75622 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Mon, 4 Oct 2021 09:13:27 +0200 Subject: [PATCH 3/7] YARN-10949. Maintain backward compatibility in max apps calculation --- .../scheduler/capacity/LeafQueue.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 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/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 530bb0372ef97..76944fef0f093 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 @@ -2330,25 +2330,27 @@ void updateMaximumApplications(CapacitySchedulerConfiguration conf) { int maxAppsForQueue = conf.getMaximumApplicationsPerQueue(getQueuePath()); int maxGlobalApplications = conf.getGlobalMaximumApplicationsPerQueue(); - if (maxGlobalApplications < 0) { - maxGlobalApplications = conf.getMaximumSystemApplications(); - } + int maxSystemApplications = conf.getMaximumSystemApplications(); + int baseMaxApplications = maxGlobalApplications > 0 ? + maxGlobalApplications : maxSystemApplications; String maxLabel = RMNodeLabelsManager.NO_LABEL; if (maxAppsForQueue < 0) { - if (this.capacityConfigType == CapacityConfigType.ABSOLUTE_RESOURCE) { + if (maxGlobalApplications > 0 && this.capacityConfigType + != CapacityConfigType.ABSOLUTE_RESOURCE) { + maxAppsForQueue = maxGlobalApplications; + } else { for (String label : configuredNodeLabels) { - int maxApplicationsByLabel = (int) (maxGlobalApplications + int maxApplicationsByLabel = (int) (baseMaxApplications * queueCapacities.getAbsoluteCapacity(label)); if (maxApplicationsByLabel > maxAppsForQueue) { maxAppsForQueue = maxApplicationsByLabel; maxLabel = label; } } - } else { - maxAppsForQueue = maxGlobalApplications; } } + setMaxApplications(maxAppsForQueue); updateMaxAppsPerUser(); From cb268008137b6e5b1b1ab2f1be518efe17fa99c7 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Mon, 18 Oct 2021 09:02:23 +0200 Subject: [PATCH 4/7] YARN-10949. Limit global and system max app --- .../server/resourcemanager/scheduler/capacity/LeafQueue.java | 3 ++- 1 file changed, 2 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/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 76944fef0f093..fee23aa1f4b35 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 @@ -2332,7 +2332,8 @@ void updateMaximumApplications(CapacitySchedulerConfiguration conf) { int maxGlobalApplications = conf.getGlobalMaximumApplicationsPerQueue(); int maxSystemApplications = conf.getMaximumSystemApplications(); int baseMaxApplications = maxGlobalApplications > 0 ? - maxGlobalApplications : maxSystemApplications; + Math.min(maxGlobalApplications, maxSystemApplications) + : maxSystemApplications; String maxLabel = RMNodeLabelsManager.NO_LABEL; if (maxAppsForQueue < 0) { From 4b46cc7006843ff84df06bfed4f3421c95c49c71 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Mon, 18 Oct 2021 14:30:40 +0200 Subject: [PATCH 5/7] YARN-10949. Fix app limit and test --- .../scheduler/capacity/LeafQueue.java | 14 +++++++------- .../scheduler/capacity/TestParentQueue.java | 2 +- 2 files changed, 8 insertions(+), 8 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/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 fee23aa1f4b35..5331477ca36b5 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 @@ -2329,17 +2329,17 @@ public void stopQueue() { void updateMaximumApplications(CapacitySchedulerConfiguration conf) { int maxAppsForQueue = conf.getMaximumApplicationsPerQueue(getQueuePath()); - int maxGlobalApplications = conf.getGlobalMaximumApplicationsPerQueue(); - int maxSystemApplications = conf.getMaximumSystemApplications(); - int baseMaxApplications = maxGlobalApplications > 0 ? - Math.min(maxGlobalApplications, maxSystemApplications) - : maxSystemApplications; + int maxDefaultPerQueueApps = conf.getGlobalMaximumApplicationsPerQueue(); + int maxSystemApps = conf.getMaximumSystemApplications(); + int baseMaxApplications = maxDefaultPerQueueApps > 0 ? + Math.min(maxDefaultPerQueueApps, maxSystemApps) + : maxSystemApps; String maxLabel = RMNodeLabelsManager.NO_LABEL; if (maxAppsForQueue < 0) { - if (maxGlobalApplications > 0 && this.capacityConfigType + if (maxDefaultPerQueueApps > 0 && this.capacityConfigType != CapacityConfigType.ABSOLUTE_RESOURCE) { - maxAppsForQueue = maxGlobalApplications; + maxAppsForQueue = maxDefaultPerQueueApps; } else { for (String label : configuredNodeLabels) { int maxApplicationsByLabel = (int) (baseMaxApplications 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 8b75a9c126fbb..fe90ca844359f 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 @@ -1137,7 +1137,7 @@ public void testDeriveCapacityFromAbsoluteConfigurations() throws Exception { assertEquals(b.getMaxApplications(), b.getMaxApplicationsPerUser()); // Set GlobalMaximumApplicationsPerQueue in csConf - csConf.setGlobalMaximumApplicationsPerQueue(20000); + csConf.setGlobalMaximumApplicationsPerQueue(8000); root.updateClusterResource(clusterResource, new ResourceLimits(clusterResource)); From 522086313c2fb96dd16e2f09dc82d51f6fec236f Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Mon, 18 Oct 2021 18:21:07 +0200 Subject: [PATCH 6/7] YARN-10949. Add test case for max system app trimming --- .../scheduler/capacity/CapacitySchedulerConfiguration.java | 4 ++++ .../resourcemanager/scheduler/capacity/LeafQueue.java | 2 +- .../resourcemanager/scheduler/capacity/TestLeafQueue.java | 7 +++++++ 3 files changed, 12 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/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 60e55275e2c57..fec9d9f040395 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 @@ -461,6 +461,10 @@ private String getNodeLabelPrefix(String queue, String label) { return getQueuePrefix(queue) + ACCESSIBLE_NODE_LABELS + DOT + label + DOT; } + public void setMaximumSystemApplications(int numMaxApps) { + setInt(MAXIMUM_SYSTEM_APPLICATIONS, numMaxApps); + } + public int getMaximumSystemApplications() { int maxApplications = getInt(MAXIMUM_SYSTEM_APPLICATIONS, DEFAULT_MAXIMUM_SYSTEM_APPLICATIIONS); 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 5331477ca36b5..8e9727e1907d9 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 @@ -2339,7 +2339,7 @@ void updateMaximumApplications(CapacitySchedulerConfiguration conf) { if (maxAppsForQueue < 0) { if (maxDefaultPerQueueApps > 0 && this.capacityConfigType != CapacityConfigType.ABSOLUTE_RESOURCE) { - maxAppsForQueue = maxDefaultPerQueueApps; + maxAppsForQueue = baseMaxApplications; } else { for (String label : configuredNodeLabels) { int maxApplicationsByLabel = (int) (baseMaxApplications 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 c918a29b1a294..033bb2d51d591 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 @@ -5136,6 +5136,13 @@ public void testSetupQueueConfigsWithSpecifiedConfiguration() assertEquals(1.0, leafQueue.getAbsoluteMaximumCapacity(), EPSILON); + // limit maximum apps by max system apps + csConf.setMaximumSystemApplications(15); + leafQueue.updateClusterResource(Resource.newInstance(0, 0), + new ResourceLimits(Resource.newInstance(0, 0))); + + assertEquals(15, leafQueue.getMaxApplications()); + } finally { //revert config changes csConf.setNodeLocalityDelay( From 3edeac3cf384902586062b40401cb9335d879601 Mon Sep 17 00:00:00 2001 From: 9uapaw Date: Wed, 20 Oct 2021 08:33:40 +0200 Subject: [PATCH 7/7] YARN-10949. Fix ApplicationLimit test --- .../capacity/TestApplicationLimits.java | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) 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/TestApplicationLimits.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/TestApplicationLimits.java index a42e4af5dbf0f..a1252cfade79c 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/TestApplicationLimits.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/TestApplicationLimits.java @@ -870,8 +870,8 @@ public RMNodeLabelsManager createNodeLabelManager() { + "submission of application: " + app3.getApplicationId(), app3.getDiagnostics().toString()); - // based on Global limit of queue usert application is rejected - RMApp app11 = MockRMAppSubmitter.submit(rm, + // based on per user max app settings, app should be rejected instantly + RMApp app13 = MockRMAppSubmitter.submit(rm, MockRMAppSubmissionData.Builder.createWithMemory(GB, rm) .withAppName("app") .withUser("user") @@ -880,36 +880,36 @@ public RMNodeLabelsManager createNodeLabelManager() { .withWaitForAppAcceptedState(false) .build()); rm.drainEvents(); - rm.waitForState(app11.getApplicationId(), RMAppState.ACCEPTED); - assertEquals(RMAppState.ACCEPTED, app11.getState()); - RMApp app12 = MockRMAppSubmitter.submit(rm, + rm.waitForState(app13.getApplicationId(), RMAppState.FAILED); + assertEquals(RMAppState.FAILED, app13.getState()); + assertEquals( + "org.apache.hadoop.security.AccessControlException: Queue" + + " root.d already has 0 applications from user user cannot" + + " accept submission of application: " + app13.getApplicationId(), + app13.getDiagnostics().toString()); + + RMApp app11 = MockRMAppSubmitter.submit(rm, MockRMAppSubmissionData.Builder.createWithMemory(GB, rm) .withAppName("app") - .withUser("user") + .withUser("user2") .withAcls(null) - .withQueue("d") + .withQueue("a2") .withWaitForAppAcceptedState(false) .build()); rm.drainEvents(); - rm.waitForState(app12.getApplicationId(), RMAppState.ACCEPTED); - assertEquals(RMAppState.ACCEPTED, app12.getState()); - RMApp app13 = MockRMAppSubmitter.submit(rm, + rm.waitForState(app11.getApplicationId(), RMAppState.ACCEPTED); + assertEquals(RMAppState.ACCEPTED, app11.getState()); + RMApp app12 = MockRMAppSubmitter.submit(rm, MockRMAppSubmissionData.Builder.createWithMemory(GB, rm) .withAppName("app") - .withUser("user") + .withUser("user2") .withAcls(null) - .withQueue("d") + .withQueue("a2") .withWaitForAppAcceptedState(false) .build()); rm.drainEvents(); - rm.waitForState(app13.getApplicationId(), RMAppState.FAILED); - assertEquals(RMAppState.FAILED, app13.getState()); - assertEquals( - "org.apache.hadoop.security.AccessControlException: Queue" - + " root.d already has 2 applications from user user cannot" - + " accept submission of application: " + app13.getApplicationId(), - app13.getDiagnostics().toString()); - + rm.waitForState(app12.getApplicationId(), RMAppState.ACCEPTED); + assertEquals(RMAppState.ACCEPTED, app12.getState()); // based on system max limit application is rejected RMApp app14 = MockRMAppSubmitter.submit(rm, MockRMAppSubmissionData.Builder.createWithMemory(GB, rm) @@ -938,7 +938,6 @@ public RMNodeLabelsManager createNodeLabelManager() { app15.getDiagnostics().toString()); rm.killApp(app2.getApplicationId()); - rm.killApp(app11.getApplicationId()); rm.killApp(app13.getApplicationId()); rm.killApp(app14.getApplicationId()); rm.stop();