瀏覽代碼

HADOOP-177. Page through tasks in web ui.

git-svn-id: https://svn.apache.org/repos/asf/lucene/hadoop/trunk@398650 13f79535-47bb-0310-9956-ffa450edef68
Doug Cutting 19 年之前
父節點
當前提交
f971397769
共有 3 個文件被更改,包括 74 次插入59 次删除
  1. 4 0
      CHANGES.txt
  2. 62 55
      src/webapps/mapred/jobdetails.jsp
  3. 8 4
      src/webapps/mapred/jobtracker.jsp

+ 4 - 0
CHANGES.txt

@@ -128,6 +128,10 @@ Trunk (unreleased)
     to contact the job tracker for five attempts, not just one as
     to contact the job tracker for five attempts, not just one as
     before.  (omalley via cutting)
     before.  (omalley via cutting)
 
 
+35. HADOOP-177.  Change MapReduce web interface to page through tasks.
+    Previously, when jobs had more than a few thousand tasks they
+    could crash web browsers.  (Mahadev Konar via cutting)
+
 
 
 Release 0.1.1 - 2006-04-08
 Release 0.1.1 - 2006-04-08
 
 

+ 62 - 55
src/webapps/mapred/jobdetails.jsp

@@ -5,16 +5,30 @@
   import="java.io.*"
   import="java.io.*"
   import="java.util.*"
   import="java.util.*"
   import="org.apache.hadoop.mapred.*"
   import="org.apache.hadoop.mapred.*"
+  import="java.lang.Integer"
 %>
 %>
+
 <%
 <%
   String jobid = request.getParameter("jobid");
   String jobid = request.getParameter("jobid");
+  String type = request.getParameter("type");
+  String pagenum = request.getParameter("pagenum");
+  int pnum = Integer.parseInt(pagenum);
+  int next_page = pnum+1;
+  int numperpage = 2000;
   JobTracker tracker = JobTracker.getTracker();
   JobTracker tracker = JobTracker.getTracker();
   JobInProgress job = (JobInProgress) tracker.getJob(jobid);
   JobInProgress job = (JobInProgress) tracker.getJob(jobid);
   JobProfile profile = (job != null) ? (job.getProfile()) : null;
   JobProfile profile = (job != null) ? (job.getProfile()) : null;
   JobStatus status = (job != null) ? (job.getStatus()) : null;
   JobStatus status = (job != null) ? (job.getStatus()) : null;
-
-  TaskReport[] mapTaskReports = (job != null) ? tracker.getMapTaskReports(jobid) : null;
-  TaskReport[] reduceTaskReports = (job != null) ? tracker.getReduceTaskReports(jobid) : null;
+  TaskReport[] reports = null;
+  int start_index = (pnum - 1) * numperpage;
+  int end_index = start_index + numperpage;
+  int report_len = 0;
+  if ("map".equals(type)){
+     reports = (job != null) ? tracker.getMapTaskReports(jobid) : null;
+    }
+  else{
+    reports = (job != null) ? tracker.getReduceTaskReports(jobid) : null;
+  }
 %>
 %>
 
 
 <html>
 <html>
@@ -26,70 +40,63 @@
     No job found<br>
     No job found<br>
     <%
     <%
   } else {
   } else {
-    %>
+ %>
 <h1>Job '<%=jobid%>'</h1>
 <h1>Job '<%=jobid%>'</h1>
 
 
 <b>Job File:</b> <%=profile.getJobFile()%><br>
 <b>Job File:</b> <%=profile.getJobFile()%><br>
 <b>The job started at:</b> <%= new Date(job.getStartTime())%><br>
 <b>The job started at:</b> <%= new Date(job.getStartTime())%><br>
-<%
+<%   
   if (status.getRunState() == JobStatus.RUNNING) {
   if (status.getRunState() == JobStatus.RUNNING) {
     out.print("The job is still running.<br>\n");
     out.print("The job is still running.<br>\n");
   } else if (status.getRunState() == JobStatus.SUCCEEDED) {
   } else if (status.getRunState() == JobStatus.SUCCEEDED) {
-    out.print("<b>The job completed at:</b> " + new Date(job.getFinishTime()) + "<br>\n");
-  } else if (status.getRunState() == JobStatus.FAILED) {
-    out.print("<b>The job failed at:</b> " + new Date(job.getFinishTime()) + "<br>\n");
-  }
-%>
-<hr>
-
-<h2>Map Tasks</h2>
-  <center>
-  <table border=2 cellpadding="5" cellspacing="2">
-  <tr><td align="center">Task</td><td>Complete</td><td>Status</td><td>Errors</td></tr>
+    out.print("<b>The job completed at:</b> " + new Date(job.getFinishTime()) + 
 
 
-  <%
-
-    for (int i = 0; i < mapTaskReports.length; i++) {
-      TaskReport report = mapTaskReports[i];
+"<br>\n");
+  } else if (status.getRunState() == JobStatus.FAILED) {
+    out.print("<b>The job failed at:</b> " + new Date(job.getFinishTime()) + 
 
 
-      out.print("<tr><td><a href=\"taskdetails.jsp?jobid=" + jobid + "&taskid=" + report.getTaskId() + "\">"  + report.getTaskId() + "</a></td>");
-      out.print("<td>" + report.getProgress() + "</td>");
-      out.print("<td>"  + report.getState() + "</td>");
-      String[] diagnostics = report.getDiagnostics();
-      for (int j = 0; j < diagnostics.length ; j++) {
-        out.print("<td><pre>" + diagnostics[j] + "</pre></td>");
-      }
-      out.print("</tr>\n");
+"<br>\n");
+  }
+  report_len = reports.length;
+  
+  if (report_len <= start_index) {
+        out.print("<b>No such tasks</b>");
+  }else{
+    out.print("<hr>");
+    out.print("<h2>Tasks</h2>");
+    out.print("<center>");
+    out.print("<table border=2 cellpadding=\"5\" cellspacing=\"2\">");
+    out.print("<tr><td align=\"center\">Task</td><td>Complete</td><td>Status</td><td>Errors</td></tr>");
+    if (end_index > report_len){
+        end_index = report_len;
     }
     }
-  %>
-  </table>
-  </center>
-<hr>
-
-
-<h2>Reduce Tasks</h2>
-  <center>
-  <table border=2 cellpadding="5" cellspacing="2">
-  <tr><td align="center">Task</td><td>Complete</td><td>State</td><td>Errors</td></tr>
-
-  <%
-    for (int i = 0; i < reduceTaskReports.length; i++) {
-      TaskReport report = reduceTaskReports[i];
-
-      out.print("<tr><td><a href=\"taskdetails.jsp?jobid=" + jobid + "&taskid=" + report.getTaskId() + "\">" + report.getTaskId() + "</a></td>");
-      out.print("<td>" + report.getProgress() + "</td>");
-      out.print("<td>" + report.getState() + "</td>");
-
-      String[] diagnostics = report.getDiagnostics();
-      for (int j = 0; j < diagnostics.length ; j++) {
-        out.print("<td><pre>" + diagnostics[j] + "</pre></td>");
-      }
-      out.print("</tr>\n");
+    for (int i = start_index ; i < end_index; i++) {
+          TaskReport report = reports[i];
+          out.print("<tr><td><a href=\"taskdetails.jsp?jobid=" + jobid + 
+"&taskid=" + report.getTaskId() + "\">"  + report.getTaskId() + "</a></td>");
+         out.print("<td>" + report.getProgress() + "</td>");
+         out.print("<td>"  + report.getState() + "</td>");
+         String[] diagnostics = report.getDiagnostics();
+         for (int j = 0; j < diagnostics.length ; j++) {
+                out.print("<td><pre>" + diagnostics[j] + "</pre></td>");
+         }
+            out.print("</tr>\n");
     }
     }
+    out.print("</table>");
+    out.print("</center>");
+  }
+  
   %>
   %>
-  </table>
-  </center>
-  <%
+  
+ <%
+  if (end_index < report_len) {
+    out.print("<div style=\"text-align:right\">" + "<a href=\"/jobdetails.jsp?jobid="+ jobid + "&type=" + type +"&pagenum=" + next_page 
+            + "\">" + "Next" + "</a></div>");
+   }
+  if (start_index != 0) {
+      out.print("<div style=\"text-align:right\">" + "<a href=\"/jobdetails.jsp?jobid="+ jobid + "&type=" + type +"&pagenum=" + (pnum -1) 
+      + "\">" + "Prev" + "</a></div>");
+   }
   }
   }
 %>
 %>
 
 

+ 8 - 4
src/webapps/mapred/jobtracker.jsp

@@ -82,10 +82,14 @@
           int completedReduces = job.finishedReduces();
           int completedReduces = job.finishedReduces();
           String name = profile.getJobName();
           String name = profile.getJobName();
 
 
-          out.print("<tr><td><a href=\"jobdetails.jsp?jobid=" + jobid + "\">" + 
-                    jobid + "</a></td><td>"+ profile.getUser() + "</td><td>" +
-                    ("".equals(name) ? "&nbsp;" : name) + "</td><td>" +
-                    percentFormat.format(completedRatio) + "%</td><td>" + 
+          out.print( "<tr><td>" + jobid + 
+                  "<br>" + "<a href=\"jobdetails.jsp?jobid=" + jobid + "&type=" + "map" + "&pagenum=" + 1 + "\">" + 
+                    "Maps" + "</a>" +  "<br>" +
+                  "<a href=\"jobdetails.jsp?jobid=" + jobid + "&type=" + "reduce" + "&pagenum=" + 1 + "\">" + 
+                    "Reduces" + "</a></td>" +
+                  "<td>" + profile.getUser() + "</td>" 
+                    + "<td>" + ("".equals(name) ? "&nbsp;" : name) + "</td>" + 
+                    "<td>" + percentFormat.format(completedRatio) + "%</td><td>" + 
                     desiredMaps + "</td><td>" + completedMaps + "</td><td>" + 
                     desiredMaps + "</td><td>" + completedMaps + "</td><td>" + 
                     desiredReduces + "</td><td> " + completedReduces + 
                     desiredReduces + "</td><td> " + completedReduces + 
                     "</td></tr>\n");
                     "</td></tr>\n");