diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsCustomResource.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetricValue.java similarity index 87% rename from hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsCustomResource.java rename to hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetricValue.java index f47b02397de..fdf53a06e32 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsCustomResource.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetricValue.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.apache.hadoop.yarn.server.resourcemanager.scheduler; +package org.apache.hadoop.yarn.metrics; import org.apache.hadoop.thirdparty.com.google.common.collect.Maps; import org.apache.hadoop.yarn.api.records.Resource; @@ -29,14 +29,14 @@ * the name of the custom resource. * There are different kinds of values like allocated, available and others. */ -public class QueueMetricsCustomResource { +public class CustomResourceMetricValue { private final Map values = Maps.newHashMap(); - protected void increase(Resource res) { + public void increase(Resource res) { update(res, Long::sum); } - void increaseWithMultiplier(Resource res, long multiplier) { + public void increaseWithMultiplier(Resource res, long multiplier) { update(res, (v1, v2) -> v1 + v2 * multiplier); } @@ -48,7 +48,7 @@ void decreaseWithMultiplier(Resource res, int containers) { update(res, (v1, v2) -> v1 - v2 * containers); } - protected void set(Resource res) { + public void set(Resource res) { update(res, (v1, v2) -> v2); } @@ -64,8 +64,7 @@ private void update(Resource res, BiFunction operation) { if (!values.containsKey(resource.getName())) { values.put(resource.getName(), 0L); } - values.merge(resource.getName(), - resource.getValue(), operation); + values.merge(resource.getName(), resource.getValue(), operation); } } } 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 new file mode 100644 index 00000000000..1d664411d71 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/metrics/CustomResourceMetrics.java @@ -0,0 +1,169 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.metrics; + +import org.apache.hadoop.metrics2.lib.MetricsRegistry; +import org.apache.hadoop.metrics2.lib.MutableGaugeLong; +import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.api.records.ResourceInformation; +import org.apache.hadoop.yarn.util.resource.ResourceUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * This class is a main entry-point for any kind of metrics for + * custom resources. + * It provides increase and decrease methods for all types of metrics. + */ +public class CustomResourceMetrics { + 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 static final String PENDING_RESOURCE_METRIC_PREFIX = + "PendingResource."; + private static final String PENDING_RESOURCE_METRIC_DESC = "Pending NAME"; + + private static final String RESERVED_RESOURCE_METRIC_PREFIX = + "ReservedResource."; + private static final String RESERVED_RESOURCE_METRIC_DESC = "Reserved NAME"; + + private final CustomResourceMetricValue allocated = + new CustomResourceMetricValue(); + private final CustomResourceMetricValue available = + new CustomResourceMetricValue(); + private final CustomResourceMetricValue pending = + new CustomResourceMetricValue(); + private final CustomResourceMetricValue reserved = + new CustomResourceMetricValue(); + + /** + * Register all custom resources metrics as part of initialization. As and + * when this metric object construction happens for any queue, all custom + * resource metrics value would be initialized with '0' like any other + * mandatory resources metrics + */ + public void registerCustomResources(MetricsRegistry registry) { + Map customResources = initAndGetCustomResources(); + registerCustomResources(customResources, registry); + } + + public void registerCustomResources(Map customResources, + MetricsRegistry registry) { + registerCustomResources(customResources, registry, + ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); + registerCustomResources(customResources, registry, + AVAILABLE_RESOURCE_METRIC_PREFIX, AVAILABLE_RESOURCE_METRIC_DESC); + registerCustomResources(customResources, registry, + PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC); + registerCustomResources(customResources, registry, + RESERVED_RESOURCE_METRIC_PREFIX, RESERVED_RESOURCE_METRIC_DESC); + } + + public Map initAndGetCustomResources() { + Map customResources = new HashMap(); + ResourceInformation[] resources = ResourceUtils.getResourceTypesArray(); + + for (int i = 2; i < resources.length; i++) { + ResourceInformation resource = resources[i]; + customResources.put(resource.getName(), Long.valueOf(0)); + } + return customResources; + } + + public void registerCustomResources(Map customResources, + MetricsRegistry registry, String metricPrefix, String metricDesc) { + for (Map.Entry entry : customResources.entrySet()) { + String resourceName = entry.getKey(); + Long resourceValue = entry.getValue(); + + MutableGaugeLong resourceMetric = + (MutableGaugeLong) registry.get(metricPrefix + resourceName); + + if (resourceMetric == null) { + resourceMetric = registry.newGauge(metricPrefix + resourceName, + metricDesc.replace("NAME", resourceName), 0L); + } + resourceMetric.set(resourceValue); + } + } + + public void increaseReserved(Resource res) { + reserved.increase(res); + } + + public void decreaseReserved(Resource res) { + reserved.decrease(res); + } + + public void setAvailable(Resource res) { + available.set(res); + } + + public void increasePending(Resource res, int containers) { + pending.increaseWithMultiplier(res, containers); + } + + public void decreasePending(Resource res) { + pending.decrease(res); + } + + public void decreasePending(Resource res, int containers) { + pending.decreaseWithMultiplier(res, containers); + } + + public void increaseAllocated(Resource res) { + allocated.increase(res); + } + + public void increaseAllocated(Resource res, int containers) { + allocated.increaseWithMultiplier(res, containers); + } + + public void decreaseAllocated(Resource res) { + allocated.decrease(res); + } + + public void decreaseAllocated(Resource res, int containers) { + allocated.decreaseWithMultiplier(res, containers); + } + + public Map getAllocatedValues() { + return allocated.getValues(); + } + + public Map getAvailableValues() { + return available.getValues(); + } + + public Map getPendingValues() { + return pending.getValues(); + } + + public Map getReservedValues() { + return reserved.getValues(); + } + + public CustomResourceMetricValue getAvailable() { + return available; + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/CSQueueMetricsForCustomResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/CSQueueMetricsForCustomResources.java index 77fe42bb402..39fc9759807 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/CSQueueMetricsForCustomResources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/CSQueueMetricsForCustomResources.java @@ -17,6 +17,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.metrics.CustomResourceMetricValue; import java.util.Map; @@ -27,10 +28,10 @@ */ public class CSQueueMetricsForCustomResources extends QueueMetricsForCustomResources { - private final QueueMetricsCustomResource guaranteedCapacity = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource maxCapacity = - new QueueMetricsCustomResource(); + private final CustomResourceMetricValue guaranteedCapacity = + new CustomResourceMetricValue(); + private final CustomResourceMetricValue maxCapacity = + new CustomResourceMetricValue(); public void setGuaranteedCapacity(Resource res) { guaranteedCapacity.set(res); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/FSQueueMetricsForCustomResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/FSQueueMetricsForCustomResources.java index 2f73d6b79ec..0139e3c4796 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/FSQueueMetricsForCustomResources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/FSQueueMetricsForCustomResources.java @@ -17,6 +17,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.metrics.CustomResourceMetricValue; import java.util.Map; @@ -26,20 +27,20 @@ * It provides increase and decrease methods for all types of metrics. */ public class FSQueueMetricsForCustomResources { - private final QueueMetricsCustomResource fairShare = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource steadyFairShare = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource minShare = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource maxShare = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource maxAMShare = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource amResourceUsage = - new QueueMetricsCustomResource(); - - public QueueMetricsCustomResource getFairShare() { + private final CustomResourceMetricValue + fairShare = new CustomResourceMetricValue(); + private final CustomResourceMetricValue steadyFairShare = + new CustomResourceMetricValue(); + private final CustomResourceMetricValue + minShare = new CustomResourceMetricValue(); + private final CustomResourceMetricValue + maxShare = new CustomResourceMetricValue(); + private final CustomResourceMetricValue + maxAMShare = new CustomResourceMetricValue(); + private final CustomResourceMetricValue amResourceUsage = + new CustomResourceMetricValue(); + + public CustomResourceMetricValue getFairShare() { return fairShare; } @@ -51,7 +52,7 @@ public void setFairShare(Resource res) { return fairShare.getValues(); } - public QueueMetricsCustomResource getSteadyFairShare() { + public CustomResourceMetricValue getSteadyFairShare() { return steadyFairShare; } @@ -63,7 +64,7 @@ public void setSteadyFairShare(Resource res) { return steadyFairShare.getValues(); } - public QueueMetricsCustomResource getMinShare() { + public CustomResourceMetricValue getMinShare() { return minShare; } @@ -75,7 +76,7 @@ public void setMinShare(Resource res) { return minShare.getValues(); } - public QueueMetricsCustomResource getMaxShare() { + public CustomResourceMetricValue getMaxShare() { return maxShare; } @@ -87,7 +88,7 @@ public void setMaxShare(Resource res) { return maxShare.getValues(); } - public QueueMetricsCustomResource getMaxAMShare() { + public CustomResourceMetricValue getMaxAMShare() { return maxAMShare; } @@ -99,7 +100,7 @@ public void setMaxAMShare(Resource res) { return maxAMShare.getValues(); } - public QueueMetricsCustomResource getAMResourceUsage() { + public CustomResourceMetricValue getAMResourceUsage() { return amResourceUsage; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java index c3d466a8354..68db74c22cb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetrics.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience.Private; @@ -43,8 +42,9 @@ import org.apache.hadoop.metrics2.lib.MutableRate; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.Resource; -import org.apache.hadoop.yarn.api.records.ResourceInformation; import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.metrics.CustomResourceMetricValue; +import org.apache.hadoop.yarn.metrics.CustomResourceMetrics; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppState; import org.apache.hadoop.yarn.util.resource.ResourceUtils; @@ -533,8 +533,8 @@ public void setAvailableResources(Resource limit) { availableVCores.set(limit.getVirtualCores()); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.setAvailable(limit); - registerCustomResources( - queueMetricsForCustomResources.getAvailableValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getAvailableValues(), registry, AVAILABLE_RESOURCE_METRIC_PREFIX, AVAILABLE_RESOURCE_METRIC_DESC); } } @@ -616,16 +616,6 @@ public void internalIncrPendingResources(String partition, String user, } } - protected Map initAndGetCustomResources() { - Map customResources = new HashMap(); - ResourceInformation[] resources = ResourceUtils.getResourceTypesArray(); - - for (int i = 2; i < resources.length; i++) { - ResourceInformation resource = resources[i]; - customResources.put(resource.getName(), Long.valueOf(0)); - } - return customResources; - } protected void createQueueMetricsForCustomResources() { if (ResourceUtils.getNumberOfKnownResourceTypes() > 2) { @@ -635,52 +625,26 @@ protected void createQueueMetricsForCustomResources() { } } - /** - * Register all custom resources metrics as part of initialization. As and - * when this metric object construction happens for any queue, all custom - * resource metrics value would be initialized with '0' like any other - * mandatory resources metrics - */ protected void registerCustomResources() { - Map customResources = initAndGetCustomResources(); - registerCustomResources(customResources, ALLOCATED_RESOURCE_METRIC_PREFIX, - ALLOCATED_RESOURCE_METRIC_DESC); - registerCustomResources(customResources, AVAILABLE_RESOURCE_METRIC_PREFIX, - AVAILABLE_RESOURCE_METRIC_DESC); - registerCustomResources(customResources, PENDING_RESOURCE_METRIC_PREFIX, - PENDING_RESOURCE_METRIC_DESC); - registerCustomResources(customResources, RESERVED_RESOURCE_METRIC_PREFIX, - RESERVED_RESOURCE_METRIC_DESC); - registerCustomResources(customResources, - AGGREGATE_PREEMPTED_SECONDS_METRIC_PREFIX, - AGGREGATE_PREEMPTED_SECONDS_METRIC_DESC); - } - - protected void registerCustomResources(Map customResources, - String metricPrefix, String metricDesc) { - for (Entry entry : customResources.entrySet()) { - String resourceName = entry.getKey(); - Long resourceValue = entry.getValue(); - - MutableGaugeLong resourceMetric = - (MutableGaugeLong) this.registry.get(metricPrefix + resourceName); - - if (resourceMetric == null) { - resourceMetric = - this.registry.newGauge(metricPrefix + resourceName, - metricDesc.replace("NAME", resourceName), 0L); - } - resourceMetric.set(resourceValue); - } + Map customResources = + queueMetricsForCustomResources.initAndGetCustomResources(); + queueMetricsForCustomResources + .registerCustomResources(customResources, this.registry); + queueMetricsForCustomResources + .registerCustomResources(customResources, this.registry, + AGGREGATE_PREEMPTED_SECONDS_METRIC_PREFIX, + AGGREGATE_PREEMPTED_SECONDS_METRIC_DESC); } + private void incrementPendingResources(int containers, Resource res) { pendingContainers.incr(containers); pendingMB.incr(res.getMemorySize() * containers); pendingVCores.incr(res.getVirtualCores() * containers); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.increasePending(res, containers); - registerCustomResources(queueMetricsForCustomResources.getPendingValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getPendingValues(), this.registry, PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC); } } @@ -722,7 +686,8 @@ private void decrementPendingResources(int containers, Resource res) { pendingVCores.decr(res.getVirtualCores() * containers); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.decreasePending(res, containers); - registerCustomResources(queueMetricsForCustomResources.getPendingValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getPendingValues(), this.registry, PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC); } } @@ -793,8 +758,8 @@ private void computeAllocateResources(int containers, Resource res, allocatedVCores.incr(res.getVirtualCores() * containers); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.increaseAllocated(res, containers); - registerCustomResources( - queueMetricsForCustomResources.getAllocatedValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getAllocatedValues(), this.registry, ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); } if (decrPending) { @@ -813,8 +778,8 @@ public void allocateResources(String partition, String user, Resource res) { allocatedVCores.incr(res.getVirtualCores()); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.increaseAllocated(res); - registerCustomResources( - queueMetricsForCustomResources.getAllocatedValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getAllocatedValues(), this.registry, ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); } @@ -822,7 +787,8 @@ public void allocateResources(String partition, String user, Resource res) { pendingVCores.decr(res.getVirtualCores()); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.decreasePending(res); - registerCustomResources(queueMetricsForCustomResources.getPendingValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getPendingValues(), this.registry, PENDING_RESOURCE_METRIC_PREFIX, PENDING_RESOURCE_METRIC_DESC); } @@ -879,8 +845,8 @@ private void computeReleaseResources(int containers, Resource res) { allocatedVCores.decr(res.getVirtualCores() * containers); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.decreaseAllocated(res, containers); - registerCustomResources( - queueMetricsForCustomResources.getAllocatedValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getAllocatedValues(), this.registry, ALLOCATED_RESOURCE_METRIC_PREFIX, ALLOCATED_RESOURCE_METRIC_DESC); } } @@ -928,9 +894,9 @@ public void updatePreemptedSecondsForCustomResources(Resource res, if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources .increaseAggregatedPreemptedSeconds(res, seconds); - registerCustomResources( + queueMetricsForCustomResources.registerCustomResources( queueMetricsForCustomResources.getAggregatePreemptedSeconds() - .getValues(), + .getValues(), this.registry, AGGREGATE_PREEMPTED_SECONDS_METRIC_PREFIX, AGGREGATE_PREEMPTED_SECONDS_METRIC_DESC); } @@ -971,8 +937,8 @@ public void incrReserveResources(Resource res) { reservedVCores.incr(res.getVirtualCores()); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.increaseReserved(res); - registerCustomResources( - queueMetricsForCustomResources.getReservedValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getReservedValues(), this.registry, RESERVED_RESOURCE_METRIC_PREFIX, RESERVED_RESOURCE_METRIC_DESC); } } @@ -1010,8 +976,8 @@ public void decrReserveResource(Resource res) { reservedVCores.decr(res.getVirtualCores()); if (queueMetricsForCustomResources != null) { queueMetricsForCustomResources.decreaseReserved(res); - registerCustomResources( - queueMetricsForCustomResources.getReservedValues(), + queueMetricsForCustomResources.registerCustomResources( + queueMetricsForCustomResources.getReservedValues(), this.registry, RESERVED_RESOURCE_METRIC_PREFIX, RESERVED_RESOURCE_METRIC_DESC); } } @@ -1114,7 +1080,7 @@ public Resource getReservedResources() { * @return QueueMetricsCustomResource */ @VisibleForTesting - public QueueMetricsCustomResource getAggregatedPreemptedSecondsResources() { + public CustomResourceMetricValue getAggregatedPreemptedSecondsResources() { return queueMetricsForCustomResources.getAggregatePreemptedSeconds(); } @@ -1232,7 +1198,7 @@ public long getAggregatePreemptedContainers() { public void fillInValuesFromAvailableResources(Resource fromResource, Resource targetResource) { if (queueMetricsForCustomResources != null) { - QueueMetricsCustomResource availableResources = + CustomResourceMetricValue availableResources = queueMetricsForCustomResources.getAvailable(); // We expect all custom resources contained in availableResources, @@ -1258,8 +1224,9 @@ public QueueMetricsForCustomResources getQueueMetricsForCustomResources() { } public void setQueueMetricsForCustomResources( - QueueMetricsForCustomResources metrics) { - this.queueMetricsForCustomResources = metrics; + CustomResourceMetrics metrics) { + this.queueMetricsForCustomResources = + (QueueMetricsForCustomResources) metrics; } public void setParent(QueueMetrics parent) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java index ddfffc8d13b..47adab3820a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/QueueMetricsForCustomResources.java @@ -1,4 +1,4 @@ -/* +/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -6,7 +6,9 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at + * * http://www.apache.org/licenses/LICENSE-2.0 + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,68 +19,14 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler; import org.apache.hadoop.yarn.api.records.Resource; +import org.apache.hadoop.yarn.metrics.CustomResourceMetrics; +import org.apache.hadoop.yarn.metrics.CustomResourceMetricValue; -import java.util.Map; - -/** - * This class is a main entry-point for any kind of metrics for - * custom resources. - * It provides increase and decrease methods for all types of metrics. - */ -public class QueueMetricsForCustomResources { - private final QueueMetricsCustomResource aggregatePreemptedSeconds = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource aggregatePreempted = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource allocated = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource available = - new QueueMetricsCustomResource(); - private final QueueMetricsCustomResource pending = - new QueueMetricsCustomResource(); - - private final QueueMetricsCustomResource reserved = - new QueueMetricsCustomResource(); - - public void increaseReserved(Resource res) { - reserved.increase(res); - } - - public void decreaseReserved(Resource res) { - reserved.decrease(res); - } - - public void setAvailable(Resource res) { - available.set(res); - } - - public void increasePending(Resource res, int containers) { - pending.increaseWithMultiplier(res, containers); - } - - public void decreasePending(Resource res) { - pending.decrease(res); - } - - public void decreasePending(Resource res, int containers) { - pending.decreaseWithMultiplier(res, containers); - } - - public void increaseAllocated(Resource res) { - allocated.increase(res); - } - - public void increaseAllocated(Resource res, int containers) { - allocated.increaseWithMultiplier(res, containers); - } - - public void decreaseAllocated(Resource res) { - allocated.decrease(res); - } - - public void decreaseAllocated(Resource res, int containers) { - allocated.decreaseWithMultiplier(res, containers); - } +public class QueueMetricsForCustomResources extends CustomResourceMetrics { + private final CustomResourceMetricValue aggregatePreemptedSeconds = + new CustomResourceMetricValue(); + private final CustomResourceMetricValue aggregatePreempted = + new CustomResourceMetricValue(); public void increaseAggregatedPreemptedSeconds(Resource res, long seconds) { aggregatePreemptedSeconds.increaseWithMultiplier(res, seconds); @@ -88,27 +36,7 @@ public void increaseAggregatedPreempted(Resource res) { aggregatePreempted.increase(res); } - Map getAllocatedValues() { - return allocated.getValues(); - } - - Map getAvailableValues() { - return available.getValues(); - } - - Map getPendingValues() { - return pending.getValues(); - } - - Map getReservedValues() { - return reserved.getValues(); - } - - QueueMetricsCustomResource getAggregatePreemptedSeconds() { + CustomResourceMetricValue getAggregatePreemptedSeconds() { return aggregatePreemptedSeconds; } - - public QueueMetricsCustomResource getAvailable() { - return available; - } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java index 106f56580da..43ca6148ca1 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CSQueueMetrics.java @@ -33,6 +33,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.CSQueueMetricsForCustomResources; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Queue; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetrics; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetricsForCustomResources; import org.apache.hadoop.yarn.util.resource.ResourceUtils; @Metrics(context = "yarn") @@ -68,6 +69,8 @@ @Metric("Maximum capacity in percentage relative to total partition") private MutableGaugeFloat maxAbsoluteCapacity; + private final QueueMetricsForCustomResources queueMetricsForCustomResources; + private static final String GUARANTEED_CAPACITY_METRIC_PREFIX = "GuaranteedCapacity."; private static final String GUARANTEED_CAPACITY_METRIC_DESC = @@ -81,6 +84,7 @@ CSQueueMetrics(MetricsSystem ms, String queueName, Queue parent, boolean enableUserMetrics, Configuration conf) { super(ms, queueName, parent, enableUserMetrics, conf); + this.queueMetricsForCustomResources = getQueueMetricsForCustomResources(); } /** @@ -90,11 +94,14 @@ * mandatory resources metrics */ protected void registerCustomResources() { - Map customResources = initAndGetCustomResources(); - registerCustomResources(customResources, GUARANTEED_CAPACITY_METRIC_PREFIX, - GUARANTEED_CAPACITY_METRIC_DESC); - registerCustomResources(customResources, MAX_CAPACITY_METRIC_PREFIX, - MAX_CAPACITY_METRIC_DESC); + Map customResources = + queueMetricsForCustomResources.initAndGetCustomResources(); + queueMetricsForCustomResources + .registerCustomResources(customResources, this.registry, + GUARANTEED_CAPACITY_METRIC_PREFIX, GUARANTEED_CAPACITY_METRIC_DESC); + queueMetricsForCustomResources + .registerCustomResources(customResources, this.registry, + MAX_CAPACITY_METRIC_PREFIX, MAX_CAPACITY_METRIC_DESC); super.registerCustomResources(); } @@ -187,9 +194,9 @@ public void setGuaranteedResources(String partition, Resource res) { if (getQueueMetricsForCustomResources() != null) { ((CSQueueMetricsForCustomResources) getQueueMetricsForCustomResources()) .setGuaranteedCapacity(res); - registerCustomResources( - ((CSQueueMetricsForCustomResources) - getQueueMetricsForCustomResources()).getGuaranteedCapacity(), + queueMetricsForCustomResources.registerCustomResources( + ((CSQueueMetricsForCustomResources) getQueueMetricsForCustomResources()) + .getGuaranteedCapacity(), this.registry, GUARANTEED_CAPACITY_METRIC_PREFIX, GUARANTEED_CAPACITY_METRIC_DESC); } } @@ -210,9 +217,9 @@ public void setMaxCapacityResources(String partition, Resource res) { if (getQueueMetricsForCustomResources() != null) { ((CSQueueMetricsForCustomResources) getQueueMetricsForCustomResources()) .setMaxCapacity(res); - registerCustomResources( + queueMetricsForCustomResources.registerCustomResources( ((CSQueueMetricsForCustomResources) - getQueueMetricsForCustomResources()).getMaxCapacity(), + getQueueMetricsForCustomResources()).getMaxCapacity(), this.registry, MAX_CAPACITY_METRIC_PREFIX, MAX_CAPACITY_METRIC_DESC); } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java index 0d84999fc4a..7acfe5da0ec 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/TestQueueMetricsForCustomResources.java @@ -26,6 +26,7 @@ import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.api.records.ResourceInformation; import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.metrics.CustomResourceMetricValue; import org.apache.hadoop.yarn.resourcetypes.ResourceTypesTestHelper; import org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager; @@ -293,7 +294,7 @@ private void testUpdatePreemptedSeconds(QueueMetricsTestData testData, } private Resource convertPreemptedSecondsToResource(QueueMetrics qm) { - QueueMetricsCustomResource customValues = qm + CustomResourceMetricValue customValues = qm .getAggregatedPreemptedSecondsResources(); MutableCounterLong vcoreSeconds = qm .getAggregateVcoreSecondsPreempted(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFSLeafQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFSLeafQueue.java index 8e294141e5a..5af9bc3acdf 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFSLeafQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/TestFSLeafQueue.java @@ -38,11 +38,11 @@ import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.Resource; import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.metrics.CustomResourceMetricValue; import org.apache.hadoop.yarn.server.resourcemanager.MockNodes; import org.apache.hadoop.yarn.server.resourcemanager.MockRM; import org.apache.hadoop.yarn.server.resourcemanager.RMContext; import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.QueueMetricsCustomResource; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeAddedSchedulerEvent; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeUpdateSchedulerEvent; @@ -344,7 +344,7 @@ private void verifyAMShare(FSLeafQueue schedulable, private Map verifyQueueMetricsForCustomResources( FSLeafQueue schedulable) { - QueueMetricsCustomResource maxAMShareCustomResources = + CustomResourceMetricValue maxAMShareCustomResources = schedulable.getMetrics().getCustomResources().getMaxAMShare(); Map customResourceValues = maxAMShareCustomResources .getValues();