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();