mapreduce清洗mysql_使用mapreduce对日志进行清洗

本文详细介绍了如何使用MapReduce对MySQL日志进行清洗,包括日志数据情况分析、数据清洗过程、MapReduce程序编写、定时任务设置等步骤。通过解析日志文件,过滤无效数据,最终实现对日志的有效清洗。
摘要由CSDN通过智能技术生成

一、数据情况分析

1.1 数据情况回顾

该论坛数据有两部分:

(1)历史数据约56GB,统计到2012-05-29。这也说明,在2012-05-29之前,日志文件都在一个文件里边,采用了追加写入的方式。

(2)自2013-05-30起,每天生成一个数据文件,约150MB左右。这也说明,从2013-05-30之后,日志文件不再是在一个文件里边。

图1展示了该日志数据的记录格式,其中每行记录有5部分组成:访问者IP、访问时间、访问资源、访问状态(HTTP状态码)、本次访问流量。

d88536d78dda0cbae15a5515c246246c.png

图1 日志记录数据格式

本次使用数据来自于两个2013年的日志文件,分别为access_2013_05_30.log与access_2013_05_31.log,下载地址为:http://pan.baidu.com/s/1pJE7XR9

1.2 要清理的数据

(1)根据前一篇的关键指标的分析,我们所要统计分析的均不涉及到访问状态(HTTP状态码)以及本次访问的流量,于是我们首先可以将这两项记录清理掉;

(2)根据日志记录的数据格式,我们需要将日期格式转换为平常所见的普通格式如20150426这种,于是我们可以写一个类将日志记录的日期进行转换;

(3)由于静态资源的访问请求对我们的数据分析没有意义,于是我们可以将"GET /staticsource/"开头的访问记录过滤掉,又因为GET和POST字符串对我们也没有意义,因此也可以将其省略掉;

二、数据清洗过程

2.1 定期上传日志至HDFS

首先,把日志数据上传到HDFS中进行处理,可以分为以下几种情况:

(1)如果是日志服务器数据较小、压力较小,可以直接使用shell命令把数据上传到HDFS中;

(2)如果是日志服务器数据较大、压力较大,使用NFS在另一台服务器上上传数据;

(3)如果日志服务器非常多、数据量大,使用flume进行数据处理;

这里我们的实验数据文件较小,因此直接采用第一种Shell命令方式。又因为日志文件时每天产生的,因此需要设置一个定时任务,在第二天的1点钟自动将前一天产生的log文件上传到HDFS的指定目录中。所以,我们通过shell脚本结合crontab创建一个定时任务techbbs_core.sh,内容如下:

#!/bin/sh

#step1.get yesterday format string

yesterday=$(date --date='1 days ago' +%Y_%m_%d)

#step2.upload logs to hdfs

hadoop fs -put /usr/local/files/apache_logs/access_${yesterday}.log /project/techbbs/data

结合crontab设置为每天1点钟自动执行的定期任务:crontab -e,内容如下(其中1代表每天1:00,techbbs_core.sh为要执行的脚本文件):

* 1 * * * techbbs_core.sh

验证方式:通过命令 crontab -l 可以查看已经设置的定时任务

2.2 编写MapReduce程序清理日志

(1)编写日志解析类对每行记录的五个组成部分进行单独的解析

48304ba5e6f9fe08f3fa1abda7d326ab.png

static class LogParser {

public static final SimpleDateFormat FORMAT = new SimpleDateFormat(

"d/MMM/yyyy:HH:mm:ss", Locale.ENGLISH);

public static final SimpleDateFormat dateformat1 = new SimpleDateFormat(

"yyyyMMddHHmmss");/**

* 解析英文时间字符串

*

* @param string

* @return

* @throws ParseException

*/

private Date parseDateFormat(String string) {

Date parse = null;

try {

parse = FORMAT.parse(string);

} catch (ParseException e) {

e.printStackTrace();

}

return parse;

}

/**

* 解析日志的行记录

*

* @param line

* @return 数组含有5个元素,分别是ip、时间、url、状态、流量

*/

public String[] parse(String line) {

String ip = parseIP(line);

String time = parseTime(line);

String url = parseURL(line);

String status = parseStatus(line);

String traffic = parseTraffic(line);

return new String[] { ip, time, url, status, traffic };

}

private String parseTraffic(String line) {

final String trim = line.substring(line.lastIndexOf("\"") + 1)

.trim();

String traffic = trim.split(" ")[1];

return traffic;

}

private String parseStatus(String line) {

final String trim = line.substring(line.lastIndexOf("\"") + 1)

.trim();

String status = trim.split(" ")[0];

return status;

}

private String p

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值