| <% | 
 | /* | 
 |  * 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.util.*" | 
 |   import="org.apache.hadoop.http.HtmlQuoting" | 
 |   import="org.apache.hadoop.mapred.*" | 
 |   import="org.apache.hadoop.mapred.JSPUtil.JobWithViewAccessCheck" | 
 |   import="org.apache.hadoop.util.*" | 
 |   import="java.lang.Integer" | 
 |   import="java.text.SimpleDateFormat" | 
 | %> | 
 | <%!	private static final long serialVersionUID = 1L; | 
 | %> | 
 | <%! static SimpleDateFormat dateFormat = new SimpleDateFormat("d-MMM-yyyy HH:mm:ss") ; %> | 
 | <% | 
 |   JobTracker tracker = (JobTracker) application.getAttribute("job.tracker"); | 
 |   String trackerName =  | 
 |            StringUtils.simpleHostname(tracker.getJobTrackerMachine()); | 
 |   String jobid = request.getParameter("jobid"); | 
 |   if (jobid == null) { | 
 |     out.println("<h2>Missing 'jobid'!</h2>"); | 
 |     return; | 
 |   } | 
 |   JobID jobidObj = JobID.forName(jobid); | 
 |  | 
 |   JobWithViewAccessCheck myJob = JSPUtil.checkAccessAndGetJob(tracker, jobidObj, | 
 |       request, response); | 
 |   if (!myJob.isViewJobAllowed()) { | 
 |     return; // user is not authorized to view this job | 
 |   } | 
 |  | 
 |   JobInProgress job = myJob.getJob(); | 
 |  | 
 |   String type = request.getParameter("type"); | 
 |   String pagenum = request.getParameter("pagenum"); | 
 |   String state = request.getParameter("state"); | 
 |   state = (state!=null) ? state : "all"; | 
 |   int pnum = Integer.parseInt(pagenum); | 
 |   int next_page = pnum+1; | 
 |   int numperpage = 2000; | 
 |    | 
 |   TaskReport[] reports = null; | 
 |   int start_index = (pnum - 1) * numperpage; | 
 |   int end_index = start_index + numperpage; | 
 |   int report_len = 0; | 
 |   if ("map".equals(type)) { | 
 |     reports = (job != null) ? tracker.getMapTaskReports(jobidObj) : null; | 
 |   } else if ("reduce".equals(type)) { | 
 |     reports = (job != null) ? tracker.getReduceTaskReports(jobidObj) : null; | 
 |   } else if ("cleanup".equals(type)) { | 
 |     reports = (job != null) ? tracker.getCleanupTaskReports(jobidObj) : null; | 
 |   } else if ("setup".equals(type)) { | 
 |     reports = (job != null) ? tracker.getSetupTaskReports(jobidObj) : null; | 
 |   } | 
 | %> | 
 |  | 
 | <html> | 
 |   <head> | 
 |     <title>Hadoop <%=type%> task list for <%=jobid%> on <%=trackerName%></title> | 
 |     <link rel="stylesheet" type="text/css" href="/static/hadoop.css"> | 
 |   </head> | 
 | <body> | 
 | <h1>Hadoop <%=type%> task list for  | 
 | <a href="jobdetails.jsp?jobid=<%=jobid%>"><%=jobid%></a> on  | 
 | <a href="jobtracker.jsp"><%=trackerName%></a></h1> | 
 | <% | 
 |   // redirect to history page if it cannot be found in memory | 
 |   if (job == null) { | 
 |     JobID jobIdObj = JobID.forName(jobid); | 
 |     String historyFile = tracker.getJobHistory().getHistoryFilePath(jobIdObj); | 
 |     if (historyFile == null) { | 
 |       out.println("<h2>Job " + jobid + " not known!</h2>"); | 
 |       return; | 
 |     } | 
 |     String historyUrl = "/jobtaskshistory.jsp?logFile=" + historyFile + | 
 |                         "&status=" + state + "&taskType=" + type; | 
 |     response.sendRedirect(response.encodeRedirectURL(historyUrl)); | 
 |     return; | 
 |   } | 
 |   // Filtering the reports if some filter is specified | 
 |   if (!"all".equals(state)) { | 
 |     List<TaskReport> filteredReports = new ArrayList<TaskReport>(); | 
 |     for (int i = 0; i < reports.length; ++i) { | 
 |       if (("completed".equals(state) && reports[i].getCurrentStatus() == TIPStatus.COMPLETE)  | 
 |           || ("running".equals(state) && reports[i].getCurrentStatus() == TIPStatus.RUNNING)  | 
 |           || ("killed".equals(state) && reports[i].getCurrentStatus() == TIPStatus.KILLED)  | 
 |           || ("pending".equals(state)  && reports[i].getCurrentStatus() == TIPStatus.PENDING)) { | 
 |         filteredReports.add(reports[i]); | 
 |       } | 
 |     } | 
 |     // using filtered reports instead of all the reports | 
 |     reports = filteredReports.toArray(new TaskReport[0]); | 
 |     filteredReports = null; | 
 |   } | 
 |   report_len = reports.length; | 
 |    | 
 |   if (report_len <= start_index) { | 
 |     out.print("<b>No such tasks</b>"); | 
 |   } else { | 
 |     out.print("<hr>"); | 
 |     out.print("<h2>" + Character.toUpperCase(state.charAt(0))  | 
 |               + state.substring(1).toLowerCase() + " Tasks</h2>"); | 
 |     out.print("<center>"); | 
 |     out.print("<table border=2 cellpadding=\"5\" cellspacing=\"2\">"); | 
 |     out.print("<tr><td align=\"center\">Task</td><td>Complete</td><td>Status</td>" + | 
 |               "<td>Start Time</td><td>Finish Time</td><td>Errors</td><td>Counters</td></tr>"); | 
 |     if (end_index > report_len){ | 
 |         end_index = report_len; | 
 |     } | 
 |     for (int i = start_index ; i < end_index; i++) { | 
 |           TaskReport report = reports[i]; | 
 |           out.print("<tr><td><a href=\"taskdetails.jsp?tipid=" + | 
 |             report.getTaskID() + "\">"  + report.getTaskID() + "</a></td>"); | 
 |          out.print("<td>" + StringUtils.formatPercent(report.getProgress(),2) + | 
 |         		   ServletUtil.percentageGraph(report.getProgress() * 100f, 80) + "</td>"); | 
 |          out.print("<td>"  + HtmlQuoting.quoteHtmlChars(report.getState()) + "<br/></td>"); | 
 |          out.println("<td>" + StringUtils.getFormattedTimeWithDiff(dateFormat, report.getStartTime(),0) + "<br/></td>"); | 
 |          out.println("<td>" + StringUtils.getFormattedTimeWithDiff(dateFormat,  | 
 |              report.getFinishTime(), report.getStartTime()) + "<br/></td>"); | 
 |          String[] diagnostics = report.getDiagnostics(); | 
 |          out.print("<td><pre>"); | 
 |          for (int j = 0; j < diagnostics.length ; j++) { | 
 |              out.println(HtmlQuoting.quoteHtmlChars(diagnostics[j])); | 
 |          } | 
 |          out.println("</pre><br/></td>"); | 
 |          out.println("<td>" +  | 
 |              "<a href=\"taskstats.jsp?tipid=" + report.getTaskID() + | 
 |              "\">" + report.getCounters().size() + | 
 |              "</a></td></tr>"); | 
 |     } | 
 |     out.print("</table>"); | 
 |     out.print("</center>"); | 
 |   } | 
 |   if (end_index < report_len) { | 
 |     out.print("<div style=\"text-align:right\">" +  | 
 |               "<a href=\"jobtasks.jsp?jobid="+ jobid + "&type=" + type + | 
 |               "&pagenum=" + next_page + "&state=" + state + | 
 |               "\">" + "Next" + "</a></div>"); | 
 |   } | 
 |   if (start_index != 0) { | 
 |       out.print("<div style=\"text-align:right\">" +  | 
 |                 "<a href=\"jobtasks.jsp?jobid="+ jobid + "&type=" + type + | 
 |                 "&pagenum=" + (pnum -1) + "&state=" + state + "\">" + "Prev" + "</a></div>"); | 
 |   } | 
 | %> | 
 |  | 
 | <hr> | 
 | <a href="jobtracker.jsp">Go back to JobTracker</a><br> | 
 | <% | 
 | out.println(ServletUtil.htmlFooter()); | 
 | %> |