%@ page
contentType="text/html; charset=UTF-8"
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.*"
%>
"/>
"/>
<%! private static SimpleDateFormat dateFormat
= new SimpleDateFormat("d/MM HH:mm:ss") ;
%>
<%
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");
%>
User : <%=job.get(Keys.USER) %>
JobName : <%=job.get(Keys.JOBNAME) %>
JobConf : <%=job.get(Keys.JOBCONF) %>
Submitted At : <%=StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.SUBMIT_TIME), 0 ) %>
Launched At : <%=StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.LAUNCH_TIME), job.getLong(Keys.SUBMIT_TIME)) %>
Finished At : <%=StringUtils.getFormattedTimeWithDiff(dateFormat, job.getLong(Keys.FINISH_TIME), job.getLong(Keys.LAUNCH_TIME)) %>
Status : <%= ((job.get(Keys.JOB_STATUS) == null)?"Incomplete" :job.get(Keys.JOB_STATUS)) %>
<%
if (!Values.SUCCESS.name().equals(job.get(Keys.JOB_STATUS))) {
out.print("No Analysis available as job did not finish
");
return;
}
Map 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 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 if (Values.REDUCE.name().equals(task.get(Keys.TASK_TYPE))) {
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 cMap = new Comparator(){
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 cShuffle = new Comparator(){
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
Time taken by best performing Map task
<%=minMap.get(Keys.TASKID) %> : <%=StringUtils.formatTimeDiff(minMap.getLong(Keys.FINISH_TIME), minMap.getLong(Keys.START_TIME) ) %>
Average time taken by Map tasks:
<%=StringUtils.formatTimeDiff(avgMapTime, 0) %>
Worse performing map tasks
Task Id | Time taken |
<%
for (int i=0;i
<%=mapTasks[i].get(Keys.TASKID) %> |
<%=StringUtils.formatTimeDiff(mapTasks[i].getLong(Keys.FINISH_TIME), mapTasks[i].getLong(Keys.START_TIME)) %> |
<%
}
%>
<%
Comparator cFinishMapRed =
new Comparator() {
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
The last Map task
<%=lastMap.get(Keys.TASKID) %>
finished at (relative to the Job launch time):
<%=StringUtils.getFormattedTimeWithDiff(dateFormat,
lastMap.getLong(Keys.FINISH_TIME),
job.getLong(Keys.LAUNCH_TIME) ) %>
<%
if (reduceTasks.length <= 0) return;
Arrays.sort(reduceTasks, cShuffle);
JobHistory.Task minShuffle = reduceTasks[reduceTasks.length-1] ;
%>
Time taken by best performing shuffle
<%=minShuffle.get(Keys.TASKID)%> :
<%=StringUtils.formatTimeDiff(minShuffle.getLong(Keys.SHUFFLE_FINISHED),
minShuffle.getLong(Keys.START_TIME) ) %>
Average time taken by Shuffle:
<%=StringUtils.formatTimeDiff(avgShuffleTime, 0) %>
Worse performing Shuffle(s)
Task Id | Time taken |
<%
for (int i=0;i
<%=reduceTasks[i].get(Keys.TASKID) %> |
<%=
StringUtils.formatTimeDiff(
reduceTasks[i].getLong(Keys.SHUFFLE_FINISHED),
reduceTasks[i].getLong(Keys.START_TIME)) %>
|
<%
}
%>
<%
Comparator cFinishShuffle =
new Comparator() {
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
The last Shuffle
<%=lastShuffle.get(Keys.TASKID)%>
finished at (relative to the Job launch time):
<%=StringUtils.getFormattedTimeWithDiff(dateFormat,
lastShuffle.getLong(Keys.SHUFFLE_FINISHED),
job.getLong(Keys.LAUNCH_TIME) ) %>
<%
Comparator cReduce = new Comparator(){
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
Time taken by best performing Reduce task :
<%=minReduce.get(Keys.TASKID) %> :
<%=StringUtils.formatTimeDiff(minReduce.getLong(Keys.FINISH_TIME),
minReduce.getLong(Keys.SHUFFLE_FINISHED) ) %>
Average time taken by Reduce tasks:
<%=StringUtils.formatTimeDiff(avgReduceTime, 0) %>
Worse performing reduce tasks
Task Id | Time taken |
<%
for (int i=0;i
<%=reduceTasks[i].get(Keys.TASKID) %> |
<%=StringUtils.formatTimeDiff(
reduceTasks[i].getLong(Keys.FINISH_TIME),
reduceTasks[i].getLong(Keys.SHUFFLE_FINISHED)) %> |
<%
}
%>
<%
Arrays.sort(reduceTasks, cFinishMapRed);
JobHistory.Task lastReduce = reduceTasks[0] ;
%>
The last Reduce task
<%=lastReduce.get(Keys.TASKID)%>
finished at (relative to the Job launch time):
<%=StringUtils.getFormattedTimeWithDiff(dateFormat,
lastReduce.getLong(Keys.FINISH_TIME),
job.getLong(Keys.LAUNCH_TIME) ) %>