diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSController.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSController.java index b7badfe..7bbb391 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSController.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSController.java @@ -47,4 +47,10 @@ public void container() { render(ContainerPage.class); } + /** + * Render the logs page. + */ + public void logs() { + render(AHSLogsPage.class); + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSLogsPage.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSLogsPage.java new file mode 100644 index 0000000..efc5715 --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSLogsPage.java @@ -0,0 +1,55 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.yarn.server.applicationhistoryservice.webapp; + +import static org.apache.hadoop.yarn.webapp.YarnWebParams.CONTAINER_ID; +import static org.apache.hadoop.yarn.webapp.YarnWebParams.ENTITY_STRING; + +import org.apache.hadoop.yarn.webapp.SubView; +import org.apache.hadoop.yarn.webapp.log.AggregatedLogsBlock; + +public class AHSLogsPage extends AHSView { + /* + * (non-Javadoc) + * + * @see + * org.apache.hadoop.mapreduce.v2.hs.webapp.AHSView#preHead(org.apache.hadoop + * .yarn.webapp.hamlet.Hamlet.HTML) + */ + @Override + protected void preHead(Page.HTML<_> html) { + String logEntity = $(ENTITY_STRING); + if (logEntity == null || logEntity.isEmpty()) { + logEntity = $(CONTAINER_ID); + } + if (logEntity == null || logEntity.isEmpty()) { + logEntity = "UNKNOWN"; + } + commonPreHead(html); + } + + /** + * The content of this page is the JobBlock + * + * @return HsJobBlock.class + */ + @Override + protected Class content() { + return AggregatedLogsBlock.class; + } +} diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSWebApp.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSWebApp.java index 61b7287..1ebbc5e 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSWebApp.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/main/java/org/apache/hadoop/yarn/server/applicationhistoryservice/webapp/AHSWebApp.java @@ -45,5 +45,7 @@ public void setup() { route(pajoin("/appattempt", APPLICATION_ATTEMPT_ID), AHSController.class, "appattempt"); route(pajoin("/container", CONTAINER_ID), AHSController.class, "container"); + route(pajoin("/logs", NM_NODENAME, CONTAINER_ID, ENTITY_STRING, APP_OWNER, + CONTAINER_LOG_TYPE), AHSController.class, "logs"); } } \ No newline at end of file diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppAttemptBlock.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppAttemptBlock.java index 1eac7b9..fd627a4 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppAttemptBlock.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppAttemptBlock.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.webapp; import static org.apache.hadoop.yarn.util.StringHelper.join; +import static org.apache.hadoop.yarn.util.StringHelper.ujoin; import static org.apache.hadoop.yarn.webapp.YarnWebParams.APPLICATION_ATTEMPT_ID; import java.io.IOException; @@ -105,8 +106,11 @@ protected void render(Block html) { html._(InfoBlock.class); Collection containers; + String user; try { containers = appContext.getContainers(appAttemptId).values(); + user = appContext + .getApplication(appAttemptId.getApplicationId()).getUser(); } catch (IOException e) { html.p()._("Sorry, Failed to get containers for application attempt" + attemptid + ".")._(); @@ -126,6 +130,9 @@ protected void render(Block html) { StringBuilder containersTableData = new StringBuilder("[\n"); for (ContainerReport containerReport : containers) { + String logURL = ujoin("logs", containerReport.getAssignedNode().toString(), + containerReport.getContainerId().toString(), containerReport + .getContainerId().toString(), user); ContainerInfo container = new ContainerInfo(containerReport); // ConatinerID numerical value parsed by parseHadoopID in yarn.dt.plugins.js containersTableData @@ -141,9 +148,9 @@ protected void render(Block html) { .append("\",\"") .append(container.getContainerExitStatus()) .append("\",\"") - .append(container.getLogUrl() == null ? "N/A" : "Logs") + .append(logURL == null ? "N/A" : "Logs") .append("\"],\n"); } if (containersTableData.charAt(containersTableData.length() - 2) == ',') { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java index d2509d6..0f44495 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/AppBlock.java @@ -19,6 +19,8 @@ package org.apache.hadoop.yarn.server.webapp; import static org.apache.hadoop.yarn.util.StringHelper.join; +import static org.apache.hadoop.yarn.util.StringHelper.ujoin; + import static org.apache.hadoop.yarn.webapp.YarnWebParams.APPLICATION_ID; import java.io.IOException; @@ -43,6 +45,7 @@ import org.apache.hadoop.yarn.webapp.view.HtmlBlock; import org.apache.hadoop.yarn.webapp.view.InfoBlock; + import com.google.inject.Inject; public class AppBlock extends HtmlBlock { @@ -147,7 +150,9 @@ protected void render(Block html) { if (containerReport != null) { ContainerInfo container = new ContainerInfo(containerReport); startTime = container.getStartedTime(); - logsLink = container.getLogUrl(); + logsLink = ujoin("logs", containerReport.getAssignedNode().toString(), + containerReport.getContainerId().toString(), containerReport + .getContainerId().toString(), app.getUser()); } String nodeLink = null; if (appAttempt.getHost() != null && appAttempt.getRpcPort() >= 0 diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ContainerBlock.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ContainerBlock.java index c0c65c6..f8e55ca 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ContainerBlock.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ContainerBlock.java @@ -64,8 +64,12 @@ protected void render(Block html) { } ContainerReport containerReport; + String user; try { containerReport = appContext.getContainer(containerId); + user = appContext + .getApplication(containerReport.getContainerId() + .getApplicationAttemptId().getApplicationId()).getUser(); } catch (IOException e) { String message = "Failed to read the container " + containerid + "."; LOG.error(message, e); @@ -76,6 +80,7 @@ protected void render(Block html) { puts("Container not found: " + containerid); return; } + ContainerInfo container = new ContainerInfo(containerReport); setTitle(join("Container ", containerid)); @@ -91,8 +96,12 @@ protected void render(Block html) { container.getFinishedTime()))). _("Resource:", container.getAllocatedMB() + " Memory, " + container.getAllocatedVCores() + " VCores"). - _("Logs:", container.getLogUrl() == null ? - "#" : root_url(container.getLogUrl()), container.getLogUrl()). + _( + "Logs:", + url(join("/logs", "/", + containerReport.getAssignedNode().toString(), "/", + containerReport.getContainerId().toString(), "/", + containerReport.getContainerId().toString(), "/", user)), "Log"). _("Diagnostics:", container.getDiagnosticsInfo()); html._(InfoBlock.class); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/RMContainerImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/RMContainerImpl.java index adffb99..02e615a 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/RMContainerImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmcontainer/RMContainerImpl.java @@ -366,10 +366,10 @@ public void transition(RMContainerImpl container, RMContainerEvent event) { public void transition(RMContainerImpl container, RMContainerEvent event) { // The logs of running containers should be found on NM webUI // The logs should be accessible after the container is launched - container.logURL = join(HttpConfig.getSchemePrefix(), - container.container.getNodeHttpAddress(), "/node", "/containerlogs/", - ConverterUtils.toString(container.containerId), "/", - container.user); + container.logURL = join(HttpConfig.getSchemePrefix(), "/host:port", + "/logs", "/", container.getAllocatedNode().toString(), "/", + ConverterUtils.toString(container.containerId), "/", ConverterUtils + .toString(container.containerId), "/", container.user); // Unregister from containerAllocationExpirer. container.containerAllocationExpirer.unregister(container .getContainerId());