diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java index 976cf8c..1484c87 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ReservationQueue.java @@ -48,6 +48,7 @@ public ReservationQueue(CapacitySchedulerContext cs, String queueName, parent.getMaxApplicationsForReservations(), parent.getMaxApplicationsPerUserForReservation()); this.parent = parent; + inheritParentQueueConfiguration(); } @Override @@ -103,6 +104,18 @@ private void updateQuotas(int userLimit, float userLimitFactor, maxApplicationsPerUser = maxAppsPerUserForReservation; } + private void inheritParentQueueConfiguration() { + QueueCapacities parentCapacities = parent.queueCapacities; + for (String label : parentCapacities.getExistingNodeLabels()) { + queueCapacities.setAbsoluteMaximumCapacity( + parentCapacities.getAbsoluteUsedCapacity(label)); + queueCapacities.setMaximumCapacity(label, + parentCapacities.getMaximumCapacity(label)); + queueCapacities.setMaxAMResourcePercentage(label, + parentCapacities.getMaxAMResourcePercentage(label)); + } + } + @Override protected void setupConfigurableCapacities() { CSQueueUtils.updateAndCheckCapacitiesByLabel(getQueuePath(), diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestReservationQueue.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestReservationQueue.java index e23e93c..e04ae02 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestReservationQueue.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestReservationQueue.java @@ -26,6 +26,7 @@ import java.io.IOException; +import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerDynamicEditException; @@ -77,6 +78,23 @@ private void validateReservationQueue(double capacity) { assertEquals(reservationQueue.maxApplicationsPerUser, DEF_MAX_APPS); } + private void validateUserAmResourceLimit(ReservationQueue queue, + ResourceCalculator calculator, Resource capacityResource, + float capacity) { + Resource userAmResourceLimit = queue.getUserAMResourceLimit(); + capacity = capacity * csConf.getMaximumApplicationMasterResourcePercent(); + Resource expectedUserAmResourceLimit = calculator.multiplyAndNormalizeUp( + capacityResource, capacity, Resource.newInstance(1, 1)); + assertTrue(calculator.compare(capacityResource, userAmResourceLimit, + expectedUserAmResourceLimit) == 0); + } + + private void updateAMResourceLimit(ReservationQueue queue) { + for (String nodeLabel : queue.getNodeLabelsForQueue()) { + queue.calculateAndGetAMResourceLimitPerPartition(nodeLabel); + } + } + @Test public void testAddSubtractCapacity() throws Exception { @@ -84,10 +102,21 @@ public void testAddSubtractCapacity() throws Exception { reservationQueue.setCapacity(1.0F); validateReservationQueue(1); reservationQueue.setEntitlement(new QueueEntitlement(0.9f, 1f)); + updateAMResourceLimit(reservationQueue); + validateUserAmResourceLimit(reservationQueue, resourceCalculator, + csContext.getClusterResource(), 0.9f); validateReservationQueue(0.9); + reservationQueue.setEntitlement(new QueueEntitlement(1f, 1f)); + updateAMResourceLimit(reservationQueue); + validateUserAmResourceLimit(reservationQueue, resourceCalculator, + csContext.getClusterResource(), 1f); validateReservationQueue(1); + reservationQueue.setEntitlement(new QueueEntitlement(0f, 1f)); + updateAMResourceLimit(reservationQueue); + validateUserAmResourceLimit(reservationQueue, resourceCalculator, + csContext.getClusterResource(), 0f); validateReservationQueue(0); try {