YARN-3451. Display attempt start time and elapsed time on the web UI. Contributed by Rohith Sharmaks
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/d9c8159e Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/d9c8159e Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/d9c8159e Branch: refs/heads/YARN-2928 Commit: d9c8159e1cd4e66c493f6d215ff874a92c5aed94 Parents: 4459349 Author: Jian He <[email protected]> Authored: Fri Apr 17 15:55:34 2015 -0700 Committer: Zhijie Shen <[email protected]> Committed: Tue Apr 21 16:16:52 2015 -0700 ---------------------------------------------------------------------- hadoop-yarn-project/CHANGES.txt | 3 ++ .../api/records/ApplicationAttemptReport.java | 34 +++++++++++++++++++- .../src/main/proto/yarn_protos.proto | 2 ++ .../hadoop/yarn/client/ProtocolHATestBase.java | 3 +- .../yarn/client/api/impl/TestYarnClient.java | 3 +- .../hadoop/yarn/client/cli/TestYarnCLI.java | 8 ++--- .../impl/pb/ApplicationAttemptReportPBImpl.java | 24 ++++++++++++++ .../yarn/server/webapp/dao/AppAttemptInfo.java | 12 +++++++ .../rmapp/attempt/RMAppAttemptImpl.java | 3 +- .../webapp/RMAppAttemptBlock.java | 5 +++ 10 files changed, 89 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 415cf9c..dd55bfd 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -201,6 +201,9 @@ Release 2.8.0 - UNRELEASED YARN-2696. Queue sorting in CapacityScheduler should consider node label. (Wangda Tan via jianhe) + YARN-3451. Display attempt start time and elapsed time on the web UI. + (Rohith Sharmaks via jianhe) + OPTIMIZATIONS YARN-3339. TestDockerContainerExecutor should pull a single image and not http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationAttemptReport.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationAttemptReport.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationAttemptReport.java index b7f9c1b..5797058 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationAttemptReport.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ApplicationAttemptReport.java @@ -47,7 +47,8 @@ public abstract class ApplicationAttemptReport { public static ApplicationAttemptReport newInstance( ApplicationAttemptId applicationAttemptId, String host, int rpcPort, String url, String oUrl, String diagnostics, - YarnApplicationAttemptState state, ContainerId amContainerId) { + YarnApplicationAttemptState state, ContainerId amContainerId, + long startTime, long finishTime) { ApplicationAttemptReport report = Records.newRecord(ApplicationAttemptReport.class); report.setApplicationAttemptId(applicationAttemptId); @@ -58,9 +59,19 @@ public abstract class ApplicationAttemptReport { report.setDiagnostics(diagnostics); report.setYarnApplicationAttemptState(state); report.setAMContainerId(amContainerId); + report.setStartTime(startTime); + report.setFinishTime(finishTime); return report; } + public static ApplicationAttemptReport newInstance( + ApplicationAttemptId applicationAttemptId, String host, int rpcPort, + String url, String oUrl, String diagnostics, + YarnApplicationAttemptState state, ContainerId amContainerId) { + return newInstance(applicationAttemptId, host, rpcPort, url, oUrl, + diagnostics, state, amContainerId, 0L, 0L); + } + /** * Get the <em>YarnApplicationAttemptState</em> of the application attempt. * @@ -171,4 +182,25 @@ public abstract class ApplicationAttemptReport { @Private @Unstable public abstract void setAMContainerId(ContainerId amContainerId); + + @Public + @Unstable + public abstract long getStartTime(); + + @Private + @Unstable + public abstract void setStartTime(long startTime); + + /** + * Get the <em>finish time</em> of the application. + * + * @return <em>finish time</em> of the application + */ + @Public + @Unstable + public abstract long getFinishTime(); + + @Private + @Unstable + public abstract void setFinishTime(long finishTime); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto index a0491fe..ddd3764 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/proto/yarn_protos.proto @@ -215,6 +215,8 @@ message ApplicationAttemptReportProto { optional YarnApplicationAttemptStateProto yarn_application_attempt_state = 6; optional ContainerIdProto am_container_id = 7; optional string original_tracking_url = 8; + optional int64 startTime = 9; + optional int64 finishTime = 10; } enum NodeStateProto { http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java index 509b470..903dd94 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/ProtocolHATestBase.java @@ -700,7 +700,8 @@ public abstract class ProtocolHATestBase extends ClientBaseWithFixes { public ApplicationAttemptReport createFakeApplicationAttemptReport() { return ApplicationAttemptReport.newInstance( createFakeApplicationAttemptId(), "localhost", 0, "", "", "", - YarnApplicationAttemptState.RUNNING, createFakeContainerId()); + YarnApplicationAttemptState.RUNNING, createFakeContainerId(), 1000l, + 1200l); } public List<ApplicationAttemptReport> http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java index de669f2..10b9bbb 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/api/impl/TestYarnClient.java @@ -593,7 +593,8 @@ public class TestYarnClient { "diagnostics", YarnApplicationAttemptState.FINISHED, ContainerId.newContainerId( - newApplicationReport.getCurrentApplicationAttemptId(), 1)); + newApplicationReport.getCurrentApplicationAttemptId(), 1), 0, + 0); appAttempts.add(attempt); ApplicationAttemptReport attempt1 = ApplicationAttemptReport.newInstance( ApplicationAttemptId.newInstance(applicationId, 2), http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java index 003f086..1013958 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java @@ -145,10 +145,10 @@ public class TestYarnCLI { ApplicationId applicationId = ApplicationId.newInstance(1234, 5); ApplicationAttemptId attemptId = ApplicationAttemptId.newInstance( applicationId, 1); - ApplicationAttemptReport attemptReport = ApplicationAttemptReport - .newInstance(attemptId, "host", 124, "url", "oUrl", "diagnostics", - YarnApplicationAttemptState.FINISHED, ContainerId.newContainerId( - attemptId, 1)); + ApplicationAttemptReport attemptReport = + ApplicationAttemptReport.newInstance(attemptId, "host", 124, "url", + "oUrl", "diagnostics", YarnApplicationAttemptState.FINISHED, + ContainerId.newContainerId(attemptId, 1), 1000l, 2000l); when( client .getApplicationAttemptReport(any(ApplicationAttemptId.class))) http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationAttemptReportPBImpl.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationAttemptReportPBImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationAttemptReportPBImpl.java index c3c0221..8a97318 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationAttemptReportPBImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ApplicationAttemptReportPBImpl.java @@ -286,4 +286,28 @@ public class ApplicationAttemptReportPBImpl extends ApplicationAttemptReport { builder.clearAmContainerId(); this.amContainerId = amContainerId; } + + @Override + public void setStartTime(long startTime) { + maybeInitBuilder(); + builder.setStartTime(startTime); + } + + @Override + public void setFinishTime(long finishTime) { + maybeInitBuilder(); + builder.setFinishTime(finishTime); + } + + @Override + public long getStartTime() { + ApplicationAttemptReportProtoOrBuilder p = viaProto ? proto : builder; + return p.getStartTime(); + } + + @Override + public long getFinishTime() { + ApplicationAttemptReportProtoOrBuilder p = viaProto ? proto : builder; + return p.getFinishTime(); + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/dao/AppAttemptInfo.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/dao/AppAttemptInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/dao/AppAttemptInfo.java index 1ff7028..92ebeb0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/dao/AppAttemptInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/dao/AppAttemptInfo.java @@ -37,6 +37,8 @@ public class AppAttemptInfo { protected String diagnosticsInfo; protected YarnApplicationAttemptState appAttemptState; protected String amContainerId; + protected long startedTime; + protected long finishedTime; public AppAttemptInfo() { // JAXB needs this @@ -53,6 +55,8 @@ public class AppAttemptInfo { if (appAttempt.getAMContainerId() != null) { amContainerId = appAttempt.getAMContainerId().toString(); } + startedTime = appAttempt.getStartTime(); + finishedTime = appAttempt.getFinishTime(); } public String getAppAttemptId() { @@ -87,4 +91,12 @@ public class AppAttemptInfo { return amContainerId; } + public long getStartedTime() { + return startedTime; + } + + public long getFinishedTime() { + return finishedTime; + } + } http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/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 ---------------------------------------------------------------------- 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 1071831..6d3a1cf 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 @@ -1906,7 +1906,8 @@ public class RMAppAttemptImpl implements RMAppAttempt, Recoverable { attemptReport = ApplicationAttemptReport.newInstance(this .getAppAttemptId(), this.getHost(), this.getRpcPort(), this .getTrackingUrl(), this.getOriginalTrackingUrl(), this.getDiagnostics(), - YarnApplicationAttemptState .valueOf(this.getState().toString()), amId); + YarnApplicationAttemptState.valueOf(this.getState().toString()), + amId, this.startTime, this.finishTime); } finally { this.readLock.unlock(); } http://git-wip-us.apache.org/repos/asf/hadoop/blob/d9c8159e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppAttemptBlock.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppAttemptBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppAttemptBlock.java index 506e31f..6543e92 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppAttemptBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppAttemptBlock.java @@ -41,6 +41,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerApplicat import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppInfo; import org.apache.hadoop.yarn.server.webapp.AppAttemptBlock; import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo; +import org.apache.hadoop.yarn.util.Times; import org.apache.hadoop.yarn.util.resource.Resources; import org.apache.hadoop.yarn.webapp.hamlet.Hamlet; import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.DIV; @@ -205,6 +206,10 @@ public class RMAppAttemptBlock extends AppAttemptBlock{ "Application Attempt State:", appAttempt.getAppAttemptState() == null ? UNAVAILABLE : appAttempt .getAppAttemptState()) + ._("Started:", Times.format(appAttempt.getStartedTime())) + ._("Elapsed:", + org.apache.hadoop.util.StringUtils.formatTime(Times.elapsed( + appAttempt.getStartedTime(), appAttempt.getFinishedTime()))) ._( "AM Container:", appAttempt.getAmContainerId() == null || containers == null
