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.mapred.*; import org.apache.hadoop.util.*; import java.text.SimpleDateFormat; import org.apache.hadoop.mapred.JobHistory.*; public final class analysejobhistory_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static SimpleDateFormat dateFormat = new SimpleDateFormat("d/MM 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<html><body>\n"); String jobid = request.getParameter("jobid"); String logFile = request.getParameter("logFile"); String encodedLogFileName = JobHistory.JobInfo.encodeJobHistoryFilePath(logFile); String numTasks = request.getParameter("numTasks"); int showTasks = 10 ; if (numTasks != null) { showTasks = Integer.parseInt(numTasks); } JobInfo job = (JobInfo)request.getSession().getAttribute("job"); out.write("\n<h2>Hadoop Job <a href=\"jobdetailshistory.jsp?jobid="); out.print(jobid); out.write("&&logFile="); out.print(encodedLogFileName); out.write('"'); out.write('>'); out.print(jobid ); out.write(" </a></h2>\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> "); out.print(job.get(Keys.JOBCONF) ); out.write("<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) == null)?"Incomplete" :job.get(Keys.JOB_STATUS)) ); out.write("<br/> \n<hr/>\n<center>\n"); if (!Values.SUCCESS.name().equals(job.get(Keys.JOB_STATUS))) { out.print("<h3>No Analysis available as job did not finish</h3>"); return; } Map<String, JobHistory.Task> tasks = job.getAllTasks(); int finishedMaps = job.getInt(Keys.FINISHED_MAPS) ; int finishedReduces = job.getInt(Keys.FINISHED_REDUCES) ; JobHistory.Task [] mapTasks = new JobHistory.Task[finishedMaps]; JobHistory.Task [] reduceTasks = new JobHistory.Task[finishedReduces]; int mapIndex = 0 , reduceIndex=0; long avgMapTime = 0; long avgReduceTime = 0; long avgShuffleTime = 0; for (JobHistory.Task task : tasks.values()) { Map<String, TaskAttempt> attempts = task.getTaskAttempts(); for (JobHistory.TaskAttempt attempt : attempts.values()) { if (attempt.get(Keys.TASK_STATUS).equals(Values.SUCCESS.name())) { long avgFinishTime = (attempt.getLong(Keys.FINISH_TIME) - attempt.getLong(Keys.START_TIME)); if (Values.MAP.name().equals(task.get(Keys.TASK_TYPE))) { mapTasks[mapIndex++] = attempt ; avgMapTime += avgFinishTime; } else { reduceTasks[reduceIndex++] = attempt; avgShuffleTime += (attempt.getLong(Keys.SHUFFLE_FINISHED) - attempt.getLong(Keys.START_TIME)); avgReduceTime += (attempt.getLong(Keys.FINISH_TIME) - attempt.getLong(Keys.SHUFFLE_FINISHED)); } break; } } } if (finishedMaps > 0) { avgMapTime /= finishedMaps; } if (finishedReduces > 0) { avgReduceTime /= finishedReduces; avgShuffleTime /= finishedReduces; } Comparator<JobHistory.Task> cMap = new Comparator<JobHistory.Task>(){ public int compare(JobHistory.Task t1, JobHistory.Task t2){ long l1 = t1.getLong(Keys.FINISH_TIME) - t1.getLong(Keys.START_TIME); long l2 = t2.getLong(Keys.FINISH_TIME) - t2.getLong(Keys.START_TIME); return (l2<l1 ? -1 : (l2==l1 ? 0 : 1)); } }; Comparator<JobHistory.Task> cShuffle = new Comparator<JobHistory.Task>(){ public int compare(JobHistory.Task t1, JobHistory.Task t2){ long l1 = t1.getLong(Keys.SHUFFLE_FINISHED) - t1.getLong(Keys.START_TIME); long l2 = t2.getLong(Keys.SHUFFLE_FINISHED) - t2.getLong(Keys.START_TIME); return (l2<l1 ? -1 : (l2==l1 ? 0 : 1)); } }; Arrays.sort(mapTasks, cMap); JobHistory.Task minMap = mapTasks[mapTasks.length-1] ; out.write("\n\n<h3>Time taken by best performing Map task \n<a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskid="); out.print(minMap.get(Keys.TASKID)); out.write('"'); out.write('>'); out.write('\n'); out.print(minMap.get(Keys.TASKID) ); out.write("</a> : "); out.print(StringUtils.formatTimeDiff(minMap.getLong(Keys.FINISH_TIME), minMap.getLong(Keys.START_TIME) ) ); out.write("</h3>\n<h3>Average time taken by Map tasks: \n"); out.print(StringUtils.formatTimeDiff(avgMapTime, 0) ); out.write("</h3>\n<h3>Worse performing map tasks</h3>\n<table border=\"2\" cellpadding=\"5\" cellspacing=\"2\">\n<tr><td>Task Id</td><td>Time taken</td></tr>\n"); for (int i=0;i<showTasks && i<mapTasks.length; i++) { out.write("\n <tr>\n <td><a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskid="); out.print(mapTasks[i].get(Keys.TASKID)); out.write("\">\n "); out.print(mapTasks[i].get(Keys.TASKID) ); out.write("</a></td>\n <td>"); out.print(StringUtils.formatTimeDiff(mapTasks[i].getLong(Keys.FINISH_TIME), mapTasks[i].getLong(Keys.START_TIME)) ); out.write("</td>\n </tr>\n"); } out.write("\n</table>\n"); Comparator<JobHistory.Task> cFinishMapRed = new Comparator<JobHistory.Task>() { public int compare(JobHistory.Task t1, JobHistory.Task t2){ long l1 = t1.getLong(Keys.FINISH_TIME); long l2 = t2.getLong(Keys.FINISH_TIME); return (l2<l1 ? -1 : (l2==l1 ? 0 : 1)); } }; Arrays.sort(mapTasks, cFinishMapRed); JobHistory.Task lastMap = mapTasks[0] ; out.write("\n\n<h3>The last Map task \n<a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("\n&taskid="); out.print(lastMap.get(Keys.TASKID)); out.write('"'); out.write('>'); out.print(lastMap.get(Keys.TASKID) ); out.write("</a> \nfinished at (relative to the Job launch time): \n"); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, lastMap.getLong(Keys.FINISH_TIME), job.getLong(Keys.LAUNCH_TIME) ) ); out.write("</h3>\n<hr/>\n\n"); if (reduceTasks.length <= 0) return; Arrays.sort(reduceTasks, cShuffle); JobHistory.Task minShuffle = reduceTasks[reduceTasks.length-1] ; out.write("\n<h3>Time taken by best performing shuffle\n<a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("\n&taskid="); out.print(minShuffle.get(Keys.TASKID)); out.write('"'); out.write('>'); out.print(minShuffle.get(Keys.TASKID)); out.write("</a> : \n"); out.print(StringUtils.formatTimeDiff(minShuffle.getLong(Keys.SHUFFLE_FINISHED), minShuffle.getLong(Keys.START_TIME) ) ); out.write("</h3>\n<h3>Average time taken by Shuffle: \n"); out.print(StringUtils.formatTimeDiff(avgShuffleTime, 0) ); out.write("</h3>\n<h3>Worse performing Shuffle(s)</h3>\n<table border=\"2\" cellpadding=\"5\" cellspacing=\"2\">\n<tr><td>Task Id</td><td>Time taken</td></tr>\n"); for (int i=0;i<showTasks && i<reduceTasks.length; i++) { out.write("\n <tr>\n <td><a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile=\n"); out.print(encodedLogFileName); out.write("&taskid="); out.print(reduceTasks[i].get(Keys.TASKID)); out.write('"'); out.write('>'); out.write('\n'); out.print(reduceTasks[i].get(Keys.TASKID) ); out.write("</a></td>\n <td>"); out.print( StringUtils.formatTimeDiff( reduceTasks[i].getLong(Keys.SHUFFLE_FINISHED), reduceTasks[i].getLong(Keys.START_TIME)) ); out.write("\n </td>\n </tr>\n"); } out.write("\n</table>\n"); Comparator<JobHistory.Task> cFinishShuffle = new Comparator<JobHistory.Task>() { public int compare(JobHistory.Task t1, JobHistory.Task t2){ long l1 = t1.getLong(Keys.SHUFFLE_FINISHED); long l2 = t2.getLong(Keys.SHUFFLE_FINISHED); return (l2<l1 ? -1 : (l2==l1 ? 0 : 1)); } }; Arrays.sort(reduceTasks, cFinishShuffle); JobHistory.Task lastShuffle = reduceTasks[0] ; out.write("\n\n<h3>The last Shuffle \n<a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("\n&taskid="); out.print(lastShuffle.get(Keys.TASKID)); out.write('"'); out.write('>'); out.print(lastShuffle.get(Keys.TASKID)); out.write("\n</a> finished at (relative to the Job launch time): \n"); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, lastShuffle.getLong(Keys.SHUFFLE_FINISHED), job.getLong(Keys.LAUNCH_TIME) ) ); out.write("</h3>\n\n"); Comparator<JobHistory.Task> cReduce = new Comparator<JobHistory.Task>(){ public int compare(JobHistory.Task t1, JobHistory.Task t2){ long l1 = t1.getLong(Keys.FINISH_TIME) - t1.getLong(Keys.SHUFFLE_FINISHED); long l2 = t2.getLong(Keys.FINISH_TIME) - t2.getLong(Keys.SHUFFLE_FINISHED); return (l2<l1 ? -1 : (l2==l1 ? 0 : 1)); } }; Arrays.sort(reduceTasks, cReduce); JobHistory.Task minReduce = reduceTasks[reduceTasks.length-1] ; out.write("\n<hr/>\n<h3>Time taken by best performing Reduce task : \n<a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskid="); out.print(minReduce.get(Keys.TASKID)); out.write('"'); out.write('>'); out.write('\n'); out.print(minReduce.get(Keys.TASKID) ); out.write("</a> : \n"); out.print(StringUtils.formatTimeDiff(minReduce.getLong(Keys.FINISH_TIME), minReduce.getLong(Keys.SHUFFLE_FINISHED) ) ); out.write("</h3>\n\n<h3>Average time taken by Reduce tasks: \n"); out.print(StringUtils.formatTimeDiff(avgReduceTime, 0) ); out.write("</h3>\n<h3>Worse performing reduce tasks</h3>\n<table border=\"2\" cellpadding=\"5\" cellspacing=\"2\">\n<tr><td>Task Id</td><td>Time taken</td></tr>\n"); for (int i=0;i<showTasks && i<reduceTasks.length; i++) { out.write("\n <tr>\n <td><a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("&taskid="); out.print(reduceTasks[i].get(Keys.TASKID)); out.write("\">\n "); out.print(reduceTasks[i].get(Keys.TASKID) ); out.write("</a></td>\n <td>"); out.print(StringUtils.formatTimeDiff( reduceTasks[i].getLong(Keys.FINISH_TIME), reduceTasks[i].getLong(Keys.SHUFFLE_FINISHED)) ); out.write("</td>\n </tr>\n"); } out.write("\n</table>\n"); Arrays.sort(reduceTasks, cFinishMapRed); JobHistory.Task lastReduce = reduceTasks[0] ; out.write("\n\n<h3>The last Reduce task \n<a href=\"taskdetailshistory.jsp?jobid="); out.print(jobid); out.write("&logFile="); out.print(encodedLogFileName); out.write("\n&taskid="); out.print(lastReduce.get(Keys.TASKID)); out.write('"'); out.write('>'); out.print(lastReduce.get(Keys.TASKID)); out.write("\n</a> finished at (relative to the Job launch time): \n"); out.print(StringUtils.getFormattedTimeWithDiff(dateFormat, lastReduce.getLong(Keys.FINISH_TIME), job.getLong(Keys.LAUNCH_TIME) ) ); out.write("</h3>\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); } } }