package org.apache.hadoop.mapred; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import org.apache.hadoop.fs.*; import org.apache.hadoop.mapred.*; import org.apache.hadoop.util.*; import java.text.SimpleDateFormat; import org.apache.hadoop.mapred.JobHistory.*; public final class jobdetailshistory_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { static SimpleDateFormat dateFormat = new SimpleDateFormat("d-MMM-yyyy HH:mm:ss") ; private static java.util.Vector _jspx_dependants; public java.util.List getDependants() { return _jspx_dependants; } public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { JspFactory _jspxFactory = null; PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write('\n'); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "loadhistory.jsp" + (("loadhistory.jsp").indexOf('?')>0? '&': '?') + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("jobid", request.getCharacterEncoding())+ "=" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode(String.valueOf(request.getParameter("jobid") ), request.getCharacterEncoding()) + "&" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("logFile", request.getCharacterEncoding())+ "=" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode(String.valueOf(request.getParameter("logFile") ), request.getCharacterEncoding()), out, false); out.write('\n'); out.write('\n'); String jobid = request.getParameter("jobid"); String logFile = request.getParameter("logFile"); String encodedLogFileName = JobHistory.JobInfo.encodeJobHistoryFilePath(logFile); Path jobFile = new Path(logFile); String[] jobDetails = jobFile.getName().split("_"); String jobUniqueString = jobDetails[0] + "_" +jobDetails[1] + "_" + jobid ; JobInfo job = (JobInfo)request.getSession().getAttribute("job"); FileSystem fs = (FileSystem)request.getSession().getAttribute("fs"); out.write("\n<html><body>\n<h2>Hadoop Job "); out.print(jobid ); out.write(" on <a href=\"jobhistory.jsp\">History Viewer</a></h2>\n\n<b>User: </b> "); out.print(job.get(Keys.USER) ); out.write("<br/> \n<b>JobName: </b> "); out.print(job.get(Keys.JOBNAME) ); out.write("<br/> \n<b>JobConf: </b> <a href=\"jobconf_history.jsp?jobid="); out.print(jobid); out.write("&jobLogDir="); out.print(new Path(logFile).getParent().toString()); out.write("&jobUniqueString="); out.print(jobUniqueString); out.write("\"> \n "); out.print(job.get(Keys.JOBCONF) ); out.write("</a><br/> \n<b>Submitted At: </b> "); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.SUBMIT_TIME), 0 ) ); out.write("<br/> \n<b>Launched At: </b> "); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.LAUNCH_TIME), job.getLong(Keys.SUBMIT_TIME)) ); out.write("<br/>\n<b>Finished At: </b> "); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.FINISH_TIME), job.getLong(Keys.LAUNCH_TIME)) ); out.write("<br/>\n<b>Status: </b> "); out.print( ((job.get(Keys.JOB_STATUS) == "")?"Incomplete" :job.get(Keys.JOB_STATUS)) ); out.write("<br/> \n"); Map<String, JobHistory.Task> tasks = job.getAllTasks(); int totalMaps = 0 ; int totalReduces = 0; int numFailedMaps = 0; int numKilledMaps = 0; int numFailedReduces = 0 ; int numKilledReduces = 0; long mapStarted = 0 ; long mapFinished = 0 ; long reduceStarted = 0 ; long reduceFinished = 0; Map <String,String> allHosts = new TreeMap<String,String>(); for (JobHistory.Task task : tasks.values()) { Map<String, TaskAttempt> attempts = task.getTaskAttempts(); allHosts.put(task.get(Keys.HOSTNAME), ""); for (TaskAttempt attempt : attempts.values()) { long startTime = attempt.getLong(Keys.START_TIME) ; long finishTime = attempt.getLong(Keys.FINISH_TIME) ; if (Values.MAP.name().equals(task.get(Keys.TASK_TYPE))){ if (mapStarted==0 || mapStarted > startTime ) { mapStarted = startTime; } if (mapFinished < finishTime ) { mapFinished = finishTime ; } totalMaps++; if (Values.FAILED.name().equals(attempt.get(Keys.TASK_STATUS))) { numFailedMaps++; } else if (Values.KILLED.name().equals(attempt.get(Keys.TASK_STATUS))) { numKilledMaps++; } } else { if (reduceStarted==0||reduceStarted > startTime) { reduceStarted = startTime ; } if (reduceFinished < finishTime) { reduceFinished = finishTime; } totalReduces++; if (Values.FAILED.name().equals(attempt.get(Keys.TASK_STATUS))) { numFailedReduces++; } else if (Values.KILLED.name().equals(attempt.get(Keys.TASK_STATUS))) { numKilledReduces++; } } } } out.write("\n<b><a href=\"analysejobhistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("\">Analyse This Job</a></b> \n<hr/>\n<center>\n<table border=\"2\" cellpadding=\"5\" cellspacing=\"2\">\n<tr>\n<td>Kind</td><td>Total Tasks(successful+failed+killed)</td><td>Successful tasks</td><td>Failed tasks</td><td>Killed tasks</td><td>Start Time</td><td>Finish Time</td>\n</tr>\n<tr>\n<td>Map</td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.MAP.name() ); out.write("&status=all\">\n "); out.print(totalMaps ); out.write("</a></td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.MAP.name() ); out.write("&status="); out.print(Values.SUCCESS ); out.write("\">\n "); out.print(job.getInt(Keys.FINISHED_MAPS) ); out.write("</a></td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.MAP.name() ); out.write("&status="); out.print(Values.FAILED ); out.write("\">\n "); out.print(numFailedMaps ); out.write("</a></td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.MAP.name() ); out.write("&status="); out.print(Values.KILLED ); out.write("\">\n "); out.print(numKilledMaps ); out.write("</a></td>\n <td>"); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, mapStarted, 0) ); out.write("</td>\n <td>"); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, mapFinished, mapStarted) ); out.write("</td>\n</tr>\n<tr>\n<td>Reduce</td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.REDUCE.name() ); out.write("&status=all\">\n "); out.print(totalReduces); out.write("</a></td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.REDUCE.name() ); out.write("&status="); out.print(Values.SUCCESS ); out.write("\">\n "); out.print(job.getInt(Keys.FINISHED_REDUCES)); out.write("</a></td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.REDUCE.name() ); out.write("&status="); out.print(Values.FAILED ); out.write("\">\n "); out.print(numFailedReduces); out.write("</a></td>\n <td><a href=\"jobtaskshistory.jsp?jobid="); out.print(jobid ); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskType="); out.print(Values.REDUCE.name() ); out.write("&status="); out.print(Values.KILLED ); out.write("\">\n "); out.print(numKilledReduces); out.write("</a></td> \n <td>"); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, reduceStarted, 0) ); out.write("</td>\n <td>"); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, reduceFinished, reduceStarted) ); out.write("</td>\n</tr>\n</table>\n\n<br/>\n "); DefaultJobHistoryParser.FailedOnNodesFilter filter = new DefaultJobHistoryParser.FailedOnNodesFilter(); JobHistory.parseHistoryFromFS(logFile, filter, fs); Map<String, Set<String>> badNodes = filter.getValues(); if (badNodes.size() > 0) { out.write("\n<h3>Failed tasks attempts by nodes </h3>\n<table border=\"1\">\n<tr><td>Hostname</td><td>Failed Tasks</td></tr>\n "); for (Map.Entry<String, Set<String>> entry : badNodes.entrySet()) { String node = entry.getKey(); Set<String> failedTasks = entry.getValue(); out.write("\n <tr>\n <td>"); out.print(node ); out.write("</td>\n <td>\n"); for (String t : failedTasks) { out.write("\n <a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskid="); out.print(t ); out.write('"'); out.write('>'); out.print(t ); out.write("</a>, \n"); } out.write("\t\n </td>\n </tr>\n"); } } out.write("\n</table>\n<br/>\n "); DefaultJobHistoryParser.KilledOnNodesFilter killedFilter = new DefaultJobHistoryParser.KilledOnNodesFilter(); JobHistory.parseHistoryFromFS(logFile, filter, fs); badNodes = killedFilter.getValues(); if (badNodes.size() > 0) { out.write("\n<h3>Killed tasks attempts by nodes </h3>\n<table border=\"1\">\n<tr><td>Hostname</td><td>Killed Tasks</td></tr>\n "); for (Map.Entry<String, Set<String>> entry : badNodes.entrySet()) { String node = entry.getKey(); Set<String> killedTasks = entry.getValue(); out.write("\n <tr>\n <td>"); out.print(node ); out.write("</td>\n <td>\n"); for (String t : killedTasks) { out.write("\n <a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskid="); out.print(t ); out.write('"'); out.write('>'); out.print(t ); out.write("</a>, \n"); } out.write("\t\n </td>\n </tr>\n"); } } out.write("\n</table>\n</center>\n</body></html>\n"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context); } } }