直接通过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中
* 其中,k2是ip,v2是包含的内容。
* 3,使用条件"member.php?mod=register"去重,使用计数器统计数量。
* */
staticclass MyMapperextends Mapper
protectedvoid map(LongWritable key, Text value, org.apache.hadoop.mapreduce.Mapper
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
protectedvoid reduce(Text key, Iterable
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 = 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的标志),关闭链接
}
}