blob: 3d51662f2dd8a0e62a8cf191ecf5fb6cf9304bd1 [file] [log] [blame]
<%@ page
contentType="text/html; charset=UTF-8"
import="javax.servlet.*"
import="javax.servlet.http.*"
import="java.io.*"
import="java.util.*"
import="java.text.DecimalFormat"
import="org.apache.hadoop.http.HtmlQuoting"
import="org.apache.hadoop.mapred.*"
import="org.apache.hadoop.mapreduce.*"
import="org.apache.hadoop.util.*"
%>
<%! private static final long serialVersionUID = 1L;
%>
<%
JobTracker tracker = (JobTracker) application.getAttribute("job.tracker");
ClusterStatus status = tracker.getClusterStatus();
ClusterMetrics metrics = tracker.getClusterMetrics();
String trackerName =
StringUtils.simpleHostname(tracker.getJobTrackerMachine());
JobQueueInfo[] queues = tracker.getQueues();
Vector<JobInProgress> runningJobs = tracker.runningJobs();
Vector<JobInProgress> completedJobs = tracker.completedJobs();
Vector<JobInProgress> failedJobs = tracker.failedJobs();
%>
<%!
private static DecimalFormat percentFormat = new DecimalFormat("##0.00");
public void generateSummaryTable(JspWriter out, ClusterMetrics metrics,
JobTracker tracker) throws IOException {
String tasksPerNode = metrics.getTaskTrackerCount() > 0 ?
percentFormat.format(((double)(metrics.getMapSlotCapacity() +
metrics.getReduceSlotCapacity())) / metrics.getTaskTrackerCount()):
"-";
out.print("<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n"+
"<tr><th>Running Map Tasks</th><th>Running Reduce Tasks</th>" +
"<th>Total Submissions</th>" +
"<th>Nodes</th>" +
"<th>Occupied Map Slots</th><th>Occupied Reduce Slots</th>" +
"<th>Reserved Map Slots</th><th>Reserved Reduce Slots</th>" +
"<th>Map Task Capacity</th>" +
"<th>Reduce Task Capacity</th><th>Avg. Tasks/Node</th>" +
"<th>Blacklisted Nodes</th>" +
"<th>Graylisted Nodes</th>" +
"<th>Excluded Nodes</th></tr>\n");
out.print("<tr><td>" + metrics.getRunningMaps() + "</td><td>" +
metrics.getRunningReduces() + "</td><td>" +
metrics.getTotalJobSubmissions() +
"</td><td><a href=\"machines.jsp?type=active\">" +
metrics.getTaskTrackerCount() + "</a></td><td>" +
metrics.getOccupiedMapSlots() + "</td><td>" +
metrics.getOccupiedReduceSlots() + "</td><td>" +
metrics.getReservedMapSlots() + "</td><td>" +
metrics.getReservedReduceSlots() + "</td><td>" +
metrics.getMapSlotCapacity() +
"</td><td>" + metrics.getReduceSlotCapacity() +
"</td><td>" + tasksPerNode +
"</td><td><a href=\"machines.jsp?type=blacklisted\">" +
metrics.getBlackListedTaskTrackerCount() + "</a>" +
"</td><td><a href=\"machines.jsp?type=graylisted\">" +
metrics.getGrayListedTaskTrackerCount() + "</a>" +
"</td><td><a href=\"machines.jsp?type=excluded\">" +
metrics.getDecommissionedTaskTrackerCount() + "</a>" +
"</td></tr></table>\n");
out.print("<br>");
if (tracker.hasRestarted()) {
out.print("<span class=\"small\"><i>");
if (tracker.hasRecovered()) {
out.print("The JobTracker got restarted and recovered back in " );
out.print(StringUtils.formatTime(tracker.getRecoveryDuration()));
} else {
out.print("The JobTracker got restarted and is still recovering");
}
out.print("</i></span>");
}
}%>
<html>
<head>
<title><%= trackerName %> Hadoop Map/Reduce Administration</title>
<link rel="stylesheet" type="text/css" href="/static/hadoop.css">
<script type="text/javascript" src="/static/jobtracker.js"></script>
<script type='text/javascript' src='/static/sorttable.js'></script>
</head>
<body>
<% JSPUtil.processButtons(request, response, tracker); %>
<h1><%= trackerName %> Hadoop Map/Reduce Administration</h1>
<div id="quicklinks">
<a href="#quicklinks" onclick="toggle('quicklinks-list'); return false;">Quick Links</a>
<ul id="quicklinks-list">
<li><a href="#scheduling_info">Scheduling Info</a></li>
<li><a href="#running_jobs">Running Jobs</a></li>
<li><a href="#retired_jobs">Retired Jobs</a></li>
<li><a href="#local_logs">Local Logs</a></li>
</ul>
</div>
<b>State:</b> <%= status.getJobTrackerState() %><br>
<b>Started:</b> <%= new Date(tracker.getStartTime())%><br>
<b>Version:</b> <%= VersionInfo.getVersion()%>,
r<%= VersionInfo.getRevision()%><br>
<b>Compiled:</b> <%= VersionInfo.getDate()%> by
<%= VersionInfo.getUser()%><br>
<b>Identifier:</b> <%= tracker.getTrackerIdentifier()%><br>
<hr>
<h2>Cluster Summary (Heap Size is <%= StringUtils.byteDesc(Runtime.getRuntime().totalMemory()) %>/<%= StringUtils.byteDesc(Runtime.getRuntime().maxMemory()) %>)</h2>
<%
generateSummaryTable(out, metrics, tracker);
%>
<hr>
<h2 id="scheduling_info">Scheduling Information</h2>
<table border="2" cellpadding="5" cellspacing="2" class="sortable">
<thead style="font-weight: bold">
<tr>
<td> Queue Name </td>
<td> State </td>
<td> Scheduling Information</td>
</tr>
</thead>
<tbody>
<%
for(JobQueueInfo queue: queues) {
String queueName = queue.getQueueName();
String state = queue.getQueueState();
String schedulingInformation = queue.getSchedulingInfo();
if(schedulingInformation == null || schedulingInformation.trim().equals("")) {
schedulingInformation = "NA";
}
%>
<tr>
<td><a href="jobqueue_details.jsp?queueName=<%=queueName%>"><%=queueName%></a></td>
<td><%=state%></td>
<td><%=HtmlQuoting.quoteHtmlChars(schedulingInformation).replaceAll("\n","<br/>") %>
</td>
</tr>
<%
}
%>
</tbody>
</table>
<hr/>
<b>Filter (Jobid, Priority, User, Name)</b> <input type="text" id="filter" onkeyup="applyfilter()"> <br>
<span class="small">Example: 'user:smith 3200' will filter by 'smith' only in the user field and '3200' in all fields</span>
<hr>
<h2 id="running_jobs">Running Jobs</h2>
<%=JSPUtil.generateJobTable("Running", runningJobs, 30, 0, tracker.conf)%>
<hr>
<%
if (completedJobs.size() > 0) {
out.print("<h2 id=\"completed_jobs\">Completed Jobs</h2>");
out.print(JSPUtil.generateJobTable("Completed", completedJobs, 0,
runningJobs.size(), tracker.conf));
out.print("<hr>");
}
%>
<%
if (failedJobs.size() > 0) {
out.print("<h2 id=\"failed_jobs\">Failed Jobs</h2>");
out.print(JSPUtil.generateJobTable("Failed", failedJobs, 0,
(runningJobs.size()+completedJobs.size()), tracker.conf));
out.print("<hr>");
}
%>
<h2 id="retired_jobs">Retired Jobs</h2>
<%=JSPUtil.generateRetiredJobTable(tracker,
(runningJobs.size()+completedJobs.size()+failedJobs.size()))%>
<hr>
<h2 id="local_logs">Local Logs</h2>
<a href="logs/">Log</a> directory,
<a href="<%=JobHistoryServer.getHistoryUrlPrefix(tracker.conf)%>/jobhistoryhome.jsp">
Job Tracker History</a>
<%
out.println(ServletUtil.htmlFooter());
%>