Repository: hadoop Updated Branches: refs/heads/branch-2.7 3f3829e3a -> 29838ff5b
YARN-4281. 2.7 RM app page is broken. Contributed by Chang Li Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/29838ff5 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/29838ff5 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/29838ff5 Branch: refs/heads/branch-2.7 Commit: 29838ff5b1674ce4def82ec67cdf897af5bf50b1 Parents: 3f3829e Author: Jason Lowe <[email protected]> Authored: Wed Oct 21 13:43:25 2015 +0000 Committer: Jason Lowe <[email protected]> Committed: Wed Oct 21 13:43:25 2015 +0000 ---------------------------------------------------------------------- hadoop-yarn-project/CHANGES.txt | 2 + .../hadoop/yarn/server/webapp/AppBlock.java | 8 +- .../resourcemanager/webapp/RMAppBlock.java | 138 ++++--------------- 3 files changed, 26 insertions(+), 122 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/29838ff5/hadoop-yarn-project/CHANGES.txt ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 8bbc736..81136d7 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -112,6 +112,8 @@ Release 2.7.2 - UNRELEASED YARN-3798. ZKRMStateStore shouldn't create new session without occurrance of SESSIONEXPIED. (ozawa and Varun Saxena) + YARN-4281. 2.7 RM app page is broken (Chang Li via jlowe) + Release 2.7.1 - 2015-07-06 INCOMPATIBLE CHANGES http://git-wip-us.apache.org/repos/asf/hadoop/blob/29838ff5/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.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/AppBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java index 2497ff3..93697d0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java @@ -61,7 +61,6 @@ public class AppBlock extends HtmlBlock { protected ApplicationBaseProtocol appBaseProt; protected Configuration conf; protected ApplicationId appID = null; - protected UserGroupInformation callerUGI; @Inject protected AppBlock(ApplicationBaseProtocol appBaseProt, ViewContext ctx, @@ -87,7 +86,7 @@ public class AppBlock extends HtmlBlock { return; } - callerUGI = getCallerUGI(); + UserGroupInformation callerUGI = getCallerUGI(); ApplicationReport appReport; try { final GetApplicationReportRequest request = @@ -222,11 +221,6 @@ public class AppBlock extends HtmlBlock { UserGroupInformation callerUGI, Collection<ApplicationAttemptReport> attempts) { // Application Attempt Table - createApplicationAttemptTable(html, attempts); - } - - protected void createApplicationAttemptTable(Block html, - Collection<ApplicationAttemptReport> attempts) { TBODY<TABLE<Hamlet>> tbody = html.table("#attempts").thead().tr().th(".id", "Attempt ID") .th(".started", "Started").th(".node", "Node").th(".logs", "Logs") http://git-wip-us.apache.org/repos/asf/hadoop/blob/29838ff5/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 817195c..110bc9b 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,21 +20,13 @@ 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; - import org.apache.commons.lang.StringEscapeUtils; 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; @@ -42,19 +34,18 @@ 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.hamlet.Hamlet.TABLE; -import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TBODY; import org.apache.hadoop.yarn.webapp.util.WebAppUtils; import org.apache.hadoop.yarn.webapp.view.InfoBlock; import com.google.inject.Inject; +import java.util.Collection; +import java.util.Set; + public class RMAppBlock extends AppBlock{ private static final Log LOG = LogFactory.getLog(RMAppBlock.class); @@ -65,8 +56,8 @@ public class RMAppBlock extends AppBlock{ @Inject RMAppBlock(ViewContext ctx, Configuration conf, ResourceManager rm) { super(rm.getClientRMService(), ctx, conf); - this.rm = rm; this.conf = conf; + this.rm = rm; } @Override @@ -118,12 +109,15 @@ public class RMAppBlock extends AppBlock{ } @Override - protected void createApplicationAttemptTable(Block html, + protected void generateApplicationTable(Block html, + UserGroupInformation callerUGI, Collection<ApplicationAttemptReport> attempts) { - TBODY<TABLE<Hamlet>> tbody = + // Application Attempt Table + Hamlet.TBODY<Hamlet.TABLE<Hamlet>> tbody = html.table("#attempts").thead().tr().th(".id", "Attempt ID") - .th(".started", "Started").th(".node", "Node").th(".logs", "Logs") - ._()._().tbody(); + .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; @@ -136,113 +130,27 @@ public class RMAppBlock extends AppBlock{ continue; } AppAttemptInfo attemptInfo = - new AppAttemptInfo(rm, rmAppAttempt, rmApp.getUser(), + new AppAttemptInfo(this.rm, rmAppAttempt, rmApp.getUser(), WebAppUtils.getHttpSchemePrefix(conf)); + String blacklistedNodesCount = "N/A"; + Set<String> 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("[\"<a href='") - .append(url("appattempt", rmAppAttempt.getAppAttemptId().toString())) - .append("'>") - .append(String.valueOf(rmAppAttempt.getAppAttemptId())) - .append("</a>\",\"") - .append(attemptInfo.getStartTime()) - .append("\",\"<a ") - .append(nodeLink == null ? "#" : "href='" + nodeLink) - .append("'>") - .append( - nodeLink == null ? "N/A" : StringEscapeUtils - .escapeJavaScript(StringEscapeUtils.escapeHtml(nodeLink))) - .append("</a>\",\"<a ") - .append(logsLink == null ? "#" : "href='" + logsLink).append("'>") - .append(logsLink == null ? "N/A" : "Logs").append("</a>\"],\n"); - } - if (attemptsTableData.charAt(attemptsTableData.length() - 2) == ',') { - attemptsTableData.delete(attemptsTableData.length() - 2, - attemptsTableData.length() - 1); - } - attemptsTableData.append("]"); - html.script().$type("text/javascript") - ._("var attemptsTableData=" + attemptsTableData)._(); - tbody._()._(); - - } - - protected void generateApplicationTable(Block html, - UserGroupInformation callerUGI, - Collection<ApplicationAttemptReport> attempts) { - // Application Attempt Table - Hamlet.TBODY<Hamlet.TABLE<Hamlet>> tbody = - html.table("#attempts").thead().tr().th(".id", "Attempt ID") - .th(".started", "Started").th(".node", "Node").th(".logs", "Logs") - .th(".blacklistednodes", "Blacklisted Nodes")._()._().tbody(); - - StringBuilder attemptsTableData = new StringBuilder("[\n"); - for (final ApplicationAttemptReport appAttemptReport : attempts) { - org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo appAttempt = - new org.apache.hadoop.yarn.server.webapp.dao.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(); - } - String blacklistedNodesCount = "N/A"; - Set<String> nodes = RMAppAttemptBlock.getBlacklistedNodes(rm, - ConverterUtils.toApplicationAttemptId(appAttempt.getAppAttemptId())); - if(nodes != null) { - blacklistedNodesCount = String.valueOf(nodes.size()); - } - - // AppAttemptID numerical value parsed by parseHadoopID in - // yarn.dt.plugins.js - 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("'>")
