TaskLogServlet.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:8k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.mapred;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import java.io.InputStream;
  22. import java.io.OutputStream;
  23. import javax.servlet.ServletException;
  24. import javax.servlet.http.HttpServlet;
  25. import javax.servlet.http.HttpServletRequest;
  26. import javax.servlet.http.HttpServletResponse;
  27. import org.apache.hadoop.util.StringUtils;
  28. /**
  29.  * A servlet that is run by the TaskTrackers to provide the task logs via http.
  30.  */
  31. public class TaskLogServlet extends HttpServlet {
  32.   private static final long serialVersionUID = -6615764817774487321L;
  33.   
  34.   private boolean haveTaskLog(TaskAttemptID taskId, TaskLog.LogName type) {
  35.     File f = TaskLog.getTaskLogFile(taskId, type);
  36.     return f.canRead();
  37.   }
  38.   /**
  39.    * Construct the taskLogUrl
  40.    * @param taskTrackerHostName
  41.    * @param httpPort
  42.    * @param taskAttemptID
  43.    * @return the taskLogUrl
  44.    */
  45.   public static String getTaskLogUrl(String taskTrackerHostName,
  46.       String httpPort, String taskAttemptID) {
  47.     return ("http://" + taskTrackerHostName + ":" + httpPort
  48.         + "/tasklog?taskid=" + taskAttemptID);
  49.   }
  50.   /**
  51.    * Find the next quotable character in the given array.
  52.    * @param data the bytes to look in
  53.    * @param offset the first index to look in
  54.    * @param end the index after the last one to look in
  55.    * @return the index of the quotable character or end if none was found
  56.    */
  57.   private static int findFirstQuotable(byte[] data, int offset, int end) {
  58.     while (offset < end) {
  59.       switch (data[offset]) {
  60.       case '<':
  61.       case '>':
  62.       case '&':
  63.         return offset;
  64.       default:
  65.         offset += 1;
  66.       }
  67.     }
  68.     return offset;
  69.   }
  70.   private static void quotedWrite(OutputStream out, byte[] data, int offset,
  71.                                   int length) throws IOException {
  72.     int end = offset + length;
  73.     while (offset < end) {
  74.       int next = findFirstQuotable(data, offset, end);
  75.       out.write(data, offset, next - offset);
  76.       offset = next;
  77.       if (offset < end) {
  78.         switch (data[offset]) {
  79.         case '<':
  80.           out.write("&lt;".getBytes());
  81.           break;
  82.         case '>':
  83.           out.write("&gt;".getBytes());
  84.           break;
  85.         case '&':
  86.           out.write("&amp;".getBytes());
  87.           break;
  88.         default:
  89.           out.write(data[offset]);
  90.           break;
  91.         }
  92.         offset += 1;
  93.       }
  94.     }
  95.   }
  96.   private void printTaskLog(HttpServletResponse response,
  97.                             OutputStream out, TaskAttemptID taskId, 
  98.                             long start, long end, boolean plainText, 
  99.                             TaskLog.LogName filter, boolean isCleanup) 
  100.   throws IOException {
  101.     if (!plainText) {
  102.       out.write(("<br><b><u>" + filter + " logs</u></b><br>n" +
  103.                  "<pre>n").getBytes());
  104.     }
  105.     try {
  106.       InputStream taskLogReader = 
  107.         new TaskLog.Reader(taskId, filter, start, end, isCleanup);
  108.       byte[] b = new byte[65536];
  109.       int result;
  110.       while (true) {
  111.         result = taskLogReader.read(b);
  112.         if (result > 0) {
  113.           if (plainText) {
  114.             out.write(b, 0, result); 
  115.           } else {
  116.             quotedWrite(out, b, 0, result);
  117.           }
  118.         } else {
  119.           break;
  120.         }
  121.       }
  122.       taskLogReader.close();
  123.       if( !plainText ) {
  124.         out.write("</pre></td></tr></table><hr><br>n".getBytes());
  125.       }
  126.     } catch (IOException ioe) {
  127.       if (filter == TaskLog.LogName.DEBUGOUT) {
  128.         if (!plainText) {
  129.            out.write("</pre><hr><br>n".getBytes());
  130.          }
  131.         // do nothing
  132.       }
  133.       else {
  134.         response.sendError(HttpServletResponse.SC_GONE,
  135.                          "Failed to retrieve " + filter + " log for task: " + 
  136.                          taskId);
  137.         out.write(("TaskLogServlet exception:n" + 
  138.                  StringUtils.stringifyException(ioe) + "n").getBytes());
  139.       }
  140.     }
  141.   }
  142.   /**
  143.    * Get the logs via http.
  144.    */
  145.   @Override
  146.   public void doGet(HttpServletRequest request, 
  147.                     HttpServletResponse response
  148.                     ) throws ServletException, IOException {
  149.     long start = 0;
  150.     long end = -1;
  151.     boolean plainText = false;
  152.     TaskLog.LogName filter = null;
  153.     boolean isCleanup = false;
  154.     String taskIdStr = request.getParameter("taskid");
  155.     if (taskIdStr == null) {
  156.       response.sendError(HttpServletResponse.SC_BAD_REQUEST, 
  157.                          "Argument taskid is required");
  158.       return;
  159.     }
  160.     TaskAttemptID taskId = TaskAttemptID.forName(taskIdStr);
  161.     String logFilter = request.getParameter("filter");
  162.     if (logFilter != null) {
  163.       try {
  164.         filter = TaskLog.LogName.valueOf(TaskLog.LogName.class, 
  165.                                          logFilter.toUpperCase());
  166.       } catch (IllegalArgumentException iae) {
  167.         response.sendError(HttpServletResponse.SC_BAD_REQUEST,
  168.                            "Illegal value for filter: " + logFilter);
  169.         return;
  170.       }
  171.     }
  172.     
  173.     String sLogOff = request.getParameter("start");
  174.     if (sLogOff != null) {
  175.       start = Long.valueOf(sLogOff).longValue();
  176.     }
  177.     
  178.     String sLogEnd = request.getParameter("end");
  179.     if (sLogEnd != null) {
  180.       end = Long.valueOf(sLogEnd).longValue();
  181.     }
  182.     
  183.     String sPlainText = request.getParameter("plaintext");
  184.     if (sPlainText != null) {
  185.       plainText = Boolean.valueOf(sPlainText);
  186.     }
  187.     
  188.     String sCleanup = request.getParameter("cleanup");
  189.     if (sCleanup != null) {
  190.       isCleanup = Boolean.valueOf(sCleanup);
  191.     }
  192.     
  193.     OutputStream out = response.getOutputStream();
  194.     if( !plainText ) {
  195.       out.write(("<html>n" +
  196.                  "<title>Task Logs: '" + taskId + "'</title>n" +
  197.                  "<body>n" +
  198.                  "<h1>Task Logs: '" +  taskId +  "'</h1><br>n").getBytes()); 
  199.       if (filter == null) {
  200.         printTaskLog(response, out, taskId, start, end, plainText, 
  201.                      TaskLog.LogName.STDOUT, isCleanup);
  202.         printTaskLog(response, out, taskId, start, end, plainText, 
  203.                      TaskLog.LogName.STDERR, isCleanup);
  204.         printTaskLog(response, out, taskId, start, end, plainText, 
  205.                      TaskLog.LogName.SYSLOG, isCleanup);
  206.         if (haveTaskLog(taskId, TaskLog.LogName.DEBUGOUT)) {
  207.           printTaskLog(response, out, taskId, start, end, plainText, 
  208.                        TaskLog.LogName.DEBUGOUT, isCleanup);
  209.         }
  210.         if (haveTaskLog(taskId, TaskLog.LogName.PROFILE)) {
  211.           printTaskLog(response, out, taskId, start, end, plainText, 
  212.                        TaskLog.LogName.PROFILE, isCleanup);
  213.         }
  214.       } else {
  215.         printTaskLog(response, out, taskId, start, end, plainText, filter,
  216.                      isCleanup);
  217.       }
  218.       
  219.       out.write("</body></html>n".getBytes());
  220.       out.close();
  221.     } else if (filter == null) {
  222.       response.sendError(HttpServletResponse.SC_BAD_REQUEST,
  223.           "You must supply a value for `filter' (STDOUT, STDERR, or SYSLOG) if you set plainText = true");
  224.     } else {
  225.       printTaskLog(response, out, taskId, start, end, plainText, filter, 
  226.                    isCleanup);
  227.     } 
  228.   }
  229. }