diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java
index d7c75f3..cd846b1 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerStatus.java
@@ -201,4 +201,22 @@ public void setHost(String host) {
throw new UnsupportedOperationException(
"subclass must implement this method");
}
+
+ /**
+ * Get the ResourceUtilization of the container.
+ * @return ResourceUtilization of the container
+ */
+ @Public
+ @Unstable
+ public ResourceUtilization getUtilization() {
+ throw new UnsupportedOperationException(
+ "subclass must implement this method");
+ }
+
+ @Private
+ @Unstable
+ public void setUtilization(ResourceUtilization utilization) {
+ throw new UnsupportedOperationException(
+ "subclass must implement this method");
+ }
}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java
index 219cf02..4bb5982 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ContainerStatusPBImpl.java
@@ -27,6 +27,7 @@
import org.apache.hadoop.yarn.api.records.ContainerStatus;
import org.apache.hadoop.yarn.api.records.ExecutionType;
import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hadoop.yarn.api.records.ResourceUtilization;
import org.apache.hadoop.yarn.proto.YarnProtos;
import org.apache.hadoop.yarn.proto.YarnProtos.ResourceProto;
import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto;
@@ -51,6 +52,7 @@
private ContainerId containerId = null;
private static final String HOST = "HOST";
private static final String IPS = "IPS";
+ private static final String RESOURCE_UTILIZATION = "RESOURCE_UTILIZATION";
private Map containerAttributes = new HashMap<>();
@@ -314,6 +316,36 @@ public synchronized void setHost(String host) {
containerAttributes.put(HOST, host);
}
+ @Override
+ public synchronized ResourceUtilization getUtilization() {
+ if (containerAttributes.get(RESOURCE_UTILIZATION) == null) {
+ initContainerAttributes();
+ }
+ String resourceUtilizationStr =
+ containerAttributes.get(RESOURCE_UTILIZATION);
+ ResourceUtilization resourceUtilization = null;
+ if (resourceUtilizationStr.split(",").length == 3) {
+ int pmem = Integer.valueOf(resourceUtilizationStr.split(",")[0]);
+ int vmem = Integer.valueOf(resourceUtilizationStr.split(",")[1]);
+ float cpu = Float.valueOf(resourceUtilizationStr.split(",")[2]);
+ resourceUtilization = ResourceUtilization.newInstance(pmem, vmem, cpu);
+ }
+ return resourceUtilization;
+ }
+
+ @Override
+ public synchronized void setUtilization(ResourceUtilization utilization) {
+ maybeInitBuilder();
+ if (utilization == null) {
+ containerAttributes.remove(RESOURCE_UTILIZATION);
+ return;
+ }
+ String utilizationStr = String
+ .format("%s,%s,%s", utilization.getPhysicalMemory(),
+ utilization.getVirtualMemory(), utilization.getCPU());
+ containerAttributes.put(RESOURCE_UTILIZATION, utilizationStr);
+ }
+
private ContainerStateProto convertToProtoFormat(ContainerState e) {
return ProtoUtils.convertToProtoFormat(e);
}
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java
index 055e12c..5ea7f04 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java
@@ -48,6 +48,7 @@
import org.apache.hadoop.yarn.api.records.LocalResourceVisibility;
import org.apache.hadoop.yarn.api.records.Priority;
import org.apache.hadoop.yarn.api.records.Resource;
+import org.apache.hadoop.yarn.api.records.ResourceUtilization;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.event.Dispatcher;
import org.apache.hadoop.yarn.event.EventHandler;
@@ -609,6 +610,15 @@ public ContainerStatus cloneAndGetContainerStatus() {
this.containerTokenIdentifier.getExecutionType());
status.setIPs(ips == null ? null : Arrays.asList(ips.split(",")));
status.setHost(host);
+ ContainerMetrics metrics = ContainerMetrics.getContainerMetrics(this.containerId);
+ if (metrics != null) {
+ status.setUtilization(ResourceUtilization
+ .newInstance((int) metrics.pMemMBsStat.lastStat().mean(), 0,
+ (float) metrics.cpuCoreUsagePercent.lastStat().mean()));
+ }else{
+ status.setUtilization(ResourceUtilization
+ .newInstance(0, 0, 0));
+ }
return status;
} finally {
this.readLock.unlock();