diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/main/java/org/apache/hadoop/mapreduce/TypeConverter.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/main/java/org/apache/hadoop/mapreduce/TypeConverter.java index 5b8d3a7..68dbc91 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/main/java/org/apache/hadoop/mapreduce/TypeConverter.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/main/java/org/apache/hadoop/mapreduce/TypeConverter.java @@ -481,11 +481,8 @@ public static JobStatus fromYarn(ApplicationReport application, public static QueueInfo fromYarn(org.apache.hadoop.yarn.api.records.QueueInfo queueInfo, Configuration conf) { - QueueInfo toReturn = new QueueInfo(queueInfo.getQueueName(), "Capacity: " + - queueInfo.getCapacity() * 100 + ", MaximumCapacity: " + - (queueInfo.getMaximumCapacity() < 0 ? "UNDEFINED" : - queueInfo.getMaximumCapacity() * 100) + ", CurrentCapacity: " + - queueInfo.getCurrentCapacity() * 100, fromYarn(queueInfo.getQueueState()), + QueueInfo toReturn = new QueueInfo(queueInfo.getQueueName(), + scheduleInfo(queueInfo), fromYarn(queueInfo.getQueueState()), TypeConverter.fromYarnApps(queueInfo.getApplications(), conf)); List childQueues = new ArrayList(); for(org.apache.hadoop.yarn.api.records.QueueInfo childQueue : @@ -496,6 +493,24 @@ public static QueueInfo fromYarn(org.apache.hadoop.yarn.api.records.QueueInfo return toReturn; } + static String scheduleInfo( + org.apache.hadoop.yarn.api.records.QueueInfo queueInfo) { + final StringBuilder sb = new StringBuilder("Capacity: ") + .append(StringUtils.formatPercent(queueInfo.getCapacity(), 1)); + + sb.append(", MaximumCapacity: "); + if (queueInfo.getMaximumCapacity() < 0) { + sb.append("UNDEFINED"); + } else { + sb.append(StringUtils.formatPercent(queueInfo.getMaximumCapacity(), 1)); + } + + sb.append(", CurrentCapacity: ") + .append(StringUtils.formatPercent(queueInfo.getCurrentCapacity(), 1)); + + return sb.toString(); + } + public static QueueInfo[] fromYarnQueueInfo( List queues, Configuration conf) { diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/test/java/org/apache/hadoop/mapreduce/TestTypeConverter.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/test/java/org/apache/hadoop/mapreduce/TestTypeConverter.java index e36efec..17b98fa 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/test/java/org/apache/hadoop/mapreduce/TestTypeConverter.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-common/src/test/java/org/apache/hadoop/mapreduce/TestTypeConverter.java @@ -158,6 +158,30 @@ public void testFromYarnQueueInfo() { StringUtils.toLowerCase(queueInfo.getQueueState().toString())); } + @Test + public void fromYarnShouldRetrieveCapacityPercentagesFromQueueInfo() { + org.apache.hadoop.yarn.api.records.QueueInfo queueInfo = Mockito + .mock(org.apache.hadoop.yarn.api.records.QueueInfo.class); + Mockito.when(queueInfo.getQueueState()).thenReturn(QueueState.RUNNING); + Configuration confNotNeeded = null; + + Assert.assertEquals( + "Capacity: 0.0%, MaximumCapacity: 0.0%, CurrentCapacity: 0.0%", + TypeConverter.fromYarn(queueInfo, confNotNeeded).getSchedulingInfo()); + + Mockito.when(queueInfo.getCapacity()).thenReturn(0.6f); + Mockito.when(queueInfo.getMaximumCapacity()).thenReturn(0.7f); + Mockito.when(queueInfo.getCurrentCapacity()).thenReturn(0.5f); + Assert.assertEquals( + "Capacity: 60.0%, MaximumCapacity: 70.0%, CurrentCapacity: 50.0%", + TypeConverter.fromYarn(queueInfo, confNotNeeded).getSchedulingInfo()); + + Mockito.when(queueInfo.getMaximumCapacity()).thenReturn(-0.1f); + Assert.assertEquals( + "Capacity: 60.0%, MaximumCapacity: UNDEFINED, CurrentCapacity: 50.0%", + TypeConverter.fromYarn(queueInfo, confNotNeeded).getSchedulingInfo()); + } + /** * Test that child queues are converted too during conversion of the parent * queue