From d57c3f0a2628f6f540a128e163ffdad4cccb1301 Mon Sep 17 00:00:00 2001 From: Zhijie Shen Date: Wed, 29 Apr 2015 17:12:52 -0700 Subject: [PATCH] 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) --- hadoop-yarn-project/CHANGES.txt | 3 + .../resourcemanager/webapp/RMAppBlock.java | 82 ++++++------------- 2 files changed, 30 insertions(+), 55 deletions(-) diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index c2c2bfa1c06..17d888de65e 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 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 171c6c9ea22..e7f2d1a98f5 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() { - @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 nodes = RMAppAttemptBlock.getBlacklistedNodes(rm, - ConverterUtils.toApplicationAttemptId(appAttempt.getAppAttemptId())); + Set 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("[\"") - .append(appAttempt.getAppAttemptId()) + .append(String.valueOf(rmAppAttempt.getAppAttemptId())) .append("\",\"") - .append(startTime) + .append(attemptInfo.getStartTime()) .append("\",\"")