日志清洗案例
数据
[infobox title="简单解析版"]
去除日志中字段长度小于等于11的日志。
[successbox title="ruaMap01"]
package com.kami.demo02;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* @version v 1.0
* @Author kamisamak
* @Date 2020/6/15
*/
public class ruaMap01 extends Mapper<LongWritable, Text, Text, NullWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] sps = line.split(" ");
if (sps.length > 11) {
context.getCounter("map", "true").increment(1);
context.write(new Text(line),NullWritable.get());
}else {
context.getCounter("map","false").increment(1);
}
}
}
[/successbox]
[successbox title="ruaDriver01"]
package com.kami.demo02;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
/**
* @version v 1.0
* @Author kamisamak
* @Date 2020/6/15
*/
public class ruaDriver01 {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
job.setJarByClass(ruaDriver01.class);
FileInputFormat.setInputPaths(job,new Path("data\\d02\\rua01.txt"));
FileOutputFormat.setOutputPath(job,new Path("output\\d05"));
job.setMapperClass(ruaMap01.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
job.waitForCompletion(true);
}
}
[/successbox]
[/infobox]
[infobox title="复杂解析版"]
对web访问日志中的各字段识别切分
去除日志中不合法的记录
根据统计需求,生成各类访问请求过滤数据
[successbox title="定义的一个日志类,用来记录日志数据中的各数据字段"]
package com.kami.demo02;
/**
* @version v 1.0
* @Author kamisamak
* @Date 2020/6/15
*/
public class ruaLogBean02 {
private String remote_addr;// 记录客户端的ip地址
private String remote_user;// 记录客户端用户名称,忽略属性"-"
private String time_local;// 记录访问时间与时区
private String request;// 记录请求的url与http协议
private String status;// 记录请求状态;成功是200
private String body_bytes_sent;// 记录发送给客户端文件主体内容大小
private String http_referer;// 用来记录从那个页面链接访问过来的
private String http_user_agent;// 记录客户浏览器的相关信息
private boolean valid = true;// 判断数据是否合法
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(this.valid);
sb.append("\001").append(this.remote_addr);
sb.append("\001").append(this.remote_user);
sb.append("\001").append(this.time_local);
sb.append("\001").append(this.request);
sb.append("\001").append(this.status);
sb.append("\001").append(this.body_bytes_sent);
sb.append("\001").append(this.http_referer);
sb.append("\001").append(this.http_user_agent);
return sb.toString();
}
public String getRemote_addr() {
return remote_addr;
}
public void setRemote_addr(String remote_addr) {
this.remote_addr = remote_addr;
}
public String getRemote_user() {
return remote_user;
}
public void setRemote_user(String remote_user) {
this.remote_user = remote_user;
}
public String getTime_local() {
return time_local;
}
public void setTime_local(String time_local) {
this.time_local = time_local;
}
public String getRequest() {
return request;
}
public void setRequest(String request) {
this.request = request;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getBody_bytes_sent() {
return body_bytes_sent;
}
public void setBody_bytes_sent(String body_bytes_sent) {
this.body_bytes_sent = body_bytes_sent;
}
public String getHttp_referer() {
return http_referer;
}
public void setHttp_referer(String http_referer) {
this.http_referer = http_referer;
}
public String getHttp_user_agent() {
return http_user_agent;
}
public void setHttp_user_agent(String http_user_agent) {
this.http_user_agent = http_user_agent;
}
public boolean isValid() {
return valid;
}
public void setValid(boolean valid) {
this.valid = valid;
}
public ruaLogBean02() {
}
public ruaLogBean02(String remote_addr, String remote_user, String time_local, String request, String status, String body_bytes_sent, String http_referer, String http_user_agent, boolean valid) {
this.remote_addr = remote_addr;
this.remote_user = remote_user;
this.time_local = time_local;
this.request = request;
this.status = status;
this.body_bytes_sent = body_bytes_sent;
this.http_referer = http_referer;
this.http_user_agent = http_user_agent;
this.valid = valid;
}
}
[/successbox]
[successbox title="ruaDriver02"]
package com.kami.demo02;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
/**
* @version v 1.0
* @Author kamisamak
* @Date 2020/6/15
*/
public class ruaDriver02 {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
job.setJarByClass(ruaDriver02.class);
FileInputFormat.setInputPaths(job,new Path("data\\d02\\rua01.txt"));
FileOutputFormat.setOutputPath(job,new Path("output\\d06"));
job.setMapperClass(ruaMapper02.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
job.waitForCompletion(true);
}
}
[/successbox]
[successbox title="ruaMapper02"]
package com.kami.demo02;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* @version v 1.0
* @Author kamisamak
* @Date 2020/6/15
*/
public class ruaMapper02 extends Mapper {
Text k = new Text();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] sps = line.split(" ");
ruaLogBean02 ruaLogBean = new ruaLogBean02();
if (sps.length > 11) {
context.getCounter("map", "true").increment(1);
ruaLogBean.setRemote_addr(sps[0]);
ruaLogBean.setRemote_user(sps[1]);
ruaLogBean.setTime_local(sps[3].substring(1));
ruaLogBean.setRequest(sps[6]);
ruaLogBean.setStatus(sps[8]);
ruaLogBean.setBody_bytes_sent(sps[9]);
ruaLogBean.setHttp_referer(sps[10]);
if (sps.length > 12) {
ruaLogBean.setHttp_user_agent(sps[11] + " "+ sps[12]);
}else {
ruaLogBean.setHttp_user_agent(sps[11]);
}
if (Integer.parseInt(ruaLogBean.getStatus()) >= 400) {
ruaLogBean.setValid(false);
}
}else {
ruaLogBean.setValid(false);
context.getCounter("map","false").increment(1);
}
k.set(ruaLogBean.toString());
context.write(k,NullWritable.get());
}
}
[/successbox]
[/infobox]
题目来源:https://www.cnblogs.com/frankdeng/p/9255766.html
Comments NOTHING