hadoop日志分析系统二 第二部分利用hadoop平台进行数据处理 第一种方式 mapreduce方式

直接通过mapreduce进行处理,把分析的结果存放到多个文件中,或者关系型数据库中去,以被用户查看

具体实现:

publicstaticvoid main(String[] args)throws Exception{

      Job job = new Job(new Configuration(), HeiMaCount.class.getSimpleName());

      job.setInputFormatClass(TextInputFormat.class);

      FileInputFormat.setInputPaths(job,new Path("读取文件的位置"));

      job.setMapperClass(MyMapper.class);

      job.setMapOutputKeyClass(Text.class);

      job.setMapOutputValueClass(Text.class);

      job.setReducerClass(MyReducer.class);

      job.setOutputKeyClass(Text.class);

      job.setOutputValueClass(Text.class);

      job.setOutputFormatClass(TextOutputFormat.class);

      FileOutputFormat.setOutputPath(job,new Path("输出文件位置,可以设置成linux系统下的文件"));

      job.waitForCompletion(true);

   }

/**统计NewUV

* 对访问member.php?mod=register的不同ip,求和

* 1,通过map,把含有的记录,写到k2,v2中

* 其中,k2ip,v2是包含的内容。

* 3,使用条件"member.php?mod=register"去重,使用计数器统计数量。

* */

staticclass MyMapperextends Mapper<LongWritable, Text, Text, Text>{

      protectedvoid map(LongWritable key, Text value, org.apache.hadoop.mapreduce.Mapper<LongWritable,Text,Text,Text>.Context context) throws java.io.IOException ,InterruptedException {

         String[] values = value.toString().split("- -");

         String ip = values[0];

         String con = values[1];

         //统计PV,通过分析可以发现含有.php和.html的是一个访问页面。

         if(con.contains(".php")||con.contains(".html")){

            //获取计数器

            final Counter counter = context.getCounter("Count Group","Count PV");

            counter.increment(1l);

            //System.out.println("PVip="+ip);

         }       

         context.write(new Text(ip),new Text(con));//输出k2,v2共reduce使用

      };

   }

   /**

    * 约的数据进行处理

    * @author root

    */

   staticclass MyReducerextends Reducer<Text, Text,Text,Text>{

      protectedvoid reduce(Text key, Iterable<Text> values, Context context)

            throws IOException, InterruptedException{       

         int oneIp = 0;

         long maxTime =Long.MIN_VALUE;

         long minTime = Long.MAX_VALUE;

         long accessTime = Long.MIN_VALUE;

         String vip = "";        

         final SimpleDateFormat sdf =new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss",Locale.ENGLISH);       

         //因为相同key只会调用一次reduce,所以说,一个ip只能调用一个reduce,这样就能统计独立的ip

         final Counter counter1 = context.getCounter("Conut Group","Count aloney IP");

         counter1.increment(1l);

         //System.out.println("独立ip "+key.toString());

         //通过找value中的key判断。

         for (Text text : values) {

            oneIp += 1;

            //获取新访客数

            if(text.toString().contains("member.php?mod=register")){

               final Counter counter = context.getCounter("Count Group","Conut NewUV");

               counter.increment(1l);

               //System.out.println("ip="+key.toString());

               break;

            }          

            //=================获取一个ip访问的开始时间和结束时间。单位毫秒 =================

               //获取事件字符串

               String dateStr = text.toString().substring(2, 22);//获取的格式dd/MMM/yyyy:HH:mm:ss

               try {

                  final Date date = sdf.parse(dateStr);

                  Long time = date.getTime();//获取毫秒

                  if(time>maxTime){

                     maxTime = time;

                  }

                  if(time<minTime){

                     minTime = time;

                  }

               } catch (ParseException e) {

                  e.printStackTrace();

               }

            //=================平均访问时长/访问页数 =================

         }       

         //结束循环,就可以知道max的最大值和最小值了。

         accessTime = (maxTime-minTime)/1000;

         if(accessTime>5*60){

            vip = " vip";

         }       

         if(oneIp==1){

            final Counter counter2 = context.getCounter("Count Group","Count oneIP");

            counter2.increment(1l);

            //System.out.println("oneIP="+key.toString());

         }

         context.write(key, new Text(accessTime+"\t"+vip));//输出k3,v3即真正想要的结果

         //★★★★打开jdbc链接,往数据库的表里插入数据(key即ip,accessTime即用户停留时间,vip即是否是vip的标志),关闭链接

      }    

   }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值