Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

news/2024/5/20 6:25:59/文章来源:https://blog.csdn.net/weixin_30952103/article/details/97736208

Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html

网站日志分析项目案例(二)数据清洗:当前页面

网站日志分析项目案例(三)统计分析:http://www.cnblogs.com/edisonchou/p/4464349.html

一、数据情况分析

1.1 数据情况回顾

  该论坛数据有两部分:

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

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

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

log

图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)编写日志解析类对每行记录的五个组成部分进行单独的解析

复制代码
    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 parseURL(String line) { final int first = line.indexOf("\""); final int last = line.lastIndexOf("\""); String url = line.substring(first + 1, last); return url; } private String parseTime(String line) { final int first = line.indexOf("["); final int last = line.indexOf("+0800]"); String time = line.substring(first + 1, last).trim(); Date date = parseDateFormat(time); return dateformat1.format(date); } private String parseIP(String line) { String ip = line.split("- -")[0].trim(); return ip; } }
复制代码

  (2)编写MapReduce程序对指定日志文件的所有记录进行过滤

  Mapper类:

复制代码
        static class MyMapper extendsMapper<LongWritable, Text, LongWritable, Text> {LogParser logParser = new LogParser(); Text outputValue = new Text(); protected void map( LongWritable key, Text value, org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, LongWritable, Text>.Context context) throws java.io.IOException, InterruptedException { final String[] parsed = logParser.parse(value.toString()); // step1.过滤掉静态资源访问请求 if (parsed[2].startsWith("GET /static/") || parsed[2].startsWith("GET /uc_server")) { return; } // step2.过滤掉开头的指定字符串 if (parsed[2].startsWith("GET /")) { parsed[2] = parsed[2].substring("GET /".length()); } else if (parsed[2].startsWith("POST /")) { parsed[2] = parsed[2].substring("POST /".length()); } // step3.过滤掉结尾的特定字符串 if (parsed[2].endsWith(" HTTP/1.1")) { parsed[2] = parsed[2].substring(0, parsed[2].length() - " HTTP/1.1".length()); } // step4.只写入前三个记录类型项 outputValue.set(parsed[0] + "\t" + parsed[1] + "\t" + parsed[2]); context.write(key, outputValue); } }
复制代码

  Reducer类:

复制代码
    static class MyReducer extendsReducer<LongWritable, Text, Text, NullWritable> {protected void reduce( LongWritable k2, java.lang.Iterable<Text> v2s, org.apache.hadoop.mapreduce.Reducer<LongWritable, Text, Text, NullWritable>.Context context) throws java.io.IOException, InterruptedException { for (Text v2 : v2s) { context.write(v2, NullWritable.get()); } }; }
复制代码

  (3)LogCleanJob.java的完整示例代码

View Code

  (4)导出jar包,并将其上传至Linux服务器指定目录中

2.3 定期清理日志至HDFS

  这里我们改写刚刚的定时任务脚本,将自动执行清理的MapReduce程序加入脚本中,内容如下:

#!/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
#step3.clean log data
hadoop jar /usr/local/files/apache_logs/mycleaner.jar /project/techbbs/data/access_${yesterday}.log /project/techbbs/cleaned/${yesterday}

  这段脚本的意思就在于每天1点将日志文件上传到HDFS后,执行数据清理程序对已存入HDFS的日志文件进行过滤,并将过滤后的数据存入cleaned目录下。 

2.4 定时任务测试

  (1)因为两个日志文件是2013年的,因此这里将其名称改为2015年当天以及前一天的,以便这里能够测试通过。

  (2)执行命令:techbbs_core.sh 2014_04_26

  控制台的输出信息如下所示,可以看到过滤后的记录减少了很多:

15/04/26 04:27:20 INFO input.FileInputFormat: Total input paths to process : 1
15/04/26 04:27:20 INFO util.NativeCodeLoader: Loaded the native-hadoop library
15/04/26 04:27:20 WARN snappy.LoadSnappy: Snappy native library not loaded
15/04/26 04:27:22 INFO mapred.JobClient: Running job: job_201504260249_0002
15/04/26 04:27:23 INFO mapred.JobClient: map 0% reduce 0%
15/04/26 04:28:01 INFO mapred.JobClient: map 29% reduce 0%
15/04/26 04:28:07 INFO mapred.JobClient: map 42% reduce 0%
15/04/26 04:28:10 INFO mapred.JobClient: map 57% reduce 0%
15/04/26 04:28:13 INFO mapred.JobClient: map 74% reduce 0%
15/04/26 04:28:16 INFO mapred.JobClient: map 89% reduce 0%
15/04/26 04:28:19 INFO mapred.JobClient: map 100% reduce 0%
15/04/26 04:28:49 INFO mapred.JobClient: map 100% reduce 100%
15/04/26 04:28:50 INFO mapred.JobClient: Job complete: job_201504260249_0002
15/04/26 04:28:50 INFO mapred.JobClient: Counters: 29
15/04/26 04:28:50 INFO mapred.JobClient: Job Counters
15/04/26 04:28:50 INFO mapred.JobClient: Launched reduce tasks=1
15/04/26 04:28:50 INFO mapred.JobClient: SLOTS_MILLIS_MAPS=58296
15/04/26 04:28:50 INFO mapred.JobClient: Total time spent by all reduces waiting after reserving slots (ms)=0
15/04/26 04:28:50 INFO mapred.JobClient: Total time spent by all maps waiting after reserving slots (ms)=0
15/04/26 04:28:50 INFO mapred.JobClient: Launched map tasks=1
15/04/26 04:28:50 INFO mapred.JobClient: Data-local map tasks=1
15/04/26 04:28:50 INFO mapred.JobClient: SLOTS_MILLIS_REDUCES=25238
15/04/26 04:28:50 INFO mapred.JobClient: File Output Format Counters
15/04/26 04:28:50 INFO mapred.JobClient: Bytes Written=12794925
15/04/26 04:28:50 INFO mapred.JobClient: FileSystemCounters
15/04/26 04:28:50 INFO mapred.JobClient: FILE_BYTES_READ=14503530
15/04/26 04:28:50 INFO mapred.JobClient: HDFS_BYTES_READ=61084325
15/04/26 04:28:50 INFO mapred.JobClient: FILE_BYTES_WRITTEN=29111500
15/04/26 04:28:50 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=12794925
15/04/26 04:28:50 INFO mapred.JobClient: File Input Format Counters
15/04/26 04:28:50 INFO mapred.JobClient: Bytes Read=61084192
15/04/26 04:28:50 INFO mapred.JobClient: Map-Reduce Framework
15/04/26 04:28:50 INFO mapred.JobClient: Map output materialized bytes=14503530
15/04/26 04:28:50 INFO mapred.JobClient: Map input records=548160
15/04/26 04:28:50 INFO mapred.JobClient: Reduce shuffle bytes=14503530
15/04/26 04:28:50 INFO mapred.JobClient: Spilled Records=339714
15/04/26 04:28:50 INFO mapred.JobClient: Map output bytes=14158741
15/04/26 04:28:50 INFO mapred.JobClient: CPU time spent (ms)=21200
15/04/26 04:28:50 INFO mapred.JobClient: Total committed heap usage (bytes)=229003264
15/04/26 04:28:50 INFO mapred.JobClient: Combine input records=0
15/04/26 04:28:50 INFO mapred.JobClient: SPLIT_RAW_BYTES=133
15/04/26 04:28:50 INFO mapred.JobClient: Reduce input records=169857
15/04/26 04:28:50 INFO mapred.JobClient: Reduce input groups=169857
15/04/26 04:28:50 INFO mapred.JobClient: Combine output records=0
15/04/26 04:28:50 INFO mapred.JobClient: Physical memory (bytes) snapshot=154001408
15/04/26 04:28:50 INFO mapred.JobClient: Reduce output records=169857
15/04/26 04:28:50 INFO mapred.JobClient: Virtual memory (bytes) snapshot=689442816
15/04/26 04:28:50 INFO mapred.JobClient: Map output records=169857
Clean process success!

  (3)通过Web接口查看HDFS中的日志数据:

  存入的未过滤的日志数据:/project/techbbs/data/

  存入的已过滤的日志数据:/project/techbbs/cleaned/

 

转载于:https://www.cnblogs.com/1130136248wlxk/p/4975169.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_812896.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tp5不启用伪静态_SEO优化中动态页面、静态页面和伪静态页面哪个好?

对于什么是网站的动态页面和静态页面&#xff0c;以及它们之间的区别&#xff0c;本文来介绍一下&#xff0c;在做SEO优化时&#xff0c;挑选动态页面、静态页面和伪静态页面哪个好?我们先来简单总结一下&#xff0c;它们各自的优缺点&#xff1a;1. 静态页面拜访最快;但由于数…

python tornado部署_Python:Tornado 第四章:Tornado网站部署:第二节:静态文件

静态文件下载是大多数网站必备的功能&#xff0c;与静态文件相关的开发工作有两类&#xff1a;配置静态文件路径和优化静态文件访问。1、配置静态文件路径配置静态文件路径的目的在于为客户端提供静态文件的可访问性。Tornado提供了两种方式进行配置静态文件URL路径与服务器本地…

服务器稳定对页面的排名很重要,如何解决网站打开速度太慢了的问题?

网站打开速度太慢了&#xff1f;不知道大家在开一个网站的时候是否有注意过自己的行为&#xff0c;如果一个网站你等待了好久它都没有打开&#xff0c;那么你这时候是否还会继续等待呢&#xff1f;在大量的数据统计下&#xff0c;可以让我们看到越来越多的用户浏览行为&#xf…

复制黏贴上传excel文件到网站

假如有一个excel文件&#xff0c;想把里面的内容传到网站上去。 可以利用JSON.stringify() 把空格和换行等字符转换为 escape sequence。如&#xff1a; 这就转换成了escape sequnence 但这个方法目前只支持到 IE8 FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafariBa…

使用Visual Studio建立网站项目

使用Visual Studio建立网站项目 第一步、依次点击文件->新建->项目&#xff08;不是网站&#xff09; 第二步、选择要新建的项目类型 在下图中把易错的地方已经圈出来了&#xff0c;注意不要选择其他的&#xff0c;选择空Web应用程序&#xff0c;否则会出现一堆没用的文…

dataframe 如何增加新的索引_如何为网站增加索引,促进网站SEO优化?

众所周知&#xff0c;索引量是百度判断网站搜索引擎优化的标准之一&#xff0c;一般情况下&#xff0c;索引量越多&#xff0c;网站页面被索引的几率就会越大&#xff0c;网站的排名提升也将有更大的机会&#xff0c;那么在网站优化中&#xff0c;该如何为网站增加索引呢&#…

linux smb 远程,测试过程、扩展研究 - Linux系统下用smbclient命令来访问Windows共享_Linux教程_Linux公社-Linux系统门户网站...

基本测试过程如下&#xff1a;1、 访问c$共享&#xff1a;[rootrh root]# smbclient //192.168.60.188/c$ -U cmwPassword:smb: \> cd winntsmb: \winnt\>2、 访问temp共享(启用guest帐户)[rootrh root]# smbclient //192.168.60.188/tempPassword:(未输入任何密码)smb: …

asp.net html5网站结构,ASP.NET MVC5网站开发之展示层架构(五)

展示层由Ninesky.Web项目实现&#xff0c;负责网站内容的显示&#xff0c;项目包含Member和Control两个区域。Member区域实现网站内容的管理&#xff0c;Control区域实现网站系统管理。结构、功能图如下&#xff1a;一、Member区域1、添加Member区域Ninesky.Web【右键】-> 添…

黑帽SEO

黑帽SEO由来已久&#xff0c;虽然是所有搜索引擎打击的对象&#xff0c;但是在推动搜索引擎进步的历程中功不可没。搜索引擎算法在进步&#xff0c;黑帽SEO手法更是魔高一丈&#xff0c;在信息爆炸的今天&#xff0c;常见的黑帽手法有哪些呢&#xff1f;站长们应当使用白帽SEO手…

《大型网站系统与JAVA中间件实践》读书笔记-数据访问层

数据访问层 5.1.2数据库垂直/水平拆分的困难 随着网站业务的快速发展&#xff0c;数据量和访问量不断上升&#xff0c;数据库的压力越来越大。 更换更好的硬件&#xff08;Scale Up)是一种解决方案&#xff0c;而且在我们能付得起硬件费用并且没 有到达硬件单机瓶颈时&#xff…

阿里云linux服务器搭建宝塔到建站的第一步

这些天公司要备案就买了个服务器&#xff0c;想学点东西就玩了一下&#xff0c;自己期间也遇到一些问题 首先我选择的服务器是默认推荐的那种最便宜的 买了就看见有一个实例&#xff1a;如图 那么接下来点击管理就要重置一下密码为后面登录&#xff1a; 选择重置密码改为自己的…

可以获得索引值码_搜索引擎seo推广的优缺点

现在搜索引擎seo推广是最为受青睐的营销方式&#xff0c;所谓的SEO是由英文Search Engine Optimization缩写而来&#xff0c;翻译为“搜索引擎优化”。拓王朝表示SEO就是通过对网站内部和外部的优化&#xff0c;改进网站在搜索引擎中的排名表现&#xff0c;从而使网站获得更多的…

推荐几个高质量的图片素材网站

阿里巴巴矢量图标库 http://iconfont.cn 国内功能很强大且图标内容很丰富的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能。 高品图像 http://www.gaopinimages.com 网站设计高端大气&#xff0c;资源丰富。拥有千万张高清图片&#xff0c;摄影作品/历史照…

2021年高清卫星影像DEM数据免费下载,3款软件4个网站推荐给你

在上大学时听老师过一句话“一入遥感深似海&#xff0c;从此数据永相随” 不过不仅遥感处理需要各种数据来练习学习&#xff0c;整个测绘地信行业在工作中也需要各种数据来辅助项目处理。没办法&#xff0c;做数据处理就是要一直跟各种数据打交道。 说到工作中的一些数据&…

给自己的网站加上HTTPS

前言 现在谷歌等厂商大力推行https协议&#xff0c;如果你的网站不支持https&#xff0c;在使用谷歌浏览器时&#xff0c;会被警告网站不安全。w(&#xff9f;Д&#xff9f;)w&#xff0c;不安全&#xff1f;哪里不安全了&#xff1f;OK&#xff0c;那我改成支持https好吧。关…

「三个页面」主题网站设计精髓

2003年小林在湖北一个简单的主题网站&#xff0c;可谓麻雀虽小&#xff0c;五脏俱全&#xff0c;虽只涉及首页、索引页和内容页这种所谓「三个页面」设计思想&#xff0c;但却集合了简单 Web 设计之精髓。首页涉及美工设计、用户交互以及内容布局等&#xff0c;主要版块则有导航…

网站用户行为日志采集和后台日志服务器搭建

原文地址: 网站用户行为日志采集和后台日志服务器搭建 1.简介 网站流量数据统计分析&#xff0c;可以帮助网站管理员、运营人员、推广人员等实时获取网站流量信息&#xff0c;并从流量来源、网站内容、网站访客特性等多方面提供网站分析的数据依据。从而帮助提高网站流量&…

python脚本跑SQLlib靶场_网站自动化脚本的实操

流量生意永不过时&#xff0c;无论哪个渠道&#xff0c;获客成本都是越来越高。我最熟悉的流量获取就是百度搜索&#xff0c;所以近期正在实现关于网站的一些自动化脚本。一、关键词拓展免费的主要来源于关键词规划师、百度相关推荐词。关键词规划师可以直接导出Excel&#xff…

linux未找到服务器,解决linux下命令找不到问题_网站服务器运行维护

linux查看日志出现中文乱码_网站服务器运行维护linux查看日志出现中文乱码的解决方法是&#xff1a;1、首先执行【locale -a】命令&#xff0c;查看服务器支持编码&#xff1b;2、然后执行【vi /etc/sysconfig/il8n】命令&#xff0c;修改服务器编码为【zh_CN.UTF-8】即可。错误…