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 c9ee316045
)
This commit is contained in:
parent
7af5d6b4ba
commit
d57c3f0a26
|
@ -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
|
||||
|
|
|
@ -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("'>")
|
||||
|
|
Loading…
Reference in New Issue