Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java (revision 1583496) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java (working copy) @@ -65,6 +65,8 @@ @Metric("Aggregate # of allocated containers") MutableCounterLong aggregateContainersAllocated; @Metric("Aggregate # of released containers") MutableCounterLong aggregateContainersReleased; @Metric("Available memory in MB") MutableGaugeInt availableMB; + @Metric("Max resource memory in MB") MutableGaugeInt queueMaxResource; + @Metric("Min resource memory in MB") MutableGaugeInt queueMinResource; @Metric("Available CPU in virtual cores") MutableGaugeInt availableVCores; @Metric("Pending memory allocation in MB") MutableGaugeInt pendingMB; @Metric("Pending CPU allocation in virtual cores") MutableGaugeInt pendingVCores; @@ -322,6 +324,22 @@ } /** + * Set maximum resources to queue. + * @param limit resource limit + */ + public void setMaximumResourcesToQueue(Resource limit) { + queueMaxResource.set(limit.getMemory()); + } + + /** + * Set minimum resources to queue. + * @param limit resource limit + */ + public void setMinimumResourcesToQueue(Resource limit) { + queueMinResource.set(limit.getMemory()); + } + + /** * Set available resources. To be called by scheduler periodically as * resources become available. * @param user @@ -503,6 +521,14 @@ return allocatedContainers.value(); } + public int getQueueMaxResource(){ + return queueMaxResource.value(); + } + + public int getQueueMinResource(){ + return queueMinResource.value(); + } + public int getAvailableMB() { return availableMB.value(); } Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java (revision 1583496) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSParentQueue.java (working copy) @@ -87,6 +87,14 @@ demand = Resources.createResource(0); for (FSQueue childQueue : childQueues) { childQueue.updateDemand(); + Resource queueMaxRes = queueMgr.getMaxResources(childQueue.getName()); + Resource queueMinRes = queueMgr.getMinResources(childQueue.getName()); + if(Resources.equals(queueMaxRes,Resources.createResource(Integer.MAX_VALUE))) { + childQueue.getMetrics().setMaximumResourcesToQueue(maxRes); + } else { + childQueue.getMetrics().setMaximumResourcesToQueue(queueMaxRes); + } + childQueue.getMetrics().setMinimumResourcesToQueue(queueMinRes); Resource toAdd = childQueue.getDemand(); if (LOG.isDebugEnabled()) { LOG.debug("Counting resource from " + childQueue.getName() + " " + Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java (revision 1583496) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetrics.java (working copy) @@ -272,6 +272,35 @@ checkApps(parentUserSource, 1, 0, 0, 1, 0, 0, true); } + @Test public void testTwoLevelWithQueueMaxResourceMetrics() { + String parentQueueName = "root"; + String leafQueueName = "root.leaf"; + String leafQueueName1 = "root.leaf1"; + QueueMetrics parentMetrics = + QueueMetrics.forQueue(ms, parentQueueName, null, true, conf); + Queue parentQueue = make(stub(Queue.class).returning(parentMetrics). + from.getMetrics()); + QueueMetrics metrics = + QueueMetrics.forQueue(ms, leafQueueName, parentQueue, true, conf); + QueueMetrics metrics1 = + QueueMetrics.forQueue(ms, leafQueueName1, parentQueue, true, conf); + + parentMetrics.setMaximumResourcesToQueue(Resources.createResource(100*GB)); + parentMetrics.setMinimumResourcesToQueue(Resources.createResource(30*GB)); + metrics.setMaximumResourcesToQueue(Resources.createResource(50*GB)); + metrics.setMinimumResourcesToQueue(Resources.createResource(10*GB)); + metrics1.setMaximumResourcesToQueue(Resources.createResource(50*GB)); + metrics1.setMinimumResourcesToQueue(Resources.createResource(20*GB)); + + MetricsSource parentQueueSource = queueSource(ms, parentQueueName); + MetricsSource queueSource = queueSource(ms, leafQueueName); + MetricsSource queueSource1 = queueSource(ms, leafQueueName1); + + checkQueueResources(queueSource, 50*GB, 10*GB); + checkQueueResources(queueSource1, 50*GB, 20*GB); + checkQueueResources(parentQueueSource, 100*GB, 30*GB); + } + @Test public void testMetricsCache() { MetricsSystem ms = new MetricsSystemImpl("cache"); @@ -366,6 +395,12 @@ assertGauge("ReservedVCores", reservedCores, rb); assertGauge("ReservedContainers", reservedCtnrs, rb); } + + public static void checkQueueResources(MetricsSource source, int queueMaxResource, int queueMinimumMB) { + MetricsRecordBuilder rb = getMetrics(source); + assertGauge("QueueMaxResource", queueMaxResource, rb); + assertGauge("QueueMinResource", queueMinimumMB, rb); + } private static AppSchedulingInfo mockApp(String user) { AppSchedulingInfo app = mock(AppSchedulingInfo.class);