analysejobhistory.jsp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <%@ page
  2. contentType="text/html; charset=UTF-8"
  3. import="javax.servlet.http.*"
  4. import="java.io.*"
  5. import="java.util.*"
  6. import="org.apache.hadoop.http.HtmlQuoting"
  7. import="org.apache.hadoop.mapred.*"
  8. import="org.apache.hadoop.fs.*"
  9. import="org.apache.hadoop.util.*"
  10. import="java.text.SimpleDateFormat"
  11. import="org.apache.hadoop.mapred.JobHistory.*"
  12. %>
  13. <%! private static SimpleDateFormat dateFormat
  14. = new SimpleDateFormat("d/MM HH:mm:ss") ;
  15. %>
  16. <%! private static final long serialVersionUID = 1L;
  17. %>
  18. <html><body>
  19. <%
  20. String logFile = request.getParameter("logFile");
  21. if (logFile == null) {
  22. out.println("Missing job!!");
  23. return;
  24. }
  25. String encodedLogFileName = JobHistory.JobInfo.encodeJobHistoryFilePath(logFile);
  26. String jobid = JSPUtil.getJobID(new Path(encodedLogFileName).getName());
  27. String numTasks = request.getParameter("numTasks");
  28. int showTasks = 10 ;
  29. if (numTasks != null) {
  30. showTasks = Integer.parseInt(numTasks);
  31. }
  32. FileSystem fs = (FileSystem) application.getAttribute("fileSys");
  33. JobConf jobConf = (JobConf) application.getAttribute("jobConf");
  34. ACLsManager aclsManager = (ACLsManager) application.getAttribute("aclManager");
  35. JobHistory.JobInfo job = JSPUtil.checkAccessAndGetJobInfo(request,
  36. response, jobConf, aclsManager, fs, new Path(logFile));
  37. if (job == null) {
  38. return;
  39. }%>
  40. <h2>Hadoop Job <a href="jobdetailshistory.jsp?logFile=<%=encodedLogFileName%>"><%=jobid %> </a></h2>
  41. <b>User : </b> <%=HtmlQuoting.quoteHtmlChars(job.get(Keys.USER)) %><br/>
  42. <b>JobName : </b> <%=HtmlQuoting.quoteHtmlChars(job.get(Keys.JOBNAME)) %><br/>
  43. <b>JobConf : </b> <%=job.get(Keys.JOBCONF) %><br/>
  44. <b>Submitted At : </b> <%=StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.SUBMIT_TIME), 0 ) %><br/>
  45. <b>Launched At : </b> <%=StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.LAUNCH_TIME), job.getLong(Keys.SUBMIT_TIME)) %><br/>
  46. <b>Finished At : </b> <%=StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.FINISH_TIME), job.getLong(Keys.LAUNCH_TIME)) %><br/>
  47. <b>Status : </b> <%= ((job.get(Keys.JOB_STATUS) == null)?"Incomplete" :job.get(Keys.JOB_STATUS)) %><br/>
  48. <hr/>
  49. <center>
  50. <%
  51. if (!Values.SUCCESS.name().equals(job.get(Keys.JOB_STATUS))) {
  52. out.print("<h3>No Analysis available as job did not finish</h3>");
  53. return;
  54. }
  55. Map<String, JobHistory.Task> tasks = job.getAllTasks();
  56. int finishedMaps = job.getInt(Keys.FINISHED_MAPS) ;
  57. int finishedReduces = job.getInt(Keys.FINISHED_REDUCES) ;
  58. JobHistory.Task [] mapTasks = new JobHistory.Task[finishedMaps];
  59. JobHistory.Task [] reduceTasks = new JobHistory.Task[finishedReduces];
  60. int mapIndex = 0 , reduceIndex=0;
  61. long avgMapTime = 0;
  62. long avgReduceTime = 0;
  63. long avgShuffleTime = 0;
  64. for (JobHistory.Task task : tasks.values()) {
  65. Map<String, TaskAttempt> attempts = task.getTaskAttempts();
  66. for (JobHistory.TaskAttempt attempt : attempts.values()) {
  67. if (attempt.get(Keys.TASK_STATUS).equals(Values.SUCCESS.name())) {
  68. long avgFinishTime = (attempt.getLong(Keys.FINISH_TIME) -
  69. attempt.getLong(Keys.START_TIME));
  70. if (Values.MAP.name().equals(task.get(Keys.TASK_TYPE))) {
  71. mapTasks[mapIndex++] = attempt ;
  72. avgMapTime += avgFinishTime;
  73. } else if (Values.REDUCE.name().equals(task.get(Keys.TASK_TYPE))) {
  74. reduceTasks[reduceIndex++] = attempt;
  75. avgShuffleTime += (attempt.getLong(Keys.SHUFFLE_FINISHED) -
  76. attempt.getLong(Keys.START_TIME));
  77. avgReduceTime += (attempt.getLong(Keys.FINISH_TIME) -
  78. attempt.getLong(Keys.SHUFFLE_FINISHED));
  79. }
  80. break;
  81. }
  82. }
  83. }
  84. if (finishedMaps > 0) {
  85. avgMapTime /= finishedMaps;
  86. }
  87. if (finishedReduces > 0) {
  88. avgReduceTime /= finishedReduces;
  89. avgShuffleTime /= finishedReduces;
  90. }
  91. Comparator<JobHistory.Task> cMap = new Comparator<JobHistory.Task>(){
  92. public int compare(JobHistory.Task t1, JobHistory.Task t2){
  93. long l1 = t1.getLong(Keys.FINISH_TIME) - t1.getLong(Keys.START_TIME);
  94. long l2 = t2.getLong(Keys.FINISH_TIME) - t2.getLong(Keys.START_TIME);
  95. return (l2<l1 ? -1 : (l2==l1 ? 0 : 1));
  96. }
  97. };
  98. Comparator<JobHistory.Task> cShuffle = new Comparator<JobHistory.Task>(){
  99. public int compare(JobHistory.Task t1, JobHistory.Task t2){
  100. long l1 = t1.getLong(Keys.SHUFFLE_FINISHED) -
  101. t1.getLong(Keys.START_TIME);
  102. long l2 = t2.getLong(Keys.SHUFFLE_FINISHED) -
  103. t2.getLong(Keys.START_TIME);
  104. return (l2<l1 ? -1 : (l2==l1 ? 0 : 1));
  105. }
  106. };
  107. Comparator<JobHistory.Task> cFinishMapRed =
  108. new Comparator<JobHistory.Task>() {
  109. public int compare(JobHistory.Task t1, JobHistory.Task t2){
  110. long l1 = t1.getLong(Keys.FINISH_TIME);
  111. long l2 = t2.getLong(Keys.FINISH_TIME);
  112. return (l2<l1 ? -1 : (l2==l1 ? 0 : 1));
  113. }
  114. };
  115. if (mapTasks.length > 0) {
  116. Arrays.sort(mapTasks, cMap);
  117. JobHistory.Task minMap = mapTasks[mapTasks.length-1] ;
  118. %>
  119. <h3>Time taken by best performing Map task
  120. <a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>&tipid=<%=minMap.get(Keys.TASKID)%>">
  121. <%=minMap.get(Keys.TASKID) %></a> : <%=StringUtils.formatTimeDiff(minMap.getLong(Keys.FINISH_TIME), minMap.getLong(Keys.START_TIME) ) %></h3>
  122. <h3>Average time taken by Map tasks:
  123. <%=StringUtils.formatTimeDiff(avgMapTime, 0) %></h3>
  124. <h3>Worse performing map tasks</h3>
  125. <table border="2" cellpadding="5" cellspacing="2">
  126. <tr><td>Task Id</td><td>Time taken</td></tr>
  127. <%
  128. for (int i=0;i<showTasks && i<mapTasks.length; i++) {
  129. %>
  130. <tr>
  131. <td><a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>&tipid=<%=mapTasks[i].get(Keys.TASKID)%>">
  132. <%=mapTasks[i].get(Keys.TASKID) %></a></td>
  133. <td><%=StringUtils.formatTimeDiff(mapTasks[i].getLong(Keys.FINISH_TIME), mapTasks[i].getLong(Keys.START_TIME)) %></td>
  134. </tr>
  135. <%
  136. }
  137. %>
  138. </table>
  139. <%
  140. Arrays.sort(mapTasks, cFinishMapRed);
  141. JobHistory.Task lastMap = mapTasks[0] ;
  142. %>
  143. <h3>The last Map task
  144. <a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>
  145. &tipid=<%=lastMap.get(Keys.TASKID)%>"><%=lastMap.get(Keys.TASKID) %></a>
  146. finished at (relative to the Job launch time):
  147. <%=StringUtils.getFormattedTimeWithDiff(dateFormat,
  148. lastMap.getLong(Keys.FINISH_TIME),
  149. job.getLong(Keys.LAUNCH_TIME) ) %></h3>
  150. <hr/>
  151. <%
  152. }//end if(mapTasks.length > 0)
  153. if (reduceTasks.length <= 0) return;
  154. Arrays.sort(reduceTasks, cShuffle);
  155. JobHistory.Task minShuffle = reduceTasks[reduceTasks.length-1] ;
  156. %>
  157. <h3>Time taken by best performing shufflejobId
  158. <a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>
  159. &tipid=<%=minShuffle.get(Keys.TASKID)%>"><%=minShuffle.get(Keys.TASKID)%></a> :
  160. <%=StringUtils.formatTimeDiff(minShuffle.getLong(Keys.SHUFFLE_FINISHED),
  161. minShuffle.getLong(Keys.START_TIME) ) %></h3>
  162. <h3>Average time taken by Shuffle:
  163. <%=StringUtils.formatTimeDiff(avgShuffleTime, 0) %></h3>
  164. <h3>Worse performing Shuffle(s)</h3>
  165. <table border="2" cellpadding="5" cellspacing="2">
  166. <tr><td>Task Id</td><td>Time taken</td></tr>
  167. <%
  168. for (int i=0;i<showTasks && i<reduceTasks.length; i++) {
  169. %>
  170. <tr>
  171. <td><a href="taskdetailshistory.jsp?logFile=
  172. <%=encodedLogFileName%>&tipid=<%=reduceTasks[i].get(Keys.TASKID)%>">
  173. <%=reduceTasks[i].get(Keys.TASKID) %></a></td>
  174. <td><%=
  175. StringUtils.formatTimeDiff(
  176. reduceTasks[i].getLong(Keys.SHUFFLE_FINISHED),
  177. reduceTasks[i].getLong(Keys.START_TIME)) %>
  178. </td>
  179. </tr>
  180. <%
  181. }
  182. %>
  183. </table>
  184. <%
  185. Comparator<JobHistory.Task> cFinishShuffle =
  186. new Comparator<JobHistory.Task>() {
  187. public int compare(JobHistory.Task t1, JobHistory.Task t2){
  188. long l1 = t1.getLong(Keys.SHUFFLE_FINISHED);
  189. long l2 = t2.getLong(Keys.SHUFFLE_FINISHED);
  190. return (l2<l1 ? -1 : (l2==l1 ? 0 : 1));
  191. }
  192. };
  193. Arrays.sort(reduceTasks, cFinishShuffle);
  194. JobHistory.Task lastShuffle = reduceTasks[0] ;
  195. %>
  196. <h3>The last Shuffle
  197. <a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>
  198. &tipid=<%=lastShuffle.get(Keys.TASKID)%>"><%=lastShuffle.get(Keys.TASKID)%>
  199. </a> finished at (relative to the Job launch time):
  200. <%=StringUtils.getFormattedTimeWithDiff(dateFormat,
  201. lastShuffle.getLong(Keys.SHUFFLE_FINISHED),
  202. job.getLong(Keys.LAUNCH_TIME) ) %></h3>
  203. <%
  204. Comparator<JobHistory.Task> cReduce = new Comparator<JobHistory.Task>(){
  205. public int compare(JobHistory.Task t1, JobHistory.Task t2){
  206. long l1 = t1.getLong(Keys.FINISH_TIME) -
  207. t1.getLong(Keys.SHUFFLE_FINISHED);
  208. long l2 = t2.getLong(Keys.FINISH_TIME) -
  209. t2.getLong(Keys.SHUFFLE_FINISHED);
  210. return (l2<l1 ? -1 : (l2==l1 ? 0 : 1));
  211. }
  212. };
  213. Arrays.sort(reduceTasks, cReduce);
  214. JobHistory.Task minReduce = reduceTasks[reduceTasks.length-1] ;
  215. %>
  216. <hr/>
  217. <h3>Time taken by best performing Reduce task :
  218. <a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>&tipid=<%=minReduce.get(Keys.TASKID)%>">
  219. <%=minReduce.get(Keys.TASKID) %></a> :
  220. <%=StringUtils.formatTimeDiff(minReduce.getLong(Keys.FINISH_TIME),
  221. minReduce.getLong(Keys.SHUFFLE_FINISHED) ) %></h3>
  222. <h3>Average time taken by Reduce tasks:
  223. <%=StringUtils.formatTimeDiff(avgReduceTime, 0) %></h3>
  224. <h3>Worse performing reduce tasks</h3>
  225. <table border="2" cellpadding="5" cellspacing="2">
  226. <tr><td>Task Id</td><td>Time taken</td></tr>
  227. <%
  228. for (int i=0;i<showTasks && i<reduceTasks.length; i++) {
  229. %>
  230. <tr>
  231. <td><a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>&tipid=<%=reduceTasks[i].get(Keys.TASKID)%>">
  232. <%=reduceTasks[i].get(Keys.TASKID) %></a></td>
  233. <td><%=StringUtils.formatTimeDiff(
  234. reduceTasks[i].getLong(Keys.FINISH_TIME),
  235. reduceTasks[i].getLong(Keys.SHUFFLE_FINISHED)) %></td>
  236. </tr>
  237. <%
  238. }
  239. %>
  240. </table>
  241. <%
  242. Arrays.sort(reduceTasks, cFinishMapRed);
  243. JobHistory.Task lastReduce = reduceTasks[0] ;
  244. %>
  245. <h3>The last Reduce task
  246. <a href="taskdetailshistory.jsp?logFile=<%=encodedLogFileName%>
  247. &tipid=<%=lastReduce.get(Keys.TASKID)%>"><%=lastReduce.get(Keys.TASKID)%>
  248. </a> finished at (relative to the Job launch time):
  249. <%=StringUtils.getFormattedTimeWithDiff(dateFormat,
  250. lastReduce.getLong(Keys.FINISH_TIME),
  251. job.getLong(Keys.LAUNCH_TIME) ) %></h3>
  252. </center>
  253. </body></html>