Explorar o código

YARN-4218. Metric for resource*time that was preempted. Contributed by Chang Li.

Eric Payne %!s(int64=8) %!d(string=hai) anos
pai
achega
93eeb13164
Modificáronse 34 ficheiros con 297 adicións e 37 borrados
  1. 42 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationResourceUsageReport.java
  2. 2 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto
  3. 7 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java
  4. 3 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java
  5. 28 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationResourceUsageReportPBImpl.java
  6. 7 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryManagerOnTimelineStore.java
  7. 9 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryManagerOnTimelineStore.java
  8. 6 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/metrics/ApplicationMetricsConstants.java
  9. 4 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/utils/BuilderUtils.java
  10. 2 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java
  11. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMServerUtils.java
  12. 4 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV1Publisher.java
  13. 6 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV2Publisher.java
  14. 7 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java
  15. 36 3
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/records/ApplicationAttemptStateData.java
  16. 24 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/records/impl/pb/ApplicationAttemptStateDataPBImpl.java
  17. 12 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java
  18. 15 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppMetrics.java
  19. 10 1
      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
  20. 16 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptMetrics.java
  21. 9 7
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/RMContainerImpl.java
  22. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java
  23. 7 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppBlock.java
  24. 11 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java
  25. 2 0
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/proto/yarn_server_resourcemanager_recovery.proto
  26. 2 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java
  27. 2 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/MockAsm.java
  28. 12 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisher.java
  29. 2 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisherForV2.java
  30. 2 2
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java
  31. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java
  32. 2 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestAppPage.java
  33. 2 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebAppFairScheduler.java
  34. 1 1
      hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesApps.java

+ 42 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationResourceUsageReport.java

@@ -36,7 +36,8 @@ public abstract class ApplicationResourceUsageReport {
   public static ApplicationResourceUsageReport newInstance(
   public static ApplicationResourceUsageReport newInstance(
       int numUsedContainers, int numReservedContainers, Resource usedResources,
       int numUsedContainers, int numReservedContainers, Resource usedResources,
       Resource reservedResources, Resource neededResources, long memorySeconds,
       Resource reservedResources, Resource neededResources, long memorySeconds,
-      long vcoreSeconds, float queueUsagePerc, float clusterUsagePerc) {
+      long vcoreSeconds, float queueUsagePerc, float clusterUsagePerc,
+      long preemptedMemorySeconds, long preemptedVcoresSeconds) {
     ApplicationResourceUsageReport report =
     ApplicationResourceUsageReport report =
         Records.newRecord(ApplicationResourceUsageReport.class);
         Records.newRecord(ApplicationResourceUsageReport.class);
     report.setNumUsedContainers(numUsedContainers);
     report.setNumUsedContainers(numUsedContainers);
@@ -48,6 +49,8 @@ public abstract class ApplicationResourceUsageReport {
     report.setVcoreSeconds(vcoreSeconds);
     report.setVcoreSeconds(vcoreSeconds);
     report.setQueueUsagePercentage(queueUsagePerc);
     report.setQueueUsagePercentage(queueUsagePerc);
     report.setClusterUsagePercentage(clusterUsagePerc);
     report.setClusterUsagePercentage(clusterUsagePerc);
+    report.setPreemptedMemorySeconds(preemptedMemorySeconds);
+    report.setPreemptedVcoreSeconds(preemptedVcoresSeconds);
     return report;
     return report;
   }
   }
 
 
@@ -188,4 +191,42 @@ public abstract class ApplicationResourceUsageReport {
   @Private
   @Private
   @Unstable
   @Unstable
   public abstract void setClusterUsagePercentage(float clusterUsagePerc);
   public abstract void setClusterUsagePercentage(float clusterUsagePerc);
+
+  /**
+   * Set the aggregated amount of memory preempted (in megabytes)
+   * the application has allocated times the number of seconds
+   * the application has been running.
+   * @param memorySeconds the aggregated amount of memory seconds
+   */
+  @Private
+  @Unstable
+  public abstract void setPreemptedMemorySeconds(long memorySeconds);
+
+  /**
+   * Get the aggregated amount of memory preempted(in megabytes)
+   * the application has allocated times the number of
+   * seconds the application has been running.
+   * @return the aggregated amount of memory seconds
+   */
+  @Public
+  @Unstable
+  public abstract long getPreemptedMemorySeconds();
+
+  /**
+   * Set the aggregated number of vcores preempted that the application has
+   * allocated times the number of seconds the application has been running.
+   * @param vcoreSeconds the aggregated number of vcore seconds
+   */
+  @Private
+  @Unstable
+  public abstract void setPreemptedVcoreSeconds(long vcoreSeconds);
+
+  /**
+   * Get the aggregated number of vcores preempted that the application has
+   * allocated times the number of seconds the application has been running.
+   * @return the aggregated number of vcore seconds
+   */
+  @Public
+  @Unstable
+  public abstract long getPreemptedVcoreSeconds();
 }
 }

+ 2 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto

@@ -184,6 +184,8 @@ message ApplicationResourceUsageReportProto {
   optional int64 vcore_seconds = 7;
   optional int64 vcore_seconds = 7;
   optional float queue_usage_percentage = 8;
   optional float queue_usage_percentage = 8;
   optional float cluster_usage_percentage = 9;
   optional float cluster_usage_percentage = 9;
+  optional int64 preempted_memory_seconds = 10;
+  optional int64 preempted_vcore_seconds = 11;
 }
 }
 
 
 message ApplicationReportProto {
 message ApplicationReportProto {

+ 7 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java

@@ -658,8 +658,15 @@ public class ApplicationCLI extends YarnCLI {
         //completed app report in the timeline server doesn't have usage report
         //completed app report in the timeline server doesn't have usage report
         appReportStr.print(usageReport.getMemorySeconds() + " MB-seconds, ");
         appReportStr.print(usageReport.getMemorySeconds() + " MB-seconds, ");
         appReportStr.println(usageReport.getVcoreSeconds() + " vcore-seconds");
         appReportStr.println(usageReport.getVcoreSeconds() + " vcore-seconds");
+        appReportStr.print("\tAggregate Resource Preempted : ");
+        appReportStr.print(usageReport.getPreemptedMemorySeconds() +
+            " MB-seconds, ");
+        appReportStr.println(usageReport.getPreemptedVcoreSeconds() +
+            " vcore-seconds");
       } else {
       } else {
         appReportStr.println("N/A");
         appReportStr.println("N/A");
+        appReportStr.print("\tAggregate Resource Preempted : ");
+        appReportStr.println("N/A");
       }
       }
       appReportStr.print("\tLog Aggregation Status : ");
       appReportStr.print("\tLog Aggregation Status : ");
       appReportStr.println(appReport.getLogAggregationStatus() == null ? "N/A"
       appReportStr.println(appReport.getLogAggregationStatus() == null ? "N/A"

+ 3 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java

@@ -115,7 +115,7 @@ public class TestYarnCLI {
       ApplicationId applicationId = ApplicationId.newInstance(1234, 5);
       ApplicationId applicationId = ApplicationId.newInstance(1234, 5);
       ApplicationResourceUsageReport usageReport = i == 0 ? null :
       ApplicationResourceUsageReport usageReport = i == 0 ? null :
           ApplicationResourceUsageReport.newInstance(
           ApplicationResourceUsageReport.newInstance(
-              2, 0, null, null, null, 123456, 4567, 0, 0);
+              2, 0, null, null, null, 123456, 4567, 0, 0, 1111, 2222);
       ApplicationReport newApplicationReport = ApplicationReport.newInstance(
       ApplicationReport newApplicationReport = ApplicationReport.newInstance(
           applicationId, ApplicationAttemptId.newInstance(applicationId, 1),
           applicationId, ApplicationAttemptId.newInstance(applicationId, 1),
           "user", "queue", "appname", "host", 124, null,
           "user", "queue", "appname", "host", 124, null,
@@ -148,6 +148,8 @@ public class TestYarnCLI {
       pw.println("\tAM Host : host");
       pw.println("\tAM Host : host");
       pw.println("\tAggregate Resource Allocation : " +
       pw.println("\tAggregate Resource Allocation : " +
           (i == 0 ? "N/A" : "123456 MB-seconds, 4567 vcore-seconds"));
           (i == 0 ? "N/A" : "123456 MB-seconds, 4567 vcore-seconds"));
+      pw.println("\tAggregate Resource Preempted : " +
+          (i == 0 ? "N/A" : "1111 MB-seconds, 2222 vcore-seconds"));
       pw.println("\tLog Aggregation Status : SUCCEEDED");
       pw.println("\tLog Aggregation Status : SUCCEEDED");
       pw.println("\tDiagnostics : diagnostics");
       pw.println("\tDiagnostics : diagnostics");
       pw.println("\tUnmanaged Application : false");
       pw.println("\tUnmanaged Application : false");

+ 28 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationResourceUsageReportPBImpl.java

@@ -224,6 +224,34 @@ extends ApplicationResourceUsageReport {
     return (p.getVcoreSeconds());
     return (p.getVcoreSeconds());
   }
   }
   
   
+  @Override
+  public synchronized void setPreemptedMemorySeconds(
+      long preemptedMemorySeconds) {
+    maybeInitBuilder();
+    builder.setPreemptedMemorySeconds(preemptedMemorySeconds);
+  }
+
+  @Override
+  public synchronized long getPreemptedMemorySeconds() {
+    ApplicationResourceUsageReportProtoOrBuilder p =
+        viaProto ? proto : builder;
+    return p.getPreemptedMemorySeconds();
+  }
+
+  @Override
+  public synchronized void setPreemptedVcoreSeconds(
+      long vcoreSeconds) {
+    maybeInitBuilder();
+    builder.setPreemptedVcoreSeconds(vcoreSeconds);
+  }
+
+  @Override
+  public synchronized long getPreemptedVcoreSeconds() {
+    ApplicationResourceUsageReportProtoOrBuilder p =
+        viaProto ? proto : builder;
+    return (p.getPreemptedVcoreSeconds());
+  }
+
   private ResourcePBImpl convertFromProtoFormat(ResourceProto p) {
   private ResourcePBImpl convertFromProtoFormat(ResourceProto p) {
     return new ResourcePBImpl(p);
     return new ResourcePBImpl(p);
   }
   }

+ 7 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/ApplicationHistoryManagerOnTimelineStore.java

@@ -334,9 +334,15 @@ public class ApplicationHistoryManagerOnTimelineStore extends AbstractService
                 ApplicationMetricsConstants.APP_CPU_METRICS).toString());
                 ApplicationMetricsConstants.APP_CPU_METRICS).toString());
         long memorySeconds=Long.parseLong(entityInfo.get(
         long memorySeconds=Long.parseLong(entityInfo.get(
                 ApplicationMetricsConstants.APP_MEM_METRICS).toString());
                 ApplicationMetricsConstants.APP_MEM_METRICS).toString());
+        long preemptedMemorySeconds = Long.parseLong(entityInfo.get(
+            ApplicationMetricsConstants
+                .APP_MEM_PREEMPT_METRICS).toString());
+        long preemptedVcoreSeconds = Long.parseLong(entityInfo.get(
+            ApplicationMetricsConstants
+                .APP_CPU_PREEMPT_METRICS).toString());
         appResources = ApplicationResourceUsageReport
         appResources = ApplicationResourceUsageReport
             .newInstance(0, 0, null, null, null, memorySeconds, vcoreSeconds, 0,
             .newInstance(0, 0, null, null, null, memorySeconds, vcoreSeconds, 0,
-                0);
+                0, preemptedMemorySeconds, preemptedVcoreSeconds);
       }
       }
       if (entityInfo.containsKey(ApplicationMetricsConstants.APP_TAGS_INFO)) {
       if (entityInfo.containsKey(ApplicationMetricsConstants.APP_TAGS_INFO)) {
         appTags = new HashSet<String>();
         appTags = new HashSet<String>();

+ 9 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/applicationhistoryservice/TestApplicationHistoryManagerOnTimelineStore.java

@@ -245,6 +245,11 @@ public class TestApplicationHistoryManagerOnTimelineStore {
           applicationResourceUsageReport.getMemorySeconds());
           applicationResourceUsageReport.getMemorySeconds());
       Assert
       Assert
           .assertEquals(345, applicationResourceUsageReport.getVcoreSeconds());
           .assertEquals(345, applicationResourceUsageReport.getVcoreSeconds());
+      Assert.assertEquals(456,
+          applicationResourceUsageReport.getPreemptedMemorySeconds());
+      Assert
+          .assertEquals(789, applicationResourceUsageReport
+              .getPreemptedVcoreSeconds());
       Assert.assertEquals(FinalApplicationStatus.UNDEFINED,
       Assert.assertEquals(FinalApplicationStatus.UNDEFINED,
           app.getFinalApplicationStatus());
           app.getFinalApplicationStatus());
       Assert.assertEquals(YarnApplicationState.FINISHED,
       Assert.assertEquals(YarnApplicationState.FINISHED,
@@ -503,8 +508,10 @@ public class TestApplicationHistoryManagerOnTimelineStore {
         Priority.newInstance(0));
         Priority.newInstance(0));
     entityInfo.put(ApplicationMetricsConstants.SUBMITTED_TIME_ENTITY_INFO,
     entityInfo.put(ApplicationMetricsConstants.SUBMITTED_TIME_ENTITY_INFO,
         Integer.MAX_VALUE + 1L);
         Integer.MAX_VALUE + 1L);
-    entityInfo.put(ApplicationMetricsConstants.APP_MEM_METRICS,123);
-    entityInfo.put(ApplicationMetricsConstants.APP_CPU_METRICS,345);
+    entityInfo.put(ApplicationMetricsConstants.APP_MEM_METRICS, 123);
+    entityInfo.put(ApplicationMetricsConstants.APP_CPU_METRICS, 345);
+    entityInfo.put(ApplicationMetricsConstants.APP_MEM_PREEMPT_METRICS,456);
+    entityInfo.put(ApplicationMetricsConstants.APP_CPU_PREEMPT_METRICS,789);
     if (emptyACLs) {
     if (emptyACLs) {
       entityInfo.put(ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO, "");
       entityInfo.put(ApplicationMetricsConstants.APP_VIEW_ACLS_ENTITY_INFO, "");
     } else {
     } else {

+ 6 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/metrics/ApplicationMetricsConstants.java

@@ -88,6 +88,12 @@ public class ApplicationMetricsConstants {
   public static final String APP_AM_CONTAINER_PREEMPTED =
   public static final String APP_AM_CONTAINER_PREEMPTED =
       "YARN_APPLICATION_AM_CONTAINER_PREEMPTED";
       "YARN_APPLICATION_AM_CONTAINER_PREEMPTED";
 
 
+  public static final String APP_CPU_PREEMPT_METRICS =
+      "YARN_APPLICATION_CPU_PREEMPT_METRIC";
+
+  public static final String APP_MEM_PREEMPT_METRICS =
+      "YARN_APPLICATION_MEM_PREEMPT_METRIC";
+
   public static final String LATEST_APP_ATTEMPT_EVENT_INFO =
   public static final String LATEST_APP_ATTEMPT_EVENT_INFO =
       "YARN_APPLICATION_LATEST_APP_ATTEMPT";
       "YARN_APPLICATION_LATEST_APP_ATTEMPT";
   
   

+ 4 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/utils/BuilderUtils.java

@@ -446,7 +446,8 @@ public class BuilderUtils {
   public static ApplicationResourceUsageReport newApplicationResourceUsageReport(
   public static ApplicationResourceUsageReport newApplicationResourceUsageReport(
       int numUsedContainers, int numReservedContainers, Resource usedResources,
       int numUsedContainers, int numReservedContainers, Resource usedResources,
       Resource reservedResources, Resource neededResources, long memorySeconds, 
       Resource reservedResources, Resource neededResources, long memorySeconds, 
-      long vcoreSeconds) {
+      long vcoreSeconds, long preemptedMemorySeconds,
+      long preemptedVcoreSeconds) {
     ApplicationResourceUsageReport report =
     ApplicationResourceUsageReport report =
         recordFactory.newRecordInstance(ApplicationResourceUsageReport.class);
         recordFactory.newRecordInstance(ApplicationResourceUsageReport.class);
     report.setNumUsedContainers(numUsedContainers);
     report.setNumUsedContainers(numUsedContainers);
@@ -456,6 +457,8 @@ public class BuilderUtils {
     report.setNeededResources(neededResources);
     report.setNeededResources(neededResources);
     report.setMemorySeconds(memorySeconds);
     report.setMemorySeconds(memorySeconds);
     report.setVcoreSeconds(vcoreSeconds);
     report.setVcoreSeconds(vcoreSeconds);
+    report.setPreemptedMemorySeconds(preemptedMemorySeconds);
+    report.setPreemptedVcoreSeconds(preemptedVcoreSeconds);
     return report;
     return report;
   }
   }
 
 

+ 2 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java

@@ -182,6 +182,8 @@ public class RMAppManager implements EventHandler<RMAppManagerEvent>,
           .add("finalStatus", app.getFinalApplicationStatus())
           .add("finalStatus", app.getFinalApplicationStatus())
           .add("memorySeconds", metrics.getMemorySeconds())
           .add("memorySeconds", metrics.getMemorySeconds())
           .add("vcoreSeconds", metrics.getVcoreSeconds())
           .add("vcoreSeconds", metrics.getVcoreSeconds())
+          .add("preemptedMemorySeconds", metrics.getPreemptedMemorySeconds())
+          .add("preemptedVcoreSeconds", metrics.getPreemptedVcoreSeconds())
           .add("preemptedAMContainers", metrics.getNumAMContainersPreempted())
           .add("preemptedAMContainers", metrics.getNumAMContainersPreempted())
           .add("preemptedNonAMContainers", metrics.getNumNonAMContainersPreempted())
           .add("preemptedNonAMContainers", metrics.getNumNonAMContainersPreempted())
           .add("preemptedResources", metrics.getResourcePreempted())
           .add("preemptedResources", metrics.getResourcePreempted())

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMServerUtils.java

@@ -453,7 +453,7 @@ public class RMServerUtils {
       DUMMY_APPLICATION_RESOURCE_USAGE_REPORT =
       DUMMY_APPLICATION_RESOURCE_USAGE_REPORT =
       BuilderUtils.newApplicationResourceUsageReport(-1, -1,
       BuilderUtils.newApplicationResourceUsageReport(-1, -1,
           Resources.createResource(-1, -1), Resources.createResource(-1, -1),
           Resources.createResource(-1, -1), Resources.createResource(-1, -1),
-          Resources.createResource(-1, -1), 0, 0);
+          Resources.createResource(-1, -1), 0, 0, 0, 0);
 
 
 
 
   /**
   /**

+ 4 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV1Publisher.java

@@ -144,6 +144,10 @@ public class TimelineServiceV1Publisher extends AbstractSystemMetricsPublisher {
         appMetrics.getVcoreSeconds());
         appMetrics.getVcoreSeconds());
     entity.addOtherInfo(ApplicationMetricsConstants.APP_MEM_METRICS,
     entity.addOtherInfo(ApplicationMetricsConstants.APP_MEM_METRICS,
         appMetrics.getMemorySeconds());
         appMetrics.getMemorySeconds());
+    entity.addOtherInfo(ApplicationMetricsConstants.APP_MEM_PREEMPT_METRICS,
+            appMetrics.getPreemptedMemorySeconds());
+    entity.addOtherInfo(ApplicationMetricsConstants.APP_CPU_PREEMPT_METRICS,
+            appMetrics.getPreemptedVcoreSeconds());
     tEvent.setEventInfo(eventInfo);
     tEvent.setEventInfo(eventInfo);
 
 
     entity.addEvent(tEvent);
     entity.addEvent(tEvent);

+ 6 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TimelineServiceV2Publisher.java

@@ -193,6 +193,12 @@ public class TimelineServiceV2Publisher extends AbstractSystemMetricsPublisher {
     entityMetrics.add(getTimelineMetric(
     entityMetrics.add(getTimelineMetric(
         ApplicationMetricsConstants.APP_MEM_METRICS, timestamp,
         ApplicationMetricsConstants.APP_MEM_METRICS, timestamp,
         appMetrics.getMemorySeconds()));
         appMetrics.getMemorySeconds()));
+    entityMetrics.add(getTimelineMetric(
+            ApplicationMetricsConstants.APP_MEM_PREEMPT_METRICS, timestamp,
+            appMetrics.getPreemptedMemorySeconds()));
+    entityMetrics.add(getTimelineMetric(
+            ApplicationMetricsConstants.APP_CPU_PREEMPT_METRICS, timestamp,
+            appMetrics.getPreemptedVcoreSeconds()));
     entityMetrics.add(getTimelineMetric(
     entityMetrics.add(getTimelineMetric(
         ApplicationMetricsConstants.APP_RESOURCE_PREEMPTED_CPU, timestamp,
         ApplicationMetricsConstants.APP_RESOURCE_PREEMPTED_CPU, timestamp,
         appMetrics.getResourcePreempted().getVirtualCores()));
         appMetrics.getResourcePreempted().getVirtualCores()));

+ 7 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStore.java

@@ -69,6 +69,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.AggregateAppR
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEvent;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEventType;
 import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEventType;
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptMetrics;
 import org.apache.hadoop.yarn.state.InvalidStateTransitionException;
 import org.apache.hadoop.yarn.state.InvalidStateTransitionException;
 import org.apache.hadoop.yarn.state.MultipleArcTransition;
 import org.apache.hadoop.yarn.state.MultipleArcTransition;
 import org.apache.hadoop.yarn.state.StateMachine;
 import org.apache.hadoop.yarn.state.StateMachine;
@@ -826,16 +827,19 @@ public abstract class RMStateStore extends AbstractService {
    */
    */
   public void storeNewApplicationAttempt(RMAppAttempt appAttempt) {
   public void storeNewApplicationAttempt(RMAppAttempt appAttempt) {
     Credentials credentials = getCredentialsFromAppAttempt(appAttempt);
     Credentials credentials = getCredentialsFromAppAttempt(appAttempt);
-
+    RMAppAttemptMetrics attempMetrics = appAttempt.getRMAppAttemptMetrics();
     AggregateAppResourceUsage resUsage =
     AggregateAppResourceUsage resUsage =
-        appAttempt.getRMAppAttemptMetrics().getAggregateAppResourceUsage();
+        attempMetrics.getAggregateAppResourceUsage();
     ApplicationAttemptStateData attemptState =
     ApplicationAttemptStateData attemptState =
         ApplicationAttemptStateData.newInstance(
         ApplicationAttemptStateData.newInstance(
             appAttempt.getAppAttemptId(),
             appAttempt.getAppAttemptId(),
             appAttempt.getMasterContainer(),
             appAttempt.getMasterContainer(),
             credentials, appAttempt.getStartTime(),
             credentials, appAttempt.getStartTime(),
             resUsage.getMemorySeconds(),
             resUsage.getMemorySeconds(),
-            resUsage.getVcoreSeconds());
+            resUsage.getVcoreSeconds(),
+            attempMetrics.getPreemptedMemory(),
+            attempMetrics.getPreemptedVcore()
+            );
 
 
     dispatcher.getEventHandler().handle(
     dispatcher.getEventHandler().handle(
       new RMStateStoreAppAttemptEvent(attemptState));
       new RMStateStoreAppAttemptEvent(attemptState));

+ 36 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/records/ApplicationAttemptStateData.java

@@ -40,7 +40,8 @@ public abstract class ApplicationAttemptStateData {
       Credentials attemptTokens, long startTime, RMAppAttemptState finalState,
       Credentials attemptTokens, long startTime, RMAppAttemptState finalState,
       String finalTrackingUrl, String diagnostics,
       String finalTrackingUrl, String diagnostics,
       FinalApplicationStatus amUnregisteredFinalStatus, int exitStatus,
       FinalApplicationStatus amUnregisteredFinalStatus, int exitStatus,
-      long finishTime, long memorySeconds, long vcoreSeconds) {
+      long finishTime, long memorySeconds, long vcoreSeconds,
+      long preemptedMemorySeconds, long preemptedVcoreSeconds) {
     ApplicationAttemptStateData attemptStateData =
     ApplicationAttemptStateData attemptStateData =
         Records.newRecord(ApplicationAttemptStateData.class);
         Records.newRecord(ApplicationAttemptStateData.class);
     attemptStateData.setAttemptId(attemptId);
     attemptStateData.setAttemptId(attemptId);
@@ -55,16 +56,20 @@ public abstract class ApplicationAttemptStateData {
     attemptStateData.setFinishTime(finishTime);
     attemptStateData.setFinishTime(finishTime);
     attemptStateData.setMemorySeconds(memorySeconds);
     attemptStateData.setMemorySeconds(memorySeconds);
     attemptStateData.setVcoreSeconds(vcoreSeconds);
     attemptStateData.setVcoreSeconds(vcoreSeconds);
+    attemptStateData.setPreemptedMemorySeconds(preemptedMemorySeconds);
+    attemptStateData.setPreemptedVcoreSeconds(preemptedVcoreSeconds);
     return attemptStateData;
     return attemptStateData;
   }
   }
 
 
   public static ApplicationAttemptStateData newInstance(
   public static ApplicationAttemptStateData newInstance(
       ApplicationAttemptId attemptId, Container masterContainer,
       ApplicationAttemptId attemptId, Container masterContainer,
       Credentials attemptTokens, long startTime, long memorySeconds,
       Credentials attemptTokens, long startTime, long memorySeconds,
-      long vcoreSeconds) {
+      long vcoreSeconds, long preemptedMemorySeconds,
+      long preemptedVcoreSeconds) {
     return newInstance(attemptId, masterContainer, attemptTokens,
     return newInstance(attemptId, masterContainer, attemptTokens,
         startTime, null, "N/A", "", null, ContainerExitStatus.INVALID, 0,
         startTime, null, "N/A", "", null, ContainerExitStatus.INVALID, 0,
-        memorySeconds, vcoreSeconds);
+        memorySeconds, vcoreSeconds,
+        preemptedMemorySeconds, preemptedVcoreSeconds);
     }
     }
 
 
 
 
@@ -182,4 +187,32 @@ public abstract class ApplicationAttemptStateData {
   @Public
   @Public
   @Unstable
   @Unstable
   public abstract void setVcoreSeconds(long vcoreSeconds);
   public abstract void setVcoreSeconds(long vcoreSeconds);
+
+  /**
+   * Get the <em>preempted memory seconds</em>
+   * (in MB seconds) of the application.
+   * @return <em>preempted memory seconds</em>
+   * (in MB seconds) of the application
+   */
+  @Public
+  @Unstable
+  public abstract long getPreemptedMemorySeconds();
+
+  @Public
+  @Unstable
+  public abstract void setPreemptedMemorySeconds(long memorySeconds);
+
+  /**
+   * Get the <em>preempted vcore seconds</em>
+   * of the application.
+   * @return <em>preempted vcore seconds</em>
+   * of the application
+   */
+  @Public
+  @Unstable
+  public abstract long getPreemptedVcoreSeconds();
+
+  @Public
+  @Unstable
+  public abstract void setPreemptedVcoreSeconds(long vcoreSeconds);
 }
 }

+ 24 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/records/impl/pb/ApplicationAttemptStateDataPBImpl.java

@@ -262,6 +262,30 @@ public class ApplicationAttemptStateDataPBImpl extends
     builder.setVcoreSeconds(vcoreSeconds);
     builder.setVcoreSeconds(vcoreSeconds);
   }
   }
 
 
+  @Override
+  public long getPreemptedMemorySeconds() {
+    ApplicationAttemptStateDataProtoOrBuilder p = viaProto ? proto : builder;
+    return p.getPreemptedMemorySeconds();
+  }
+
+  @Override
+  public long getPreemptedVcoreSeconds() {
+    ApplicationAttemptStateDataProtoOrBuilder p = viaProto ? proto : builder;
+    return p.getPreemptedVcoreSeconds();
+  }
+
+  @Override
+  public void setPreemptedMemorySeconds(long memorySeconds) {
+    maybeInitBuilder();
+    builder.setPreemptedMemorySeconds(memorySeconds);
+  }
+
+  @Override
+  public void setPreemptedVcoreSeconds(long vcoreSeconds) {
+    maybeInitBuilder();
+    builder.setPreemptedVcoreSeconds(vcoreSeconds);
+  }
+
   @Override
   @Override
   public FinalApplicationStatus getFinalApplicationStatus() {
   public FinalApplicationStatus getFinalApplicationStatus() {
     ApplicationAttemptStateDataProtoOrBuilder p = viaProto ? proto : builder;
     ApplicationAttemptStateDataProtoOrBuilder p = viaProto ? proto : builder;

+ 12 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppImpl.java

@@ -757,6 +757,12 @@ public class RMAppImpl implements RMApp, Recoverable {
         RMAppMetrics rmAppMetrics = getRMAppMetrics();
         RMAppMetrics rmAppMetrics = getRMAppMetrics();
         appUsageReport.setMemorySeconds(rmAppMetrics.getMemorySeconds());
         appUsageReport.setMemorySeconds(rmAppMetrics.getMemorySeconds());
         appUsageReport.setVcoreSeconds(rmAppMetrics.getVcoreSeconds());
         appUsageReport.setVcoreSeconds(rmAppMetrics.getVcoreSeconds());
+        appUsageReport.
+            setPreemptedMemorySeconds(rmAppMetrics.
+                getPreemptedMemorySeconds());
+        appUsageReport.
+            setPreemptedVcoreSeconds(rmAppMetrics.
+                getPreemptedVcoreSeconds());
       }
       }
 
 
       if (currentApplicationAttemptId == null) {
       if (currentApplicationAttemptId == null) {
@@ -1630,6 +1636,8 @@ public class RMAppImpl implements RMApp, Recoverable {
     int numNonAMContainerPreempted = 0;
     int numNonAMContainerPreempted = 0;
     long memorySeconds = 0;
     long memorySeconds = 0;
     long vcoreSeconds = 0;
     long vcoreSeconds = 0;
+    long preemptedMemorySeconds = 0;
+    long preemptedVcoreSeconds = 0;
     for (RMAppAttempt attempt : attempts.values()) {
     for (RMAppAttempt attempt : attempts.values()) {
       if (null != attempt) {
       if (null != attempt) {
         RMAppAttemptMetrics attemptMetrics =
         RMAppAttemptMetrics attemptMetrics =
@@ -1645,12 +1653,15 @@ public class RMAppImpl implements RMApp, Recoverable {
             attempt.getRMAppAttemptMetrics().getAggregateAppResourceUsage();
             attempt.getRMAppAttemptMetrics().getAggregateAppResourceUsage();
         memorySeconds += resUsage.getMemorySeconds();
         memorySeconds += resUsage.getMemorySeconds();
         vcoreSeconds += resUsage.getVcoreSeconds();
         vcoreSeconds += resUsage.getVcoreSeconds();
+        preemptedMemorySeconds += attemptMetrics.getPreemptedMemory();
+        preemptedVcoreSeconds += attemptMetrics.getPreemptedVcore();
       }
       }
     }
     }
 
 
     return new RMAppMetrics(resourcePreempted,
     return new RMAppMetrics(resourcePreempted,
         numNonAMContainerPreempted, numAMContainerPreempted,
         numNonAMContainerPreempted, numAMContainerPreempted,
-        memorySeconds, vcoreSeconds);
+        memorySeconds, vcoreSeconds,
+        preemptedMemorySeconds, preemptedVcoreSeconds);
   }
   }
 
 
   @Private
   @Private

+ 15 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/RMAppMetrics.java

@@ -26,15 +26,20 @@ public class RMAppMetrics {
   final int numAMContainersPreempted;
   final int numAMContainersPreempted;
   final long memorySeconds;
   final long memorySeconds;
   final long vcoreSeconds;
   final long vcoreSeconds;
+  private final long preemptedMemorySeconds;
+  private final long preemptedVcoreSeconds;
 
 
   public RMAppMetrics(Resource resourcePreempted,
   public RMAppMetrics(Resource resourcePreempted,
       int numNonAMContainersPreempted, int numAMContainersPreempted,
       int numNonAMContainersPreempted, int numAMContainersPreempted,
-      long memorySeconds, long vcoreSeconds) {
+      long memorySeconds, long vcoreSeconds, long preemptedMemorySeconds,
+      long preemptedVcoreSeconds) {
     this.resourcePreempted = resourcePreempted;
     this.resourcePreempted = resourcePreempted;
     this.numNonAMContainersPreempted = numNonAMContainersPreempted;
     this.numNonAMContainersPreempted = numNonAMContainersPreempted;
     this.numAMContainersPreempted = numAMContainersPreempted;
     this.numAMContainersPreempted = numAMContainersPreempted;
     this.memorySeconds = memorySeconds;
     this.memorySeconds = memorySeconds;
     this.vcoreSeconds = vcoreSeconds;
     this.vcoreSeconds = vcoreSeconds;
+    this.preemptedMemorySeconds = preemptedMemorySeconds;
+    this.preemptedVcoreSeconds = preemptedVcoreSeconds;
   }
   }
 
 
   public Resource getResourcePreempted() {
   public Resource getResourcePreempted() {
@@ -56,4 +61,13 @@ public class RMAppMetrics {
   public long getVcoreSeconds() {
   public long getVcoreSeconds() {
     return vcoreSeconds;
     return vcoreSeconds;
   }
   }
+
+  public long getPreemptedMemorySeconds() {
+    return preemptedMemorySeconds;
+  }
+
+  public long getPreemptedVcoreSeconds() {
+    return preemptedVcoreSeconds;
+  }
+
 }
 }

+ 10 - 1
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

@@ -889,6 +889,10 @@ public class RMAppAttemptImpl implements RMAppAttempt, Recoverable {
           this.attemptMetrics.getAggregateAppResourceUsage();
           this.attemptMetrics.getAggregateAppResourceUsage();
       report.setMemorySeconds(resUsage.getMemorySeconds());
       report.setMemorySeconds(resUsage.getMemorySeconds());
       report.setVcoreSeconds(resUsage.getVcoreSeconds());
       report.setVcoreSeconds(resUsage.getVcoreSeconds());
+      report.setPreemptedMemorySeconds(
+          this.attemptMetrics.getPreemptedMemory());
+      report.setPreemptedVcoreSeconds(
+          this.attemptMetrics.getPreemptedVcore());
       return report;
       return report;
     } finally {
     } finally {
       this.readLock.unlock();
       this.readLock.unlock();
@@ -921,6 +925,9 @@ public class RMAppAttemptImpl implements RMAppAttempt, Recoverable {
     this.finishTime = attemptState.getFinishTime();
     this.finishTime = attemptState.getFinishTime();
     this.attemptMetrics.updateAggregateAppResourceUsage(
     this.attemptMetrics.updateAggregateAppResourceUsage(
         attemptState.getMemorySeconds(),attemptState.getVcoreSeconds());
         attemptState.getMemorySeconds(),attemptState.getVcoreSeconds());
+    this.attemptMetrics.updateAggregatePreemptedAppResourceUsage(
+        attemptState.getPreemptedMemorySeconds(),
+        attemptState.getPreemptedVcoreSeconds());
   }
   }
 
 
   public void transferStateFromAttempt(RMAppAttempt attempt) {
   public void transferStateFromAttempt(RMAppAttempt attempt) {
@@ -1296,7 +1303,9 @@ public class RMAppAttemptImpl implements RMAppAttempt, Recoverable {
             startTime, stateToBeStored, finalTrackingUrl, diags,
             startTime, stateToBeStored, finalTrackingUrl, diags,
             finalStatus, exitStatus,
             finalStatus, exitStatus,
           getFinishTime(), resUsage.getMemorySeconds(),
           getFinishTime(), resUsage.getMemorySeconds(),
-          resUsage.getVcoreSeconds());
+          resUsage.getVcoreSeconds(),
+          this.attemptMetrics.getPreemptedMemory(),
+          this.attemptMetrics.getPreemptedVcore());
     LOG.info("Updating application attempt " + applicationAttemptId
     LOG.info("Updating application attempt " + applicationAttemptId
         + " with final state: " + targetedFinalState + ", and exit status: "
         + " with final state: " + targetedFinalState + ", and exit status: "
         + exitStatus);
         + exitStatus);

+ 16 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptMetrics.java

@@ -50,6 +50,8 @@ public class RMAppAttemptMetrics {
   private WriteLock writeLock;
   private WriteLock writeLock;
   private AtomicLong finishedMemorySeconds = new AtomicLong(0);
   private AtomicLong finishedMemorySeconds = new AtomicLong(0);
   private AtomicLong finishedVcoreSeconds = new AtomicLong(0);
   private AtomicLong finishedVcoreSeconds = new AtomicLong(0);
+  private AtomicLong preemptedMemorySeconds = new AtomicLong(0);
+  private AtomicLong preemptedVcoreSeconds = new AtomicLong(0);
   private RMContext rmContext;
   private RMContext rmContext;
 
 
   private int[][] localityStatistics =
   private int[][] localityStatistics =
@@ -98,6 +100,14 @@ public class RMAppAttemptMetrics {
     }
     }
   }
   }
 
 
+  public long getPreemptedMemory() {
+    return preemptedMemorySeconds.get();
+  }
+
+  public long getPreemptedVcore() {
+    return preemptedVcoreSeconds.get();
+  }
+
   public int getNumNonAMContainersPreempted() {
   public int getNumNonAMContainersPreempted() {
     return numNonAMContainersPreempted.get();
     return numNonAMContainersPreempted.get();
   }
   }
@@ -134,6 +144,12 @@ public class RMAppAttemptMetrics {
     this.finishedVcoreSeconds.addAndGet(finishedVcoreSeconds);
     this.finishedVcoreSeconds.addAndGet(finishedVcoreSeconds);
   }
   }
 
 
+  public void updateAggregatePreemptedAppResourceUsage(
+      long preemptedMemorySeconds, long preemptedVcoreSeconds) {
+    this.preemptedMemorySeconds.addAndGet(preemptedMemorySeconds);
+    this.preemptedVcoreSeconds.addAndGet(preemptedVcoreSeconds);
+  }
+
   public void incNumAllocatedContainers(NodeType containerType,
   public void incNumAllocatedContainers(NodeType containerType,
       NodeType requestType) {
       NodeType requestType) {
     localityStatistics[containerType.index][requestType.index]++;
     localityStatistics[containerType.index][requestType.index]++;

+ 9 - 7
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/RMContainerImpl.java

@@ -729,19 +729,12 @@ public class RMContainerImpl implements RMContainer, Comparable<RMContainer> {
     }
     }
 
 
     private static void updateAttemptMetrics(RMContainerImpl container) {
     private static void updateAttemptMetrics(RMContainerImpl container) {
-      // If this is a preempted container, update preemption metrics
       Resource resource = container.getContainer().getResource();
       Resource resource = container.getContainer().getResource();
       RMAppAttempt rmAttempt = container.rmContext.getRMApps()
       RMAppAttempt rmAttempt = container.rmContext.getRMApps()
           .get(container.getApplicationAttemptId().getApplicationId())
           .get(container.getApplicationAttemptId().getApplicationId())
           .getCurrentAppAttempt();
           .getCurrentAppAttempt();
 
 
       if (rmAttempt != null) {
       if (rmAttempt != null) {
-        if (ContainerExitStatus.PREEMPTED == container.finishedStatus
-            .getExitStatus()) {
-            rmAttempt.getRMAppAttemptMetrics().updatePreemptionInfo(resource,
-              container);
-          }
-        
         long usedMillis = container.finishTime - container.creationTime;
         long usedMillis = container.finishTime - container.creationTime;
         long memorySeconds = resource.getMemorySize()
         long memorySeconds = resource.getMemorySize()
                               * usedMillis / DateUtils.MILLIS_PER_SECOND;
                               * usedMillis / DateUtils.MILLIS_PER_SECOND;
@@ -749,6 +742,15 @@ public class RMContainerImpl implements RMContainer, Comparable<RMContainer> {
                              * usedMillis / DateUtils.MILLIS_PER_SECOND;
                              * usedMillis / DateUtils.MILLIS_PER_SECOND;
         rmAttempt.getRMAppAttemptMetrics()
         rmAttempt.getRMAppAttemptMetrics()
                   .updateAggregateAppResourceUsage(memorySeconds,vcoreSeconds);
                   .updateAggregateAppResourceUsage(memorySeconds,vcoreSeconds);
+        // If this is a preempted container, update preemption metrics
+        if (ContainerExitStatus.PREEMPTED == container.finishedStatus
+                .getExitStatus()) {
+          rmAttempt.getRMAppAttemptMetrics().updatePreemptionInfo(resource,
+                  container);
+          rmAttempt.getRMAppAttemptMetrics()
+                  .updateAggregatePreemptedAppResourceUsage(memorySeconds,
+                          vcoreSeconds);
+        }
       }
       }
     }
     }
   }
   }

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java

@@ -914,7 +914,7 @@ public class SchedulerApplicationAttempt implements SchedulableEntity {
           Resources.add(usedResourceClone, reservedResourceClone),
           Resources.add(usedResourceClone, reservedResourceClone),
           runningResourceUsage.getMemorySeconds(),
           runningResourceUsage.getMemorySeconds(),
           runningResourceUsage.getVcoreSeconds(), queueUsagePerc,
           runningResourceUsage.getVcoreSeconds(), queueUsagePerc,
-          clusterUsagePerc);
+          clusterUsagePerc, 0, 0);
     } finally {
     } finally {
       writeLock.unlock();
       writeLock.unlock();
     }
     }

+ 7 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppBlock.java

@@ -101,7 +101,13 @@ public class RMAppBlock extends AppBlock{
         ._("Aggregate Resource Allocation:",
         ._("Aggregate Resource Allocation:",
           String.format("%d MB-seconds, %d vcore-seconds",
           String.format("%d MB-seconds, %d vcore-seconds",
               appMetrics == null ? "N/A" : appMetrics.getMemorySeconds(),
               appMetrics == null ? "N/A" : appMetrics.getMemorySeconds(),
-              appMetrics == null ? "N/A" : appMetrics.getVcoreSeconds()));
+              appMetrics == null ? "N/A" : appMetrics.getVcoreSeconds()))
+        ._("Aggregate Preempted Resource Allocation:",
+          String.format("%d MB-seconds, %d vcore-seconds",
+            appMetrics == null ? "N/A" : appMetrics.getPreemptedMemorySeconds(),
+            appMetrics == null ? "N/A" :
+                appMetrics.getPreemptedVcoreSeconds()));
+
     pdiv._();
     pdiv._();
   }
   }
 
 

+ 11 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/AppInfo.java

@@ -100,6 +100,8 @@ public class AppInfo {
   protected long preemptedResourceVCores;
   protected long preemptedResourceVCores;
   protected int numNonAMContainerPreempted;
   protected int numNonAMContainerPreempted;
   protected int numAMContainerPreempted;
   protected int numAMContainerPreempted;
+  private long preemptedMemorySeconds;
+  private long preemptedVcoreSeconds;
 
 
   // list of resource requests
   // list of resource requests
   @XmlElement(name = "resourceRequests")
   @XmlElement(name = "resourceRequests")
@@ -216,6 +218,8 @@ public class AppInfo {
           appMetrics.getResourcePreempted().getVirtualCores();
           appMetrics.getResourcePreempted().getVirtualCores();
       memorySeconds = appMetrics.getMemorySeconds();
       memorySeconds = appMetrics.getMemorySeconds();
       vcoreSeconds = appMetrics.getVcoreSeconds();
       vcoreSeconds = appMetrics.getVcoreSeconds();
+      preemptedMemorySeconds = appMetrics.getPreemptedMemorySeconds();
+      preemptedVcoreSeconds = appMetrics.getPreemptedVcoreSeconds();
       unmanagedApplication =
       unmanagedApplication =
           appSubmissionContext.getUnmanagedAM();
           appSubmissionContext.getUnmanagedAM();
       appNodeLabelExpression =
       appNodeLabelExpression =
@@ -382,6 +386,13 @@ public class AppInfo {
     return vcoreSeconds;
     return vcoreSeconds;
   }
   }
 
 
+  public long getPreemptedMemorySeconds() {
+    return preemptedMemorySeconds;
+  }
+
+  public long getPreemptedVcoreSeconds() {
+    return preemptedVcoreSeconds;
+  }
   public List<ResourceRequestInfo> getResourceRequests() {
   public List<ResourceRequestInfo> getResourceRequests() {
     return this.resourceRequests;
     return this.resourceRequests;
   }
   }

+ 2 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/proto/yarn_server_resourcemanager_recovery.proto

@@ -85,6 +85,8 @@ message ApplicationAttemptStateDataProto {
     optional int64 memory_seconds = 10;
     optional int64 memory_seconds = 10;
     optional int64 vcore_seconds = 11;
     optional int64 vcore_seconds = 11;
     optional int64 finish_time = 12;
     optional int64 finish_time = 12;
+    optional int64 preempted_memory_seconds = 13;
+    optional int64 preempted_vcore_seconds = 14;
 }
 }
 
 
 message EpochProto {
 message EpochProto {

+ 2 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java

@@ -689,7 +689,8 @@ public class TestAppManager{
     when(app.getState()).thenReturn(RMAppState.RUNNING);
     when(app.getState()).thenReturn(RMAppState.RUNNING);
     when(app.getApplicationType()).thenReturn("MAPREDUCE");
     when(app.getApplicationType()).thenReturn("MAPREDUCE");
     RMAppMetrics metrics =
     RMAppMetrics metrics =
-        new RMAppMetrics(Resource.newInstance(1234, 56), 10, 1, 16384, 64);
+        new RMAppMetrics(Resource.newInstance(1234, 56),
+            10, 1, 16384, 64, 0, 0);
     when(app.getRMAppMetrics()).thenReturn(metrics);
     when(app.getRMAppMetrics()).thenReturn(metrics);
 
 
     RMAppManager.ApplicationSummary.SummaryBuilder summary =
     RMAppManager.ApplicationSummary.SummaryBuilder summary =

+ 2 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/applicationsmanager/MockAsm.java

@@ -194,7 +194,7 @@ public abstract class MockAsm extends MockApps {
 
 
     @Override
     @Override
     public RMAppMetrics getRMAppMetrics() {
     public RMAppMetrics getRMAppMetrics() {
-      return new RMAppMetrics(Resource.newInstance(0, 0), 0, 0, 0, 0);
+      return new RMAppMetrics(Resource.newInstance(0, 0), 0, 0, 0, 0, 0, 0);
     }
     }
 
 
     @Override
     @Override
@@ -328,7 +328,7 @@ public abstract class MockAsm extends MockApps {
           String clientUserName, boolean allowAccess) {
           String clientUserName, boolean allowAccess) {
         ApplicationResourceUsageReport usageReport =
         ApplicationResourceUsageReport usageReport =
             ApplicationResourceUsageReport.newInstance(0, 0, null, null, null, 
             ApplicationResourceUsageReport.newInstance(0, 0, null, null, null, 
-            0, 0, 0, 0);
+            0, 0, 0, 0, 0, 0);
         ApplicationReport report = ApplicationReport.newInstance(
         ApplicationReport report = ApplicationReport.newInstance(
             getApplicationId(), appAttemptId, getUser(), getQueue(), 
             getApplicationId(), appAttemptId, getUser(), getQueue(), 
             getName(), null, 0, null, null, getDiagnostics().toString(), 
             getName(), null, 0, null, null, getDiagnostics().toString(), 

+ 12 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisher.java

@@ -223,6 +223,16 @@ public class TestSystemMetricsPublisher {
             app.getRMAppMetrics().getVcoreSeconds(),
             app.getRMAppMetrics().getVcoreSeconds(),
             Long.parseLong(entity.getOtherInfo()
             Long.parseLong(entity.getOtherInfo()
                 .get(ApplicationMetricsConstants.APP_CPU_METRICS).toString()));
                 .get(ApplicationMetricsConstants.APP_CPU_METRICS).toString()));
+        Assert.assertEquals(
+            app.getRMAppMetrics().getPreemptedMemorySeconds(),
+            Long.parseLong(entity.getOtherInfo()
+                .get(ApplicationMetricsConstants.APP_MEM_PREEMPT_METRICS)
+                .toString()));
+        Assert.assertEquals(
+            app.getRMAppMetrics().getPreemptedVcoreSeconds(),
+            Long.parseLong(entity.getOtherInfo()
+                .get(ApplicationMetricsConstants.APP_CPU_PREEMPT_METRICS)
+                .toString()));
       }
       }
       Assert.assertEquals("context", entity.getOtherInfo()
       Assert.assertEquals("context", entity.getOtherInfo()
           .get(ApplicationMetricsConstants.YARN_APP_CALLER_CONTEXT));
           .get(ApplicationMetricsConstants.YARN_APP_CALLER_CONTEXT));
@@ -496,7 +506,8 @@ public class TestSystemMetricsPublisher {
     when(app.getFinalApplicationStatus()).thenReturn(
     when(app.getFinalApplicationStatus()).thenReturn(
         FinalApplicationStatus.UNDEFINED);
         FinalApplicationStatus.UNDEFINED);
     when(app.getRMAppMetrics()).thenReturn(
     when(app.getRMAppMetrics()).thenReturn(
-        new RMAppMetrics(null, 0, 0, Integer.MAX_VALUE, Long.MAX_VALUE));
+        new RMAppMetrics(null, 0, 0, Integer.MAX_VALUE, Long.MAX_VALUE,
+            Integer.MAX_VALUE, Long.MAX_VALUE));
     Set<String> appTags = new HashSet<String>();
     Set<String> appTags = new HashSet<String>();
     appTags.add("test");
     appTags.add("test");
     appTags.add("tags");
     appTags.add("tags");

+ 2 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/metrics/TestSystemMetricsPublisherForV2.java

@@ -211,7 +211,7 @@ public class TestSystemMetricsPublisherForV2 {
             + FileSystemTimelineWriterImpl.TIMELINE_SERVICE_STORAGE_EXTENSION;
             + FileSystemTimelineWriterImpl.TIMELINE_SERVICE_STORAGE_EXTENSION;
     File appFile = new File(outputDirApp, timelineServiceFileName);
     File appFile = new File(outputDirApp, timelineServiceFileName);
     Assert.assertTrue(appFile.exists());
     Assert.assertTrue(appFile.exists());
-    verifyEntity(appFile, 3, ApplicationMetricsConstants.CREATED_EVENT_TYPE, 6);
+    verifyEntity(appFile, 3, ApplicationMetricsConstants.CREATED_EVENT_TYPE, 8);
   }
   }
 
 
   @Test(timeout = 10000)
   @Test(timeout = 10000)
@@ -355,7 +355,7 @@ public class TestSystemMetricsPublisherForV2 {
         FinalApplicationStatus.UNDEFINED);
         FinalApplicationStatus.UNDEFINED);
     when(app.getRMAppMetrics()).thenReturn(
     when(app.getRMAppMetrics()).thenReturn(
         new RMAppMetrics(Resource.newInstance(0, 0), 0, 0, Integer.MAX_VALUE,
         new RMAppMetrics(Resource.newInstance(0, 0), 0, 0, Integer.MAX_VALUE,
-            Long.MAX_VALUE));
+            Long.MAX_VALUE, 0, 0));
     when(app.getApplicationTags()).thenReturn(Collections.<String> emptySet());
     when(app.getApplicationTags()).thenReturn(Collections.<String> emptySet());
     ApplicationSubmissionContext appSubmissionContext =
     ApplicationSubmissionContext appSubmissionContext =
         mock(ApplicationSubmissionContext.class);
         mock(ApplicationSubmissionContext.class);

+ 2 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/RMStateStoreTestBase.java

@@ -361,7 +361,7 @@ public class RMStateStoreTestBase {
             oldAttemptState.getStartTime(), RMAppAttemptState.FINISHED,
             oldAttemptState.getStartTime(), RMAppAttemptState.FINISHED,
             "myTrackingUrl", "attemptDiagnostics",
             "myTrackingUrl", "attemptDiagnostics",
             FinalApplicationStatus.SUCCEEDED, 100,
             FinalApplicationStatus.SUCCEEDED, 100,
-            oldAttemptState.getFinishTime(), 0, 0);
+            oldAttemptState.getFinishTime(), 0, 0, 0, 0);
     store.updateApplicationAttemptState(newAttemptState);
     store.updateApplicationAttemptState(newAttemptState);
 
 
     // test updating the state of an app/attempt whose initial state was not
     // test updating the state of an app/attempt whose initial state was not
@@ -385,7 +385,7 @@ public class RMStateStoreTestBase {
             oldAttemptState.getStartTime(), RMAppAttemptState.FINISHED,
             oldAttemptState.getStartTime(), RMAppAttemptState.FINISHED,
             "myTrackingUrl", "attemptDiagnostics",
             "myTrackingUrl", "attemptDiagnostics",
             FinalApplicationStatus.SUCCEEDED, 111,
             FinalApplicationStatus.SUCCEEDED, 111,
-            oldAttemptState.getFinishTime(), 0, 0);
+            oldAttemptState.getFinishTime(), 0, 0, 0, 0);
     store.updateApplicationAttemptState(dummyAttempt);
     store.updateApplicationAttemptState(dummyAttempt);
 
 
     // let things settle down
     // let things settle down

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java

@@ -428,7 +428,7 @@ public class TestZKRMStateStore extends RMStateStoreTestBase {
             store.getCredentialsFromAppAttempt(mockAttempt),
             store.getCredentialsFromAppAttempt(mockAttempt),
             startTime, RMAppAttemptState.FINISHED, "testUrl", 
             startTime, RMAppAttemptState.FINISHED, "testUrl", 
             "test", FinalApplicationStatus.SUCCEEDED, 100, 
             "test", FinalApplicationStatus.SUCCEEDED, 100, 
-            finishTime, 0, 0);
+            finishTime, 0, 0, 0, 0);
     store.updateApplicationAttemptState(newAttemptState);
     store.updateApplicationAttemptState(newAttemptState);
     assertEquals("RMStateStore should have been in fenced state",
     assertEquals("RMStateStore should have been in fenced state",
             true, store.isFencedState());
             true, store.isFencedState());

+ 2 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestAppPage.java

@@ -64,7 +64,8 @@ public class TestAppPage {
     when(app.getFinishTime()).thenReturn(0L);
     when(app.getFinishTime()).thenReturn(0L);
     when(app.createApplicationState()).thenReturn(YarnApplicationState.FAILED);
     when(app.createApplicationState()).thenReturn(YarnApplicationState.FAILED);
     
     
-    RMAppMetrics appMetrics = new RMAppMetrics(Resource.newInstance(0, 0), 0, 0, 0, 0);
+    RMAppMetrics appMetrics = new RMAppMetrics(
+        Resource.newInstance(0, 0), 0, 0, 0, 0, 0, 0);
     when(app.getRMAppMetrics()).thenReturn(appMetrics);
     when(app.getRMAppMetrics()).thenReturn(appMetrics);
     
     
     // initialize RM Context, and create RMApp, without creating RMAppAttempt
     // initialize RM Context, and create RMApp, without creating RMAppAttempt

+ 2 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebAppFairScheduler.java

@@ -142,7 +142,8 @@ public class TestRMWebAppFairScheduler {
       MockRMApp app = new MockRMApp(i, i, state) {
       MockRMApp app = new MockRMApp(i, i, state) {
         @Override
         @Override
         public RMAppMetrics getRMAppMetrics() {
         public RMAppMetrics getRMAppMetrics() {
-          return new RMAppMetrics(Resource.newInstance(0, 0), 0, 0, 0, 0);
+          return new RMAppMetrics(Resource.newInstance(0, 0),
+              0, 0, 0, 0, 0, 0);
         }
         }
         @Override
         @Override
         public YarnApplicationState createApplicationState() {
         public YarnApplicationState createApplicationState() {

+ 1 - 1
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesApps.java

@@ -1419,7 +1419,7 @@ public class TestRMWebServicesApps extends JerseyTestBase {
   public void verifyAppInfo(JSONObject info, RMApp app) throws JSONException,
   public void verifyAppInfo(JSONObject info, RMApp app) throws JSONException,
       Exception {
       Exception {
 
 
-    int expectedNumberOfElements = 32;
+    int expectedNumberOfElements = 34;
     String appNodeLabelExpression = null;
     String appNodeLabelExpression = null;
     String amNodeLabelExpression = null;
     String amNodeLabelExpression = null;
     if (app.getApplicationSubmissionContext()
     if (app.getApplicationSubmissionContext()