source: proiecte/HadoopJUnit/hadoop-0.20.1/src/webapps/job/analysejobhistory.jsp @ 120

Last change on this file since 120 was 120, checked in by (none), 14 years ago

Added the mail files for the Hadoop JUNit Project

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