瀏覽代碼

MAPREDUCE-3897. Fixed computation of maxActiveAppsPerUser for queues by using capacity and not max-capacity since we are already scaling it by userLimitFactor. Contributed by Eric Payne.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1296898 13f79535-47bb-0310-9956-ffa450edef68
Arun Murthy 13 年之前
父節點
當前提交
6d80dc2a84

+ 4 - 0
hadoop-mapreduce-project/CHANGES.txt

@@ -253,6 +253,10 @@ Release 0.23.2 - UNRELEASED
     MAPREDUCE-3960. Fix web-proxy to forward request to AM with configured
     hostname or IP. (tgraves via acmurthy) 
 
+    MAPREDUCE-3897. Fixed computation of maxActiveAppsPerUser for queues by
+    using capacity and not max-capacity since we are already scaling it by
+    userLimitFactor. (Eric Payne via acmurthy) 
+
 Release 0.23.1 - 2012-02-17
 
   INCOMPATIBLE CHANGES

+ 17 - 3
hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java

@@ -88,7 +88,8 @@ public class LeafQueue implements CSQueue {
   private int maxApplicationsPerUser;
   
   private float maxAMResourcePercent;
-  private int maxActiveApplications;
+  private int maxActiveApplications; // Based on absolute max capacity
+  private int maxActiveAppsUsingAbsCap; // Based on absolute capacity
   private int maxActiveApplicationsPerUser;
   
   private Resource usedResources = Resources.createResource(0);
@@ -167,8 +168,12 @@ public class LeafQueue implements CSQueue {
         CSQueueUtils.computeMaxActiveApplications(
             cs.getClusterResources(), this.minimumAllocation,
             maxAMResourcePercent, absoluteMaxCapacity);
+    this.maxActiveAppsUsingAbsCap = 
+            CSQueueUtils.computeMaxActiveApplications(
+                cs.getClusterResources(), this.minimumAllocation,
+                maxAMResourcePercent, absoluteCapacity);
     int maxActiveApplicationsPerUser = 
-        CSQueueUtils.computeMaxActiveApplicationsPerUser(maxActiveApplications, userLimit, 
+        CSQueueUtils.computeMaxActiveApplicationsPerUser(maxActiveAppsUsingAbsCap, userLimit, 
             userLimitFactor);
 
     this.queueInfo = recordFactory.newRecordInstance(QueueInfo.class);
@@ -271,6 +276,11 @@ public class LeafQueue implements CSQueue {
         "(int)ceil((clusterResourceMemory / minimumAllocation) *" + 
         "maxAMResourcePercent * absoluteMaxCapacity)," + 
         "1) ]" + "\n" +
+        "maxActiveAppsUsingAbsCap = " + maxActiveAppsUsingAbsCap +
+        " [= max(" + 
+        "(int)ceil((clusterResourceMemory / minimumAllocation) *" + 
+        "maxAMResourcePercent * absoluteCapacity)," + 
+        "1) ]" + "\n" +
         "maxActiveApplicationsPerUser = " + maxActiveApplicationsPerUser +
         " [= max(" +
         "(int)(maxActiveApplications * (userLimit / 100.0f) * " +
@@ -1376,9 +1386,13 @@ public class LeafQueue implements CSQueue {
         CSQueueUtils.computeMaxActiveApplications(
             clusterResource, minimumAllocation, 
             maxAMResourcePercent, absoluteMaxCapacity);
+    maxActiveAppsUsingAbsCap = 
+            CSQueueUtils.computeMaxActiveApplications(
+                clusterResource, minimumAllocation, 
+                maxAMResourcePercent, absoluteCapacity);
     maxActiveApplicationsPerUser = 
         CSQueueUtils.computeMaxActiveApplicationsPerUser(
-            maxActiveApplications, userLimit, userLimitFactor);
+            maxActiveAppsUsingAbsCap, userLimit, userLimitFactor);
     
     // Update metrics
     CSQueueUtils.updateQueueStatistics(

+ 12 - 2
hadoop-mapreduce-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestApplicationLimits.java

@@ -158,9 +158,14 @@ public class TestApplicationLimits {
                    queue.getAbsoluteMaximumCapacity()));
     assertEquals(expectedMaxActiveApps, 
                  queue.getMaximumActiveApplications());
+    int expectedMaxActiveAppsUsingAbsCap = 
+            Math.max(1, 
+                (int)Math.ceil(((float)clusterResource.getMemory() / (1*GB)) * 
+                       csConf.getMaximumApplicationMasterResourcePercent() *
+                       queue.getAbsoluteCapacity()));
     assertEquals(
         (int)Math.ceil(
-            expectedMaxActiveApps * (queue.getUserLimit() / 100.0f) * 
+        		expectedMaxActiveAppsUsingAbsCap * (queue.getUserLimit() / 100.0f) * 
             queue.getUserLimitFactor()), 
         queue.getMaximumActiveApplicationsPerUser());
     assertEquals(
@@ -178,8 +183,13 @@ public class TestApplicationLimits {
                    queue.getAbsoluteMaximumCapacity()));
     assertEquals(expectedMaxActiveApps, 
                  queue.getMaximumActiveApplications());
+    expectedMaxActiveAppsUsingAbsCap = 
+            Math.max(1, 
+                (int)Math.ceil(((float)clusterResource.getMemory() / (1*GB)) * 
+                       csConf.getMaximumApplicationMasterResourcePercent() *
+                       queue.getAbsoluteCapacity()));
     assertEquals(
-        (int)Math.ceil(expectedMaxActiveApps * 
+        (int)Math.ceil(expectedMaxActiveAppsUsingAbsCap * 
             (queue.getUserLimit() / 100.0f) * queue.getUserLimitFactor()), 
         queue.getMaximumActiveApplicationsPerUser());
     assertEquals(