YARN-3544. Got back AM logs link on the RM web UI for a completed app. Contributed by Xuan Gong.
(cherry picked from commit 21bf2cdcb77f69abc906e6cd401a8fb221f250e9) (cherry picked from commit c9ee316045b83b18cb068aa4de739a1f4b50f02a) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/d57c3f0a Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/d57c3f0a Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/d57c3f0a Branch: refs/heads/branch-2.6 Commit: d57c3f0a2628f6f540a128e163ffdad4cccb1301 Parents: 7af5d6b Author: Zhijie Shen <zjs...@apache.org> Authored: Wed Apr 29 17:12:52 2015 -0700 Committer: Vinod Kumar Vavilapalli <vino...@apache.org> Committed: Tue Sep 15 17:30:15 2015 -0700 ---------------------------------------------------------------------- hadoop-yarn-project/CHANGES.txt | 3 + .../resourcemanager/webapp/RMAppBlock.java | 82 +++++++------------- 2 files changed, 30 insertions(+), 55 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/d57c3f0a/hadoop-yarn-project/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index c2c2bfa..17d888d 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -220,6 +220,9 @@ Release 2.6.1 - 2015-09-09 YARN-3248. Display count of nodes blacklisted by apps in the web UI. (Varun Vasudev via xgong) + YARN-3544. Got back AM logs link on the RM web UI for a completed app. + (Xuan Gong via zjshen) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/d57c3f0a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppBlock.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/RMAppBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppBlock.java index 171c6c9..e7f2d1a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMAppBlock.java @@ -20,7 +20,6 @@ package org.apache.hadoop.yarn.server.resourcemanager.webapp; import static org.apache.hadoop.yarn.webapp.view.JQueryUI._INFO_WRAP; -import java.security.PrivilegedExceptionAction; import java.util.Collection; import java.util.Set; @@ -29,36 +28,35 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; -import org.apache.hadoop.yarn.api.protocolrecords.GetContainerReportRequest; import org.apache.hadoop.yarn.api.records.ApplicationAttemptReport; -import org.apache.hadoop.yarn.api.records.ContainerId; -import org.apache.hadoop.yarn.api.records.ContainerReport; import org.apache.hadoop.yarn.api.records.Resource; -import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppMetrics; +import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt; import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptMetrics; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.AppAttemptInfo; import org.apache.hadoop.yarn.server.webapp.AppBlock; -import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo; -import org.apache.hadoop.yarn.server.webapp.dao.ContainerInfo; -import org.apache.hadoop.yarn.util.ConverterUtils; 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; +import org.apache.hadoop.yarn.webapp.util.WebAppUtils; import org.apache.hadoop.yarn.webapp.view.InfoBlock; import com.google.inject.Inject; +//import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo; public class RMAppBlock extends AppBlock{ private static final Log LOG = LogFactory.getLog(RMAppBlock.class); private final ResourceManager rm; + private final Configuration conf; @Inject RMAppBlock(ViewContext ctx, Configuration conf, ResourceManager rm) { super(rm.getClientRMService(), ctx, conf); + this.conf = conf; this.rm = rm; } @@ -120,67 +118,41 @@ public class RMAppBlock extends AppBlock{ .th(".started", "Started").th(".node", "Node").th(".logs", "Logs") .th(".blacklistednodes", "Blacklisted Nodes")._()._().tbody(); + RMApp rmApp = this.rm.getRMContext().getRMApps().get(this.appID); + if (rmApp == null) { + return; + } StringBuilder attemptsTableData = new StringBuilder("[\n"); for (final ApplicationAttemptReport appAttemptReport : attempts) { - AppAttemptInfo appAttempt = new AppAttemptInfo(appAttemptReport); - ContainerReport containerReport = null; - try { - // AM container is always the first container of the attempt - final GetContainerReportRequest request = - GetContainerReportRequest.newInstance(ContainerId.newContainerId( - appAttemptReport.getApplicationAttemptId(), 1)); - if (callerUGI == null) { - containerReport = - appBaseProt.getContainerReport(request).getContainerReport(); - } else { - containerReport = callerUGI.doAs( - new PrivilegedExceptionAction<ContainerReport>() { - @Override - public ContainerReport run() throws Exception { - ContainerReport report = null; - try { - report = appBaseProt.getContainerReport(request) - .getContainerReport(); - } catch (ContainerNotFoundException ex) { - LOG.warn(ex.getMessage()); - } - return report; - } - }); - } - } catch (Exception e) { - String message = - "Failed to read the AM container of the application attempt " - + appAttemptReport.getApplicationAttemptId() + "."; - LOG.error(message, e); - html.p()._(message)._(); - return; - } - long startTime = 0L; - String logsLink = null; - String nodeLink = null; - if (containerReport != null) { - ContainerInfo container = new ContainerInfo(containerReport); - startTime = container.getStartedTime(); - logsLink = containerReport.getLogUrl(); - nodeLink = containerReport.getNodeHttpAddress(); + RMAppAttempt rmAppAttempt = + rmApp.getRMAppAttempt(appAttemptReport.getApplicationAttemptId()); + if (rmAppAttempt == null) { + continue; } + AppAttemptInfo attemptInfo = + new AppAttemptInfo(this.rm, rmAppAttempt, rmApp.getUser()); String blacklistedNodesCount = "N/A"; - Set<String> nodes = RMAppAttemptBlock.getBlacklistedNodes(rm, - ConverterUtils.toApplicationAttemptId(appAttempt.getAppAttemptId())); + Set<String> nodes = + RMAppAttemptBlock.getBlacklistedNodes(rm, + rmAppAttempt.getAppAttemptId()); if(nodes != null) { blacklistedNodesCount = String.valueOf(nodes.size()); } // AppAttemptID numerical value parsed by parseHadoopID in // yarn.dt.plugins.js + String nodeLink = attemptInfo.getNodeHttpAddress(); + if (nodeLink != null) { + nodeLink = WebAppUtils.getHttpSchemePrefix(conf) + nodeLink; + } + String logsLink = attemptInfo.getLogsLink(); attemptsTableData .append("[\"<a href='") - .append(url("appattempt", appAttempt.getAppAttemptId())) + .append(url("appattempt", rmAppAttempt.getAppAttemptId().toString())) .append("'>") - .append(appAttempt.getAppAttemptId()) + .append(String.valueOf(rmAppAttempt.getAppAttemptId())) .append("</a>\",\"") - .append(startTime) + .append(attemptInfo.getStartTime()) .append("\",\"<a ") .append(nodeLink == null ? "#" : "href='" + nodeLink) .append("'>")