diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClusterMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClusterMetrics.java index 5917b99dc8c..dc943b12760 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClusterMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/ClusterMetrics.java @@ -48,6 +48,7 @@ @Metric("# of Shutdown NMs") MutableGaugeInt numShutdownNMs; @Metric("AM container launch delay") MutableRate aMLaunchDelay; @Metric("AM register delay") MutableRate aMRegisterDelay; + @Metric("AM container allocation delay") MutableRate aMContainerAllocationDelay; private static final MetricsInfo RECORD_INFO = info("ClusterMetrics", "Metrics for the Yarn Cluster"); @@ -190,4 +191,7 @@ public void addAMRegisterDelay(long delay) { aMRegisterDelay.add(delay); } + public void addAMContainerAllocationDelay(long delay) { + aMContainerAllocationDelay.add(delay); + } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java index bcc52e2cd22..3d224d89cae 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java @@ -178,6 +178,10 @@ private long launchAMStartTime = 0; private long launchAMEndTime = 0; + // initialized with a impossible value to make sure schedule is successful + private long scheduledTime = -1; + private long containerAllocatedTime = 0; + // Set to null initially. Will eventually get set // if an RMAppAttemptUnregistrationEvent occurs private FinalApplicationStatus finalStatus = null; @@ -1164,6 +1168,8 @@ public RMAppAttemptState transition(RMAppAttemptImpl appAttempt, && amContainerAllocation.getContainers() != null) { assert (amContainerAllocation.getContainers().size() == 0); } + + appAttempt.scheduledTime = System.currentTimeMillis(); return RMAppAttemptState.SCHEDULED; } else { // save state and then go to LAUNCHED state @@ -1220,6 +1226,9 @@ public RMAppAttemptState transition(RMAppAttemptImpl appAttempt, .clearNodeSetForAttempt(appAttempt.applicationAttemptId); appAttempt.getSubmissionContext().setResource( appAttempt.getMasterContainer().getResource()); + appAttempt.containerAllocatedTime = System.currentTimeMillis(); + long allocationDelay = appAttempt.containerAllocatedTime - appAttempt.scheduledTime; + ClusterMetrics.getMetrics().addAMContainerAllocationDelay(allocationDelay); appAttempt.storeAttempt(); return RMAppAttemptState.ALLOCATED_SAVING; } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClusterMetrics.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClusterMetrics.java index 5b9105f84c7..a9a1fbdf899 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClusterMetrics.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestClusterMetrics.java @@ -29,17 +29,23 @@ private ClusterMetrics metrics; /** - * Test aMLaunchDelay and aMRegisterDelay Metrics + * Test below metrics + * - aMLaunchDelay + * - aMRegisterDelay + * - aMContainerAllocationDelay */ @Test public void testAmMetrics() throws Exception { assert(metrics != null); Assert.assertTrue(!metrics.aMLaunchDelay.changed()); Assert.assertTrue(!metrics.aMRegisterDelay.changed()); + Assert.assertTrue(!metrics.aMContainerAllocationDelay.changed()); metrics.addAMLaunchDelay(1); metrics.addAMRegisterDelay(1); + metrics.addAMContainerAllocationDelay(1); Assert.assertTrue(metrics.aMLaunchDelay.changed()); Assert.assertTrue(metrics.aMRegisterDelay.changed()); + Assert.assertTrue(metrics.aMContainerAllocationDelay.changed()); } @Before