diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetrics.java index 926f8520604..a5dd1e7f164 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetrics.java @@ -107,6 +107,19 @@ public void increaseAllocated(Resource res) { allocated.increase(res); } + public void increaseAvailable(Resource res) { + available.increase(res); + } + + public void decreaseAvailable(Resource res) { + available.decrease(res); + } + + public void changeAvailable(Resource before, Resource now) { + available.decrease(before); + available.increase(now); + } + public void increaseAllocated(Resource res, int containers) { allocated.increaseWithMultiplier(res, containers); } @@ -119,6 +132,11 @@ public void decreaseAllocated(Resource res, int containers) { allocated.decreaseWithMultiplier(res, containers); } + public void changeAllocated(Resource before, Resource now) { + allocated.decrease(before); + allocated.increase(now); + } + public Map getAllocatedValues() { return allocated.getValues(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/metrics/NodeManagerMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/metrics/NodeManagerMetrics.java index abe45298168..916be7860af 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/metrics/NodeManagerMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/metrics/NodeManagerMetrics.java @@ -31,6 +31,10 @@ import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.thirdparty.com.google.common.annotations.VisibleForTesting; +import org.apache.hadoop.yarn.metrics.CustomResourceMetrics; +import org.apache.hadoop.yarn.util.resource.ResourceUtils; + +import java.util.Map; @Metrics(about="Metrics for node manager", context="yarn") public class NodeManagerMetrics { @@ -121,9 +125,21 @@ private long allocatedMB; private long availableMB; private long allocatedOpportunisticMB; + private CustomResourceMetrics nodeManagerMetricsForCustomResources; + + private static final String ALLOCATED_RESOURCE_METRIC_PREFIX = + "AllocatedResource."; + private static final String ALLOCATED_RESOURCE_METRIC_DESC = + "Allocated NAME"; + + private static final String AVAILABLE_RESOURCE_METRIC_PREFIX = + "AvailableResource."; + private static final String AVAILABLE_RESOURCE_METRIC_DESC = + "Available NAME"; private NodeManagerMetrics(JvmMetrics jvmMetrics) { this.jvmMetrics = jvmMetrics; + createNodeManagerMetricsForCustomResources(); } public static NodeManagerMetrics create() { @@ -201,6 +217,16 @@ public void allocateContainer(Resource res) { availableGB.set((int)Math.floor(availableMB/1024d)); allocatedVCores.incr(res.getVirtualCores()); availableVCores.decr(res.getVirtualCores()); + if (nodeManagerMetricsForCustomResources != null) { + nodeManagerMetricsForCustomResources.increaseAllocated(res); + nodeManagerMetricsForCustomResources.registerCustomResources( + nodeManagerMetricsForCustomResources.getAllocatedValues(), null, + ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); + nodeManagerMetricsForCustomResources.decreaseAvailable(res); + nodeManagerMetricsForCustomResources.registerCustomResources( + nodeManagerMetricsForCustomResources.getAvailableValues(), null, + AVAILABLE_RESOURCE_METRIC_PREFIX, AVAILABLE_RESOURCE_METRIC_DESC); + } } public void releaseContainer(Resource res) { @@ -211,6 +237,16 @@ public void releaseContainer(Resource res) { availableGB.set((int)Math.floor(availableMB/1024d)); allocatedVCores.decr(res.getVirtualCores()); availableVCores.incr(res.getVirtualCores()); + if (nodeManagerMetricsForCustomResources != null) { + nodeManagerMetricsForCustomResources.decreaseAllocated(res); + nodeManagerMetricsForCustomResources.registerCustomResources( + nodeManagerMetricsForCustomResources.getAllocatedValues(), null, + ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); + nodeManagerMetricsForCustomResources.increaseAvailable(res); + nodeManagerMetricsForCustomResources.registerCustomResources( + nodeManagerMetricsForCustomResources.getAvailableValues(), null, + AVAILABLE_RESOURCE_METRIC_PREFIX, AVAILABLE_RESOURCE_METRIC_DESC); + } } public void changeContainer(Resource before, Resource now) { @@ -222,6 +258,16 @@ public void changeContainer(Resource before, Resource now) { availableGB.set((int)Math.floor(availableMB/1024d)); allocatedVCores.incr(deltaVCores); availableVCores.decr(deltaVCores); + if (nodeManagerMetricsForCustomResources != null) { + nodeManagerMetricsForCustomResources.changeAllocated(before, now); + nodeManagerMetricsForCustomResources.registerCustomResources( + nodeManagerMetricsForCustomResources.getAllocatedValues(), null, + ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); + nodeManagerMetricsForCustomResources.changeAvailable(before, now); + nodeManagerMetricsForCustomResources.registerCustomResources( + nodeManagerMetricsForCustomResources.getAvailableValues(), null, + ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); + } } public void startOpportunisticContainer(Resource res) { @@ -249,6 +295,12 @@ public void addResource(Resource res) { availableMB = availableMB + res.getMemorySize(); availableGB.set((int)Math.floor(availableMB/1024d)); availableVCores.incr(res.getVirtualCores()); + if (nodeManagerMetricsForCustomResources != null) { + nodeManagerMetricsForCustomResources.increaseAvailable(res); + nodeManagerMetricsForCustomResources.registerCustomResources( + nodeManagerMetricsForCustomResources.getAvailableValues(), null, + AVAILABLE_RESOURCE_METRIC_PREFIX, AVAILABLE_RESOURCE_METRIC_DESC); + } } public void addContainerLaunchDuration(long value) { @@ -428,6 +480,26 @@ public void setNodeCpuUtilization(float cpuUtilization) { this.nodeCpuUtilization.set(cpuUtilization); } + protected void createNodeManagerMetricsForCustomResources() { + if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) { + this.nodeManagerMetricsForCustomResources = + new CustomResourceMetrics(); + registerCustomResources(); + } + } + + /** + * Register all custom resources metrics as part of initialization. As and + * when this metric object construction happens for any node, all custom + * resource metrics value would be initialized with '0' + */ + protected void registerCustomResources() { + Map customResources = + nodeManagerMetricsForCustomResources.initAndGetCustomResources(); + nodeManagerMetricsForCustomResources + .registerCustomResources(customResources, null); + } + private void updateLocalizationHitRatios() { updateLocalizationHitRatio(localizedCacheHitBytes, localizedCacheMissBytes, localizedCacheHitBytesRatio);