Skip to content

Commit 3eaf627

Browse files
committed
YARN-10343. Legacy RM UI should include labeled metrics for allocated, total, and reserved resources. Contributed by Eric Payne
1 parent 5dadf96 commit 3eaf627

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/ResourceUsage.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,10 @@ public Resource getAllUsed() {
200200
return _getAll(ResourceType.USED);
201201
}
202202

203+
public Resource getAllReserved() {
204+
return _getAll(ResourceType.RESERVED);
205+
}
206+
203207
// Cache Used
204208
public Resource getCachedUsed() {
205209
return _get(NL, ResourceType.CACHED_USED);

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/MetricsOverviewTable.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.hadoop.yarn.api.records.ResourceTypeInfo;
2323
import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager;
2424
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ClusterMetricsInfo;
25+
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ResourceInfo;
2526
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.SchedulerInfo;
2627
import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.UserMetricsInfo;
2728

@@ -60,7 +61,38 @@ protected void render(Block html) {
6061
ClusterMetricsInfo clusterMetrics = new ClusterMetricsInfo(this.rm);
6162

6263
DIV<Hamlet> div = html.div().$class("metrics");
63-
64+
65+
long usedMemoryBytes = 0;
66+
long totalMemoryBytes = 0;
67+
long reservedMemoryBytes = 0;
68+
long usedVCores = 0;
69+
long totalVCores = 0;
70+
long reservedVCores = 0;
71+
if (clusterMetrics.getCrossPartitionMetricsAvailable()) {
72+
ResourceInfo usedAllPartitions =
73+
clusterMetrics.getTotalUsedResourcesAcrossPartition();
74+
ResourceInfo totalAllPartitions =
75+
clusterMetrics.getTotalClusterResourcesAcrossPartition();
76+
ResourceInfo reservedAllPartitions =
77+
clusterMetrics.getTotalReservedResourcesAcrossPartition();
78+
usedMemoryBytes = usedAllPartitions.getMemorySize() * BYTES_IN_MB;
79+
totalMemoryBytes = totalAllPartitions.getMemorySize() * BYTES_IN_MB;
80+
reservedMemoryBytes = reservedAllPartitions.getMemorySize() * BYTES_IN_MB;
81+
usedVCores = usedAllPartitions.getvCores();
82+
totalVCores = totalAllPartitions.getvCores();
83+
reservedVCores = reservedAllPartitions.getvCores();
84+
// getTotalUsedResourcesAcrossPartition includes reserved resources.
85+
usedMemoryBytes -= reservedMemoryBytes;
86+
usedVCores -= reservedVCores;
87+
} else {
88+
usedMemoryBytes = clusterMetrics.getAllocatedMB() * BYTES_IN_MB;
89+
totalMemoryBytes = clusterMetrics.getTotalMB() * BYTES_IN_MB;
90+
reservedMemoryBytes = clusterMetrics.getReservedMB() * BYTES_IN_MB;
91+
usedVCores = clusterMetrics.getAllocatedVirtualCores();
92+
totalVCores = clusterMetrics.getTotalVirtualCores();
93+
reservedVCores = clusterMetrics.getReservedVirtualCores();
94+
}
95+
6496
div.h3("Cluster Metrics").
6597
table("#metricsoverview").
6698
thead().$class("ui-widget-header").
@@ -89,13 +121,14 @@ protected void render(Block html) {
89121
clusterMetrics.getAppsFailed() + clusterMetrics.getAppsKilled()
90122
)
91123
).
92-
td(String.valueOf(clusterMetrics.getContainersAllocated())).
93-
td(StringUtils.byteDesc(clusterMetrics.getAllocatedMB() * BYTES_IN_MB)).
94-
td(StringUtils.byteDesc(clusterMetrics.getTotalMB() * BYTES_IN_MB)).
95-
td(StringUtils.byteDesc(clusterMetrics.getReservedMB() * BYTES_IN_MB)).
96-
td(String.valueOf(clusterMetrics.getAllocatedVirtualCores())).
97-
td(String.valueOf(clusterMetrics.getTotalVirtualCores())).
98-
td(String.valueOf(clusterMetrics.getReservedVirtualCores())).
124+
td(String.valueOf(
125+
clusterMetrics.getTotalAllocatedContainersAcrossPartition())).
126+
td(StringUtils.byteDesc(usedMemoryBytes)).
127+
td(StringUtils.byteDesc(totalMemoryBytes)).
128+
td(StringUtils.byteDesc(reservedMemoryBytes)).
129+
td(String.valueOf(usedVCores)).
130+
td(String.valueOf(totalVCores)).
131+
td(String.valueOf(reservedVCores)).
99132
__().
100133
__().__();
101134

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ClusterMetricsInfo.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics;
2727
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
2828
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
29+
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.ParentQueue;
2930

3031
@XmlRootElement(name = "clusterMetrics")
3132
@XmlAccessorType(XmlAccessType.FIELD)
@@ -69,6 +70,14 @@ public class ClusterMetricsInfo {
6970
// Total registered resources of the cluster, including all partitions
7071
private ResourceInfo totalClusterResourcesAcrossPartition;
7172

73+
// Total reserved resources of the cluster, including all partitions.
74+
private ResourceInfo totalReservedResourcesAcrossPartition;
75+
76+
// Total allocated containers across all partitions.
77+
private int totalAllocatedContainersAcrossPartition;
78+
79+
private boolean crossPartitionMetricsAvailable = false;
80+
7281
public ClusterMetricsInfo() {
7382
} // JAXB needs this
7483

@@ -115,6 +124,11 @@ public ClusterMetricsInfo(final ResourceScheduler rs) {
115124
cs.getRootQueue().getQueueResourceUsage().getAllUsed());
116125
totalClusterResourcesAcrossPartition = new ResourceInfo(
117126
cs.getClusterResource());
127+
totalReservedResourcesAcrossPartition = new ResourceInfo(
128+
cs.getRootQueue().getQueueResourceUsage().getAllReserved());
129+
totalAllocatedContainersAcrossPartition =
130+
((ParentQueue) cs.getRootQueue()).getNumContainers();
131+
crossPartitionMetricsAvailable = true;
118132
}
119133
} else {
120134
this.totalMB = availableMB + allocatedMB;
@@ -346,4 +360,16 @@ public ResourceInfo getTotalUsedResourcesAcrossPartition() {
346360
public ResourceInfo getTotalClusterResourcesAcrossPartition() {
347361
return totalClusterResourcesAcrossPartition;
348362
}
363+
364+
public ResourceInfo getTotalReservedResourcesAcrossPartition() {
365+
return totalReservedResourcesAcrossPartition;
366+
}
367+
368+
public int getTotalAllocatedContainersAcrossPartition() {
369+
return totalAllocatedContainersAcrossPartition;
370+
}
371+
372+
public boolean getCrossPartitionMetricsAvailable() {
373+
return crossPartitionMetricsAvailable;
374+
}
349375
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServices.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ public void verifyClusterMetricsJSON(JSONObject json) throws JSONException,
474474
Exception {
475475
assertEquals("incorrect number of elements", 1, json.length());
476476
JSONObject clusterinfo = json.getJSONObject("clusterMetrics");
477-
assertEquals("incorrect number of elements", 27, clusterinfo.length());
477+
assertEquals("incorrect number of elements", 29, clusterinfo.length());
478478
verifyClusterMetrics(
479479
clusterinfo.getInt("appsSubmitted"), clusterinfo.getInt("appsCompleted"),
480480
clusterinfo.getInt("reservedMB"), clusterinfo.getInt("availableMB"),

0 commit comments

Comments
 (0)