Jelajahi Sumber

YARN-4899. Queue metrics of SLS capacity scheduler only activated after app submit to the queue. (Jonathan Hung via wangda)

Wangda Tan 8 tahun lalu
induk
melakukan
5ed63e3e9d

+ 44 - 0
hadoop-tools/hadoop-sls/src/main/java/org/apache/hadoop/yarn/sls/scheduler/SLSCapacityScheduler.java

@@ -57,7 +57,9 @@ import org.apache.hadoop.yarn.server.resourcemanager.rmnode.UpdatedContainerInfo
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.Allocation;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerAppReport;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplication;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler;
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.AppAttemptAddedSchedulerEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.AppAttemptRemovedSchedulerEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.scheduler.event.NodeUpdateSchedulerEvent;
@@ -84,6 +86,7 @@ import com.codahale.metrics.Timer;
 public class SLSCapacityScheduler extends CapacityScheduler implements
         SchedulerWrapper,Configurable {
   private static final String EOL = System.getProperty("line.separator");
+  private static final String QUEUE_COUNTER_PREFIX = "counter.queue.";
   private static final int SAMPLING_SIZE = 60;
   private ScheduledExecutorService pool;
   // counters for scheduler allocate/handle operations
@@ -747,6 +750,47 @@ public class SLSCapacityScheduler extends CapacityScheduler implements
     }
   }
 
+  private void initQueueMetrics(CSQueue queue) {
+    if (queue instanceof LeafQueue) {
+      SortedMap<String, Counter> counterMap = metrics.getCounters();
+      String queueName = queue.getQueueName();
+      String[] names = new String[]{
+          QUEUE_COUNTER_PREFIX + queueName + ".pending.memory",
+          QUEUE_COUNTER_PREFIX + queueName + ".pending.cores",
+          QUEUE_COUNTER_PREFIX + queueName + ".allocated.memory",
+          QUEUE_COUNTER_PREFIX + queueName + ".allocated.cores" };
+
+      for (int i = names.length - 1; i >= 0; i--) {
+        if (!counterMap.containsKey(names[i])) {
+          metrics.counter(names[i]);
+          counterMap = metrics.getCounters();
+        }
+      }
+
+      queueLock.lock();
+      try {
+        if (!schedulerMetrics.isTracked(queueName)) {
+          schedulerMetrics.trackQueue(queueName);
+        }
+      } finally {
+        queueLock.unlock();
+      }
+
+      return;
+    }
+
+    for (CSQueue child : queue.getChildQueues()) {
+      initQueueMetrics(child);
+    }
+  }
+
+  @Override
+  public void serviceInit(Configuration configuration) throws Exception {
+    super.serviceInit(configuration);
+
+    initQueueMetrics(getRootQueue());
+  }
+
   public void setQueueSet(Set<String> queues) {
     this.queueSet = queues;
   }