diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index cf3d910942..28fcae43a9 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -321,6 +321,9 @@ Release 2.7.1 - UNRELEASED YARN-3485. FairScheduler headroom calculation doesn't consider maxResources for Fifo and FairShare policies. (kasha) + YARN-3544. Got back AM logs link on the RM web UI for a completed app. + (Xuan Gong via zjshen) + Release 2.7.0 - 2015-04-20 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 3779b91588..43e26be1fc 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 @@ -25,28 +25,24 @@ 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.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; +import org.apache.hadoop.yarn.webapp.util.WebAppUtils; import org.apache.hadoop.yarn.webapp.view.InfoBlock; import com.google.inject.Inject; -import java.security.PrivilegedExceptionAction; import java.util.Collection; import java.util.Set; @@ -54,11 +50,13 @@ 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,65 +118,38 @@ protected void generateApplicationTable(Block html, .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()); } - + 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("\",\"")