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)
This commit is contained in:
parent
100b41add6
commit
c9ee316045
|
@ -276,6 +276,9 @@ Release 2.7.1 - UNRELEASED
|
||||||
YARN-3485. FairScheduler headroom calculation doesn't consider
|
YARN-3485. FairScheduler headroom calculation doesn't consider
|
||||||
maxResources for Fifo and FairShare policies. (kasha)
|
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
|
Release 2.7.0 - 2015-04-20
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -25,28 +25,24 @@ import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.security.UserGroupInformation;
|
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.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.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.ResourceManager;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMApp;
|
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.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.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.AppBlock;
|
||||||
import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo;
|
import org.apache.hadoop.yarn.util.Times;
|
||||||
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.util.resource.Resources;
|
||||||
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
|
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.DIV;
|
||||||
|
import org.apache.hadoop.yarn.webapp.util.WebAppUtils;
|
||||||
import org.apache.hadoop.yarn.webapp.view.InfoBlock;
|
import org.apache.hadoop.yarn.webapp.view.InfoBlock;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
import java.security.PrivilegedExceptionAction;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -54,11 +50,13 @@ public class RMAppBlock extends AppBlock{
|
||||||
|
|
||||||
private static final Log LOG = LogFactory.getLog(RMAppBlock.class);
|
private static final Log LOG = LogFactory.getLog(RMAppBlock.class);
|
||||||
private final ResourceManager rm;
|
private final ResourceManager rm;
|
||||||
|
private final Configuration conf;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
RMAppBlock(ViewContext ctx, Configuration conf, ResourceManager rm) {
|
RMAppBlock(ViewContext ctx, Configuration conf, ResourceManager rm) {
|
||||||
super(rm.getClientRMService(), ctx, conf);
|
super(rm.getClientRMService(), ctx, conf);
|
||||||
|
this.conf = conf;
|
||||||
this.rm = rm;
|
this.rm = rm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,65 +118,38 @@ public class RMAppBlock extends AppBlock{
|
||||||
.th(".started", "Started").th(".node", "Node").th(".logs", "Logs")
|
.th(".started", "Started").th(".node", "Node").th(".logs", "Logs")
|
||||||
.th(".blacklistednodes", "Blacklisted Nodes")._()._().tbody();
|
.th(".blacklistednodes", "Blacklisted Nodes")._()._().tbody();
|
||||||
|
|
||||||
StringBuilder attemptsTableData = new StringBuilder("[\n");
|
RMApp rmApp = this.rm.getRMContext().getRMApps().get(this.appID);
|
||||||
for (final ApplicationAttemptReport appAttemptReport : attempts) {
|
if (rmApp == null) {
|
||||||
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;
|
return;
|
||||||
}
|
}
|
||||||
long startTime = 0L;
|
StringBuilder attemptsTableData = new StringBuilder("[\n");
|
||||||
String logsLink = null;
|
for (final ApplicationAttemptReport appAttemptReport : attempts) {
|
||||||
String nodeLink = null;
|
RMAppAttempt rmAppAttempt =
|
||||||
if (containerReport != null) {
|
rmApp.getRMAppAttempt(appAttemptReport.getApplicationAttemptId());
|
||||||
ContainerInfo container = new ContainerInfo(containerReport);
|
if (rmAppAttempt == null) {
|
||||||
startTime = container.getStartedTime();
|
continue;
|
||||||
logsLink = containerReport.getLogUrl();
|
|
||||||
nodeLink = containerReport.getNodeHttpAddress();
|
|
||||||
}
|
}
|
||||||
|
AppAttemptInfo attemptInfo =
|
||||||
|
new AppAttemptInfo(this.rm, rmAppAttempt, rmApp.getUser());
|
||||||
String blacklistedNodesCount = "N/A";
|
String blacklistedNodesCount = "N/A";
|
||||||
Set<String> nodes = RMAppAttemptBlock.getBlacklistedNodes(rm,
|
Set<String> nodes =
|
||||||
ConverterUtils.toApplicationAttemptId(appAttempt.getAppAttemptId()));
|
RMAppAttemptBlock.getBlacklistedNodes(rm,
|
||||||
|
rmAppAttempt.getAppAttemptId());
|
||||||
if(nodes != null) {
|
if(nodes != null) {
|
||||||
blacklistedNodesCount = String.valueOf(nodes.size());
|
blacklistedNodesCount = String.valueOf(nodes.size());
|
||||||
}
|
}
|
||||||
|
String nodeLink = attemptInfo.getNodeHttpAddress();
|
||||||
|
if (nodeLink != null) {
|
||||||
|
nodeLink = WebAppUtils.getHttpSchemePrefix(conf) + nodeLink;
|
||||||
|
}
|
||||||
|
String logsLink = attemptInfo.getLogsLink();
|
||||||
attemptsTableData
|
attemptsTableData
|
||||||
.append("[\"<a href='")
|
.append("[\"<a href='")
|
||||||
.append(url("appattempt", appAttempt.getAppAttemptId()))
|
.append(url("appattempt", rmAppAttempt.getAppAttemptId().toString()))
|
||||||
.append("'>")
|
.append("'>")
|
||||||
.append(appAttempt.getAppAttemptId())
|
.append(String.valueOf(rmAppAttempt.getAppAttemptId()))
|
||||||
.append("</a>\",\"")
|
.append("</a>\",\"")
|
||||||
.append(startTime)
|
.append(attemptInfo.getStartTime())
|
||||||
.append("\",\"<a ")
|
.append("\",\"<a ")
|
||||||
.append(nodeLink == null ? "#" : "href='" + nodeLink)
|
.append(nodeLink == null ? "#" : "href='" + nodeLink)
|
||||||
.append("'>")
|
.append("'>")
|
||||||
|
|
Loading…
Reference in New Issue