HADOOP 处理 NGINX 日志

这种统计可以用计数器完成,以下代码没什么业务逻辑,纯属实验 

Java代码   收藏代码
  1. package cn.liangc.hadoop.nmr;  
  2.   
  3. import java.io.IOException;  
  4. import java.text.ParseException;  
  5. import java.text.SimpleDateFormat;  
  6. import java.util.Date;  
  7. import java.util.HashMap;  
  8. import java.util.Locale;  
  9. import java.util.Map;  
  10.   
  11. import org.apache.hadoop.conf.Configurable;  
  12. import org.apache.hadoop.conf.Configuration;  
  13. import org.apache.hadoop.fs.FileStatus;  
  14. import org.apache.hadoop.fs.FileSystem;  
  15. import org.apache.hadoop.fs.Path;  
  16. import org.apache.hadoop.fs.PathFilter;  
  17. import org.apache.hadoop.io.IntWritable;  
  18. import org.apache.hadoop.io.LongWritable;  
  19. import org.apache.hadoop.io.Text;  
  20. import org.apache.hadoop.mapreduce.Job;  
  21. import org.apache.hadoop.mapreduce.Mapper;  
  22. import org.apache.hadoop.mapreduce.Reducer;  
  23. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;  
  24. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  
  25.   
  26. /** 
  27.  * 测试输入数据格式:  
  28.  * ...  
  29.  * 183.60.212.153 - - [19/Feb/2013:10:23:29 +0800] "GET /o2o/media.html?menu=3 HTTP/1.1" 200 16691 "-" "Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)" 
  30.  * ... 
  31.  * 输出数据格式 
  32.  * ... 
  33.  * 日期   独立IP个数 
  34.  * ... 
  35.  * @author liangchuan 
  36.  */  
  37. public class NginxAccessLogMR {  
  38.   
  39.     public static class Map01 extends Mapper<LongWritable, Text, Text, Text> {  
  40.         private Date getDateByValue(String vs) throws ParseException {  
  41.             String date = vs.substring(vs.indexOf("["), vs.indexOf("]") + 1);  
  42.             SimpleDateFormat format = new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss Z]", Locale.US);  
  43.             Date d = format.parse(date);  
  44.             return d;  
  45.         }  
  46.   
  47.         @Override  
  48.         protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {  
  49.             try {  
  50.                 String vs = value.toString();  
  51.                 String[] arr = vs.split("- -");  
  52. //              String k = arr[0].trim();// IP  
  53.                 String v = arr[1].trim();// others  
  54.                 Date d = getDateByValue(vs);// DATE  
  55.                 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");  
  56.                 Text k = new Text(f.format(d));  
  57.                 // 以日期分组  
  58.                 context.write(k, new Text(vs));  
  59.             } catch (Exception e) {  
  60.                 System.out.println("MAPPER ++++++++++++++++++++++++++"+e.getMessage());  
  61.             }  
  62.         }  
  63.     }  
  64.   
  65.     public static class Reduce01 extends Reducer<Text, Text, Text, IntWritable> {  
  66.           
  67.         @Override  
  68.         protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {  
  69.             Map<String,String> m = new HashMap<String,String>();  
  70.             for(Text value : values){  
  71.                 String vs = value.toString();  
  72.                 String[] arr = vs.split("- -");  
  73.                 String ip = arr[0].trim();// IP  
  74.                 m.put(ip, "");  
  75.             }  
  76.             System.out.println("RRRRRRR <><> "+m);  
  77.             context.write(key, new IntWritable(m.size()));  
  78.         }  
  79.     }  
  80.   
  81.     /** 
  82.      * 文件名过滤 
  83.      *  
  84.      * @author liangchuan 
  85.      *  
  86.      */  
  87.     public static class MyPathFilter implements PathFilter, Configurable {  
  88.         Configuration conf = null;  
  89.         FileSystem fs = null;  
  90.   
  91.         @Override  
  92.         public Configuration getConf() {  
  93.             return this.conf;  
  94.         }  
  95.   
  96.         @Override  
  97.         public void setConf(Configuration conf) {  
  98.             this.conf = conf;  
  99.         }  
  100.   
  101.         @Override  
  102.         public boolean accept(Path path) {  
  103.             try {  
  104.                 fs = FileSystem.get(conf);  
  105.                 FileStatus fileStatus = fs.getFileStatus(path);  
  106.                 if (!fileStatus.isDir()) {  
  107.                     String fileName = path.getName();  
  108.                     if (!fileName.contains(conf.get("pathfilter.pattern"))) {  
  109.                         return true;  
  110.                     }  
  111.                 }  
  112.             } catch (IOException e) {  
  113.                 System.out.println("MyPathFilter ++++++++++++++++++++++++++");  
  114.                 e.printStackTrace();  
  115.             }  
  116.             return false;  
  117.         }  
  118.     }  
  119.   
  120.     public static void main(String[] args) {  
  121.   
  122.         // JobConf conf = new JobConf(MaxTptr.class);  
  123.         Job job = null;  
  124.         try {  
  125.             job = new Job();  
  126.             job.setJarByClass(NginxAccessLogMR.class);  
  127.               
  128.             FileInputFormat.addInputPath(job, new Path(args[0]));  
  129.             FileOutputFormat.setOutputPath(job, new Path(args[1]));  
  130.               
  131.             job.setMapperClass(Map01.class);  
  132.             job.setReducerClass(Reduce01.class);  
  133.                 
  134.             /** 
  135.              * map 的输出如果跟 reduce 的输出不一致则必须要做此步配置,否则会按照 reduce 的输出进行默认 
  136.              */  
  137.             job.setMapOutputKeyClass(Text.class);  
  138.             job.setMapOutputValueClass(Text.class);  
  139.               
  140.             job.setOutputKeyClass(Text.class);  
  141.             job.setOutputValueClass(IntWritable.class);  
  142.   
  143.             // 第三个参数是要过滤的文件名关键字,默认error  
  144.             String pfk = args.length > 2 ? args[2] : "error";  
  145.             job.getConfiguration().set("pathfilter.pattern", pfk);  
  146.             FileInputFormat.setInputPathFilter(job, MyPathFilter.class);  
  147.   
  148.             System.exit(job.waitForCompletion(true) ? 0 : 1);  
  149.         } catch (IOException e) {  
  150.             e.printStackTrace();  
  151.         } catch (InterruptedException e) {  
  152.             e.printStackTrace();  
  153.         } catch (ClassNotFoundException e) {  
  154.             e.printStackTrace();  
  155.         }  
  156.   
  157.     }  
  158.   
  159. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值