| <% |
| /* |
| * 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. |
| */ |
| %> |
| <%@ page |
| contentType="text/html; charset=UTF-8" |
| import="javax.servlet.*" |
| import="javax.servlet.http.*" |
| import="java.io.*" |
| import="java.lang.management.MemoryUsage" |
| import="java.lang.management.MemoryMXBean" |
| import="java.lang.management.ManagementFactory" |
| 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(); |
| MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); |
| ClusterMetrics metrics = tracker.getClusterMetrics(); |
| String trackerName = |
| StringUtils.simpleHostname(tracker.getJobTrackerMachine()); |
| JobQueueInfo[] queues = tracker.getJobQueues(); |
| List<JobInProgress> runningJobs = tracker.getRunningJobs(); |
| List<JobInProgress> completedJobs = tracker.getCompletedJobs(); |
| List<JobInProgress> failedJobs = tracker.getFailedJobs(); |
| %> |
| <%! |
| 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>Queues</th>" + |
| "<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 Slot Capacity</th>" + |
| "<th>Reduce Slot Capacity</th><th>Avg. Slots/Node</th>" + |
| "<th>Blacklisted Nodes</th>" + |
| "<th>Excluded Nodes</th></tr>\n"); |
| out.print("<tr><td><a href=\"queueinfo.jsp\">" + |
| tracker.getRootQueues().length + "</a></td><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=excluded\">" + |
| metrics.getDecommissionedTaskTrackerCount() + "</a>" + |
| "</td></tr></table>\n"); |
| |
| out.print("<br>"); |
| if (tracker.recoveryManager.shouldRecover()) { |
| 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>"); |
| } |
| }%> |
| |
| |
| <!DOCTYPE html> |
| <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> |
| </head> |
| <body> |
| |
| <% if (!JSPUtil.processButtons(request, response, tracker)) { |
| return;// user is not authorized |
| } |
| %> |
| |
| <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="#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.getJobTrackerStatus() %><br> |
| <b>Started:</b> <%= new Date(tracker.getStartTime())%><br> |
| <b>Version:</b> <%= VersionInfo.getVersion()%>, |
| <%= VersionInfo.getRevision()%><br> |
| <b>Compiled:</b> <%= VersionInfo.getDate()%> by |
| <%= VersionInfo.getUser()%> from |
| <%= VersionInfo.getBranch()%><br> |
| <b>Identifier:</b> <%= tracker.getTrackerIdentifier()%><br> |
| |
| <hr> |
| <h2>Cluster Summary (Heap Size is |
| <% MemoryUsage heap = mem.getHeapMemoryUsage(); |
| out.print(StringUtils.byteDesc(heap.getUsed()) + "/"); |
| out.print(StringUtils.byteDesc(heap.getCommitted()) + "/"); |
| out.print(StringUtils.byteDesc(heap.getMax()) + ")"); |
| %> |
| <% |
| generateSummaryTable(out, metrics, tracker); |
| %> |
| <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="jobhistory.jsp"> |
| Job Tracker History</a> |
| |
| <% |
| out.println(ServletUtil.htmlFooter()); |
| %> |