Hadoop分析tomcat访问日志

今天照着《hadoop实战》写了个小例子,解析tomcat日志统计各个浏览器的访问次数

 

Java代码   收藏代码
  1. package com.ice.stat;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.regex.Matcher;  
  5. import java.util.regex.Pattern;  
  6.   
  7. import org.apache.hadoop.fs.Path;  
  8. import org.apache.hadoop.io.IntWritable;  
  9. import org.apache.hadoop.io.Text;  
  10. import org.apache.hadoop.mapreduce.Job;  
  11. import org.apache.hadoop.mapreduce.Mapper;  
  12. import org.apache.hadoop.mapreduce.Reducer;  
  13. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  14. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  15.   
  16. public class TomcatLog{  
  17.       
  18.     static class TomcatMapper extends Mapper<Object, Text, Text, IntWritable> {  
  19.   
  20.         private static final IntWritable one = new IntWritable(1);  
  21.         private static Pattern pattern = Pattern.compile("([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),(.*)");  
  22.           
  23.         protected void map(Object key, Text value,   
  24.                   Context context) throws IOException ,InterruptedException {  
  25.               
  26.             String line = value.toString();  
  27.             System.out.println(line);  
  28.             Matcher m = pattern.matcher(line);  
  29.             if(m.matches()){  
  30.                 String agent = m.group(9).toLowerCase();  
  31.                 if(agent.contains("chrome")){  
  32.                     agent = "chrome";  
  33.                 }else if(agent.contains("safari")){  
  34.                     agent = "safari";  
  35.                 }else if(agent.contains("firefox")){  
  36.                     agent = "firefox";  
  37.                 }else{  
  38.                     agent = "other";  
  39.                 }  
  40.                 Text t = new Text(agent);     
  41.                 context.write(t, one);  
  42.             }  
  43.         };  
  44.           
  45.     }  
  46.       
  47.     static class TomcatReducer extends Reducer<Text, IntWritable, Text, IntWritable>{  
  48.         protected void reduce(Text key, java.lang.Iterable<IntWritable> value, org.apache.hadoop.mapreduce.Reducer<Text,IntWritable,Text,IntWritable>.Context context) throws IOException ,InterruptedException {  
  49.             int count = 0;  
  50.             for(IntWritable v : value){  
  51.                 count = count + v.get();  
  52.             }  
  53.             context.write(key, new IntWritable(count));  
  54.         };  
  55.     }  
  56.       
  57.     public static void main(String[] args) throws Exception {  
  58.         if(args.length != 2){  
  59.             System.err.println("参数个数不对");  
  60.             System.exit(-1);  
  61.         }  
  62.         Job job = new Job();  
  63.         job.setJarByClass(TomcatLog.class);  
  64.           
  65.         FileInputFormat.addInputPath(job, new Path(args[0]));  
  66.         FileOutputFormat.setOutputPath(job, new Path(args[1]));  
  67.           
  68.         job.setMapperClass(TomcatMapper.class);  
  69.         job.setReducerClass(TomcatReducer.class);  
  70.         job.setOutputKeyClass(Text.class);  
  71.         job.setOutputValueClass(IntWritable.class);  
  72.         System.exit(job.waitForCompletion(true) ? 0 : 1);  
  73.           
  74.     }   
  75.   
  76. }  

 

日志样例:

Tomcat日志代码   收藏代码
  1. 172.16.2.12,-,-,[06/Sep/2011:10:03:13 +0800],GET /icestat/jpivot/toolbar/sort-asc-up.png HTTP/1.1,200,336,-,Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2)  
  2. 172.16.2.12,-,-,[06/Sep/2011:09:48:17 +0800],GET /icestat/ HTTP/1.1,200,171,http://10.65.11.241:8080/icestat/,Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.43 Safari/534.24  

 

把日志放入hdfs

命令行代码   收藏代码
  1. hadoop fs -put icestat_access_log.2011-09-06.txt icestat_access_log.2011-09-06.txt  

 分析日志

命令行代码   收藏代码
  1. hadoop jar tomcatLog.jar icestat_access_log.2011-09-06.txt output6  

 查看输出

命令行代码   收藏代码
  1. [root@xxx hadoop-0.20.2]# hadoop fs -cat output6/part-r-00000  
  2. 11/09/06 00:18:54 WARN conf.Configuration: DEPRECATED: hadoop-site.xml found in the classpath. Usage of hadoop-site.xml is deprecated. Instead use core-site.xml, mapred-site.xml and hdfs-site.xml to override properties of core-default.xml, mapred-default.xml and hdfs-default.xml respectively  
  3. 11/09/06 00:18:54 WARN fs.FileSystem: "xxx :9000" is a deprecated filesystem name. Use "hdfs://xxx :9000/" instead.  
  4. 11/09/06 00:18:54 WARN fs.FileSystem: "xxx :9000" is a deprecated filesystem name. Use "hdfs://xxx :9000/" instead.  
  5. 11/09/06 00:18:54 WARN fs.FileSystem: "xxx :9000" is a deprecated filesystem name. Use "hdfs://xxx :9000/" instead.  
  6. chrome  58  
  7. firefox 23  
  8. other   49  
  9. safari  5  

 

http://dsbjoe.iteye.com/blog/1166698

你可能感兴趣的:(Hadoop分析tomcat访问日志)