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

网格计算

开发平台:

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.contrib.failmon;
  19. import java.io.IOException;
  20. import java.util.Calendar;
  21. import java.util.regex.Matcher;
  22. import java.util.regex.Pattern;
  23. /**********************************************************
  24.  * An object of this class parses a Hadoop log file to create
  25.  * appropriate EventRecords. The log file can either be the log 
  26.  * of a NameNode or JobTracker or DataNode or TaskTracker.
  27.  * 
  28.  **********************************************************/
  29. public class HadoopLogParser extends LogParser {
  30.   /**
  31.    * Create a new parser object and try to find the hostname
  32.    * of the node that generated the log
  33.    */
  34.   public HadoopLogParser(String fname) {
  35.     super(fname);
  36.     if ((dateformat = Environment.getProperty("log.hadoop.dateformat")) == null)
  37.       dateformat = "\d{4}-\d{2}-\d{2}";
  38.     if ((timeformat = Environment.getProperty("log.hadoop.timeformat")) == null)
  39.       timeformat = "\d{2}:\d{2}:\d{2}";
  40.     findHostname();
  41.   }
  42.   /**
  43.    * Parses one line of the log. If the line contains a valid 
  44.    * log entry, then an appropriate EventRecord is returned, after all
  45.    * relevant fields have been parsed.
  46.    *
  47.    *  @param line the log line to be parsed
  48.    *
  49.    *  @return the EventRecord representing the log entry of the line. If 
  50.    *  the line does not contain a valid log entry, then the EventRecord 
  51.    *  returned has isValid() = false. When the end-of-file has been reached,
  52.    *  null is returned to the caller.
  53.    */
  54.   public EventRecord parseLine(String line) throws IOException {
  55.     EventRecord retval = null;
  56.     if (line != null) {
  57.       // process line
  58.       String patternStr = "(" + dateformat + ")";
  59.       patternStr += "\s+";
  60.       patternStr += "(" + timeformat + ")";
  61.       patternStr += ".{4}\s(\w*)\s"; // for logLevel
  62.       patternStr += "\s*([\w+\.?]+)"; // for source
  63.       patternStr += ":\s+(.+)"; // for the message
  64.       Pattern pattern = Pattern.compile(patternStr);
  65.       Matcher matcher = pattern.matcher(line);
  66.       if (matcher.find(0) && matcher.groupCount() >= 5) {
  67.         retval = new EventRecord(hostname, ips, parseDate(matcher.group(1),
  68.             matcher.group(2)),
  69.     "HadoopLog",
  70.     matcher.group(3), // loglevel
  71.             matcher.group(4), // source
  72.             matcher.group(5)); // message
  73.       } else {
  74.         retval = new EventRecord();
  75.       }
  76.     }
  77.     return retval;
  78.   }
  79.   /**
  80.    * Parse a date found in the Hadoop log.
  81.    * 
  82.    * @return a Calendar representing the date
  83.    */
  84.   protected Calendar parseDate(String strDate, String strTime) {
  85.     Calendar retval = Calendar.getInstance();
  86.     // set date
  87.     String[] fields = strDate.split("-");
  88.     retval.set(Calendar.YEAR, Integer.parseInt(fields[0]));
  89.     retval.set(Calendar.MONTH, Integer.parseInt(fields[1]));
  90.     retval.set(Calendar.DATE, Integer.parseInt(fields[2]));
  91.     // set time
  92.     fields = strTime.split(":");
  93.     retval.set(Calendar.HOUR_OF_DAY, Integer.parseInt(fields[0]));
  94.     retval.set(Calendar.MINUTE, Integer.parseInt(fields[1]));
  95.     retval.set(Calendar.SECOND, Integer.parseInt(fields[2]));
  96.     return retval;
  97.   }
  98.   /**
  99.    * Attempt to determine the hostname of the node that created the
  100.    * log file. This information can be found in the STARTUP_MSG lines 
  101.    * of the Hadoop log, which are emitted when the node starts.
  102.    * 
  103.    */
  104.   private void findHostname() {
  105.     String startupInfo = Environment.runCommand(
  106.         "grep --max-count=1 STARTUP_MSG:\s*host " + file.getName()).toString();
  107.     Pattern pattern = Pattern.compile("\s+(\w+/.+)\s+");
  108.     Matcher matcher = pattern.matcher(startupInfo);
  109.     if (matcher.find(0)) {
  110.       hostname = matcher.group(1).split("/")[0];
  111.       ips = new String[1];
  112.       ips[0] = matcher.group(1).split("/")[1];
  113.     }
  114.   }
  115.   
  116.   /**
  117.    * Return a String with information about this class
  118.    * 
  119.    * @return A String describing this class
  120.    */
  121.   public String getInfo() {
  122.     return ("Hadoop Log Parser for file: " + file.getName());
  123.   }
  124. }