Hadoop网站日志数据清洗——正则表达式实现

news/2024/5/13 8:40:21/文章来源:https://blog.csdn.net/weixin_30338461/article/details/95218866

    周旭龙前辈的Hadoop学习笔记—网站日志分析项目案例简明、经典,业已成为高校大数据相关专业的实验项目。上周博主也完成了这个实验,不同于周前辈使用特殊符号切割字符串得到数据的做法,博主使用了正则表达式来匹配数据。在此将我的思路及代码张贴出来,以供后来者学习借鉴。

 

一、数据情况分析

    1.1、数据格式概览

        本次实验数据来自于国内某论坛,数据以行为单位,每行记录由5部分组成,访问者IP、访问时间、访问资源、访问状态、访问流量。

    1.2、所需的数据

        按照实验教程,我们只需要IP、时间、uri即可,不过本着既能完成实验,又能锻炼锻炼的想法,我把发个文状态以及访问流量也提取了出来。

    1.3、上传数据至HDFS

        本次试验到手的数据大小为60MB,约60万行。数据量较小,因此直接使用shell命令上传至HDFS。

    注:欲知更详细的项目背景,请点击Hadoop学习笔记—网站日志分析项目案例(一)项目介绍__周旭龙_博客园

    

二、数据清洗准备

    2.1、日志解析类

        将解析日志信息的功能抽象成为一个日志解析类,分别解析各字段信息。

        2.1.1 各字段的正则表达式

            IP位于行的开头,因此定位到行起始位置,向右读取字符,直到遇到空格。又因为一个有效的IP最少为四个数字+三个符号,7位;最大为3*4+3,15位。所以行起始处7~15位为IP。表达式为:'^\S{7,15}'

            时间位于一个方括号内,直接提取方括号内的数据即可:'\[.*?\]'

            URI及其相关数据与时间数据位置类似,都在成对符号之内,因此可用相同的解法将其提取出来,再做下一步分析:'\".*?\"'

            状态码只有三位数,且两边都是空格,可以吧两边的空格也提出来,再去掉:' \d{3} '

            流量在行尾,也都是数字:'\d{1,6}$'

        2.1.2 函数

            除了一个parse函数以及五个分别处理字段的函数外,正则表达式匹配也抽象成了一个函数。需要注意的是匹配是否为空,以及匹配uri并将其分割为数组后下标取值是否越界。

  1. public class parseLine {  
  2.     public String[] parse(String line)  
  3.     {  
  4.         String ip = parseIP(line);  
  5.         String time = parseTime(line);  
  6.         String url = parseURL(line);  
  7.         String status = parseStatus(line);  
  8.         String traffic = parseTraffic(line);  
  9.         return new String[] {ip,time,url,status,traffic};  
  10.     }  
  11.     private String parseReg(String reg,String str)  
  12.     {  
  13.         Pattern pat = Pattern.compile(reg);  
  14.         Matcher matcher = pat.matcher(str);  
  15.         boolean rs = matcher.find();  
  16.         if(rs)  
  17.             return matcher.group(0);  
  18.         else  
  19.             return "null";  
  20.     }  
  21.     private String[] splitUrl(String str)  
  22.     {  
  23.         String []urlInfo = str.substring(1, str.length()-1).split(" ");  
  24.         return urlInfo;  
  25.     }  
  26.     private String parseTraffic(String line) {  
  27.         String reg_ip = "\\d{1,6}$";  
  28.         return parseReg(reg_ip,line);  
  29.     }  
  30.     private String parseStatus(String line) {  
  31.         String reg_ip = " \\d{3} ";  
  32.         return parseReg(reg_ip,line).trim();  
  33.     }  
  34.     private String parseURL(String line) {  
  35.         String reg_ip = "\".*?\"";  
  36.         String str = parseReg(reg_ip,line);  
  37.         String[] urlInfo = splitUrl(str);  
  38.         return urlInfo[1];  
  39.     }  
  40.     private String parseTime(String line) {  
  41.         String reg_ip = "\\[.*?\\]";  
  42.         String str = parseReg(reg_ip,line);  
  43.         SimpleDateFormat in=new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss ZZZZZ]",Locale.US);   
  44.         SimpleDateFormat out=new SimpleDateFormat("yyyyMMdd HHmmss");   
  45.         Date d = new Date();  
  46.         try  
  47.         {  
  48.             d=in.parse(str);   
  49.         }  
  50.         catch (ParseException e)  
  51.         {   
  52.             e.printStackTrace();  
  53.         }  
  54.         return out.format(d).trim();  
  55.     }  
  56.     private String parseIP(String line) {  
  57.         String reg_ip = "^\\S{7,15}";  
  58.         return parseReg(reg_ip,line);  
  59.     }  
  60. }  

 

    2.2、Mapper类

        map阶段的输入为<偏移量,一行文本>,输出为<偏移量,处理后的数据>。再这个类中,对数据的有效性判断也在这儿,博主只过滤了静态数据。

  1. public class logMap extends Mapper<LongWritable,Text,LongWritable,Text>{  
  2.     static parseInfo parseLine = new parseInfo();  
  3.     protected void map(LongWritable key1,Text value1,Context context) throws IOException,InterruptedException  
  4.     {  
  5.         String str1 = value1.toString();  
  6.         Text output = new Text();  
  7.         final String[] info = parseLine.parse(str1);  
  8.         if(info[2].startsWith("/static") || info[2].startsWith("/uc_server"))  
  9.             return ;  
  10.         StringBuilder result = new StringBuilder();  
  11.         for(String x:info)  
  12.             result.append(x).append("\t");  
  13.         output.set(result.toString());  
  14.         context.write(key1, output);  
  15.     }  
  16. }  

 

    2.3、Reducer类

        reduce阶段的输入与map的输出有关,为<偏移量,处理后数据的集合>,输出则为<处理后的数据,空>。

  1. public class logReducer extends Reducer<LongWritable,Text,Text,NullWritable>{  
  2.     protected void reduce(LongWritable k3,Iterable<Text> v3,Context context) throws IOException,InterruptedException{  
  3.         for(Text v3s : v3)  
  4.             context.write(v3s, NullWritable.get());  
  5.     }  
  6. }  

    2.4、主函数

  1. public class logMain {  
  2.     public static void main(String[] args) throws Exception{  
  3.         Job job = Job.getInstance(new Configuration());  
  4.         job.setJarByClass(logMain.class);  
  5.         job.setMapperClass(logMap.class);  
  6.         job.setMapOutputKeyClass(LongWritable.class);  
  7.         job.setMapOutputValueClass(Text.class);  
  8.         job.setReducerClass(logReducer.class);  
  9.         job.setOutputKeyClass(Text.class);  
  10.         job.setOutputValueClass(NullWritable.class);  
  11.         FileInputFormat.setInputPaths(job, new Path(args[0]));  
  12.         FileOutputFormat.setOutputPath(job, new Path(args[1]));  
  13.         job.waitForCompletion(true);  
  14.     }  
  15. }  

 

三、数据清洗

    将编写好的MR到处导出为jar包后,在hadoop中用小规模的测试用例试运行,成功后再用实验数据。

    结果如下:

 

 

注:完整项目

    Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

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

    Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

转载于:https://www.cnblogs.com/magicxyx/p/10216814.html

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

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

相关文章

网站开发流程以及HTML5简介(八)

2019独角兽企业重金招聘Python工程师标准>>> 第一大原因&#xff1a; 它是未来&#xff0c;开始用吧&#xff01; 最大的原因今天你就开始使用HTML5是因为它是未来&#xff0c;不要掉队了&#xff01;HTML5不会往每个方向发展&#xff0c;但是更多的元素已经被很多公…

编写python爬虫采集彩票网站数据,将数据写入mongodb数据库

1.准备工作&#xff1a; 1.1安装requests: cmd >> pip install requests 1.2 安装lxml: cmd >> pip install lxml 1.3安装wheel: cmd >> pip install wheel 1.4 安装xlwt: cmd >> pip install xlwt 1.5 安装pymongo: cmd >> pip install pymon…

中国电信北京研究院发布“2016年上半年网站安全报告”

提要&#xff1a;中国电信北研院副院长陈运清在致辞中表示&#xff0c;信息安全已经上升到国家战略高度&#xff0c;随着“互联网”时代到来&#xff0c;以及互联网新业务和新技术的快速发展&#xff0c;信息安全防护的要求越来越高。中国电信充分利用遍布全网的智能管道、丰富…

.NET也有春天及高性能网站架构实践

.NET也有春天及高性能网站架构实践 在本次专访之前&#xff0c;笔者一直都对.NET这个平台有所偏见&#xff0c;或者说是看不到.NET的优势&#xff0c;对Java Web、PHP、Ruby等更加看好&#xff0c;而之后SSH、RoR、LAMP等的流行也让笔者对这个观点更加坚信。然而在浏览完赵桂华…

推荐8个超棒的学习 jQuery 的网站

推荐8个超棒的学习 jQuery 的网站 根据国外科技网站 W3Techs 一项调查了近100万个网站数据显示&#xff0c;jQuery是目前最流行的 JavaScript 库。对于初学者来说&#xff0c;有的时候很难找到一个好的学习jQuery的网站&#xff0c;所以本文收集了8个很棒的 jQuery 学习网站推…

自学宝典:10个学习Android开发的网站推荐

自学宝典&#xff1a;10个学习Android开发的网站推荐 1. Android Developers 作为一个Android开发者&#xff0c;官网的资料当然不可错过&#xff0c;从设计&#xff0c;培训&#xff0c;指南&#xff0c;文档&#xff0c;都不应该错过&#xff0c;在以后的学习过程中慢慢理…

利用squid反向代理提高网站性能

利用squid反向代理提高网站性能本文在介绍 squid 反向代理的工作原理的基础上&#xff0c;指出反向代理技术在提高网站访问速度&#xff0c;增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下&#xff0c;利用 DNS 轮询和 Squid 反向代理技术&#xff0c;实现了…

MalwareMustDie关闭博客网站 抗议NSA利用恶意软件攻击公共机构

近期&#xff0c;国外一篇博客披露&#xff0c;著名的反恶意软件组织MalwareMustDie决定关闭其博客网站&#xff0c;以抗议NSA&#xff08;美国国家安全局&#xff09;利用黑客工具入侵无辜国家的教育和公共服务器。 文章指出&#xff0c;Shadow Brokers&#xff08;影子经纪人…

阿里云 配置网站 安装nginx 访问不了公网ip

转载自&#xff1a;https://blog.csdn.net/LJFPHP/article/details/78670459 一、开始找原因 在浏览器输入&#xff1a;http://ip&#xff0c;正常的话&#xff0c;会有页面&#xff0c;welcome to nginx 我这里是浏览器访问失败&#xff0c; 查找原因&#xff1a; 1、在服…

asp.net免费网站三剑客:WebMatrix + MojoPortal + SQLCE

一个免费发布软件&#xff0c;一个免费CMS&#xff08;内容管理系统&#xff09;&#xff0c;一个免费数据库&#xff0c;正好完成一个免费软件的部署。大致过程&#xff1a;1. 先从这里找到MojoPortal的CE版本&#xff1a;http://mojoportal.codeplex.com/releases/view/64508…

用户体验分析:以 “师路南通网站” 为例

作业目标&#xff1a; 对比UMU学习平台、学生安全教育平台&#xff0c;针对师路南通&#xff0c;开展UX分析。基于实例分析&#xff0c;体会用户体验设计的7条准则 作业要求&#xff1a; 基于我们列出的 7 条UX评价准则&#xff0c;分析“师路南通” 在用户体验设计方面让你觉得…

基于阿里云服务器搭建网站

前面写了《基于PHP搭建网站开发环境》的三节内容&#xff0c;主要用于PC端开发/调试/测试网站所需要搭建的开发环境。当然&#xff0c;最重要的还是网站开发成功之后&#xff0c;如何让很多人通过外网连接到网站呢&#xff1f; 1、服务器&#xff1a;服务器选择的是阿里云的&a…

阿里云建站的基本流程

1. 云服务器 ECS 1.1 概述 云服务器ECS实例&#xff0c;即阿里云服务器&#xff0c;以下简称 ECS 实例。 1.2 创建 ECS 实例 1.2.1 购买 ECS 实例 在阿里云官网找到&#xff1a;产品->云计算基础服务->弹性计算->云服务器 ECS 。 在购买之前可以领取阿里云优惠劵哦…

阿里云建站云企业官网标准版/高级版/尊贵版功能对比及选择方法

阿里云建站云企业官网标准版、高级版和尊贵版有什么区别&#xff1f;云集市场网分享阿里云建站定制云企业官网版本功能区别亮点及选择方法&#xff1a; 云企业官网标准版/高级版/尊贵版对比 阿里云建站云企业官网定制分为标准版、高级版和尊贵版三个版本&#xff0c;云集市场…

最全面的WordPress建站教程,零基础30分钟学会建站

宝塔面板添加WordPress站点 一、建站准备条件 条件1&#xff1a;阿里云服务器一台。原则上有台服务器就好了&#xff0c;不过我一般喜欢用大品牌&#xff0c;稳定和安全。条件2&#xff1a; 阿里云域名一个。在哪家买的服务器&#xff0c;就用哪家的域名&#xff0c;反之&…

快来建造自己的网站吧,阿里云免费教程哦

主要亮点&#xff1a; 亮点一&#xff1a;标配阿里云空间&#xff0c;无需技术&#xff0c;会打字就会建网站 亮点二&#xff1a;选定模板&#xff0c;预置1000套精美网站模板&#xff0c;覆盖上百行业&#xff0c;随意切换&#xff0c;简单修改&#xff0c;网站- 即可上线&am…

没有使用面板的云服务器(手动搭建环境的云服务器)备份网站文件和数据库的命令及教程

对于使用了面板&#xff08;如宝塔面板&#xff09;的云服务器来说&#xff0c;备份网站文件和数据库相当简单&#xff0c;但是没有使用面板的云服务器&#xff08;手动搭建环境的云服务器&#xff09;备份数据就稍显麻烦了&#xff0c;前几日有一朋友让我帮忙备份一下&#xf…

使用宝塔面板搭建WordPress网站(图文教程)

使用宝塔面板搭建WordPress网站 图片来自宝塔官网 现在搭建一个自己的网站已经不是一件难事了&#xff0c;有出色的WordPress程序&#xff0c;有价格实惠的云服务器&#xff0c;有像七牛云这种对草根站长友好的云存储服务&#xff0c;还有像宝塔面板这类易操作的面板&#xff…

阿里云建站全教程:域名注册/云服务器/环境搭建详细流程

小白如何创建网站部署环境&#xff1f;建立一个网站需要多少钱呢&#xff1f;笔者分享 个人/企业建网站的基本步骤和流程。从域名购买解析、到云服务器购买搭建环境&#xff0c;最后到上传程序&#xff0c;具体教程如下&#xff1a; 第一步、注册域名 进入&#xff08;万网官…

NET温故而知新学习系列之网站安全技术—web.config加密和解密

NET温故而知新学习系列之网站安全技术—web.config加密和解密 我们为什么要对web.config配置文件中的配置节加密&#xff1f; 因为在我们的项目中&#xff0c;有的配置节可能包含敏感信息&#xff0c;我们看下面的<connectionStrings/>配置节中包含了我们连接数据库的用户…