网站流量日志分析--数据预处理--点击流模型 pageviews 代码实现| 学习笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习网站流量日志分析--数据预处理--点击流模型 pageviews 代码实现

开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第二阶段)网站流量日志分析--数据预处理--点击流模型 pageviews 代码实现】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/694/detail/12194


网站流量日志分析--数据预处理--点击流模型 pageviews 代码实现

内容介绍:

一、概述

二、maptask 阶段的逻辑处理

三、reducetask 阶段的逻辑处理

四、for 循环遍历集合

五、回顾总结

 

一、概述

下面结合代码了解上节课所画的 pageviews 编程实现图如何落实到代码层面,整个编程依旧通过 maptask60框架来完成。

打开编译器,边有一个文件夹的目录pageviews,首先写入一个类ClicKeyStreamPageView,类当中的内容即为核心流程,里面有 maptask reducetask 以及运行的主类方法。

maptask 过程中并没有处理太多的数据,所完成的事情是:当处理原始日志即清洗完的原始访问日志,读取一行,提取IP作为T,然后把这一行内容进行传递即可。

 

二、maptask 阶段的逻辑处理

maptask 阶段并没有进行太多的业务逻辑处理。代码中读取一行内容,把这一行内容首先转换成字符串类型,然后按照\001进行切割,要特别强调在清洗完成数据之后,数据之间的字段是以\01不可见分隔符来分隔的,此时数据非常规整,有利于解析,可以直接通过\001进行切割,切割完成后变成一个字符串的一个数组,然后进行判断,如果数组的长度小于9直接 return,它的字段连九个都不满足的,是一些非法的、不合规的数据。

接下来创建了一个VV就是外部log v对应的对对象对象,把刚才切割数当中的每一个字段,按照它对应的顺序进行填充即可,这时发现以\001切割的字段填充将会变得非常的方便,填充完成之后,按照正常逻辑把 IP 作为 Keyey,把对对象作为V输出即可,但额外加了一个小小的校验,叫做v.isValidValid是一个自定义的布尔类型,打开 weblogbean,发现Valid是一个布尔类型,叫做判断数据是否合法,即在此做了一个数据有效性的判断,也是为了维护有效的数据,才能进行后续的处理,无效数据连if循环都无法进入,更不会输出。如果数据有效,然后获取它的remote address,把它的ID作为Key,把对对象作为V输出即可,对应讲义上画图的这一段逻辑。

 

三、reducetask 阶段的逻辑处理

在整个 maptask 阶段,没有进行太多的操作,因此整个 ideab 的梳理重点放在了reducetask 阶段,接下来回到代码中,继续往下梳理。

首先写了一个内部的静态类去继承 reducetaskr,要做的事很明确,首先要把这一组的遍历拿出来放在一个集合当中,然后把集合作为参数传给方法进行排序,并且在排序的时候指定排序规则。

逻辑思路清晰之后,才能清楚明白地写入代码、读懂代码。带着思路回到代码中,首先使用了 ArrayList 的集合,集合里面承载的是 weblogbeanweblogbean 对应一条记录,即一个对象的实例。接下来,首先采用对象复制的方式,把internal迭代器当中的对象遍历出来,然后添加到集合当中,相当于提取这一组用户的所有记录,把记录保存在 Array 集合当中,然后把集合作为参数放在 collection 当中进行排序,在排序的时候利用了 comparator 的接口,根据对象当中的时间排序。

因为在梳理会话的时候,需要判断前后两条记录的时间差,该时间差不是拿两条数据进行随意计算的,必须要有顺序,如果没有顺序,最终的结果没有任何意义,Java 中当中提供了一个排序工具即 comparator 的接口,可以发现之前的comparator 方法,接口使用的是匿名类不类的形式,一个接口的实例传入的两个对象都是 weblogbean 实例,首先 oe get 时间,or 也去获取时间,然后转为data类型,而data类型属于Java基本类型,针对它做一个判断可以发现如果当中有一个为空,则返回零,不进行判断,最终判断d1 compareTod(2)进行默认比较,即比较正序,如果比其小返回负数,如果比其大返回正数,如果两者相等就返回零,这样就可以把集合当中的对象按照访问时间的正序进行排序,这一步很重要。

 

四、for 循环遍历集合

排序完成之后,接下来的操作代码虽然很多,但是逻辑非常单一,就是所说的for循环遍历集合,判断前后两条的时间差,它的核心标准就是用下一步的时间减去上一步的时间,判断是否小于30分钟,以此来作为分界线。

首先定义一个变量叫做step=1,然后设置一个会话 sessionsession 是用UUID生成的,session 叫做会话的标识,在企业当中会话的标识通常要求不能重复。

如果张三访问后产生的会话为session1,李四访问的会话也叫session1,后面根据会话来识别,就丧了失意义,因此通过 UUID 生成的 session应该是不会重复的。

接下来针对集合进行for循环,i=0开始,i<beans.size,i++,如果它的集合size=1,刚才画图中说过,如果等于1意味着它只有一条记录,这时候直接默认输出,直接去设置相关的属性,包括它的session号、以及刚才生成的停留时间等等。当只有一条数据的时候,它的停流时间是写死的60秒,因为只有一步的时候无法计算两个数据的时间差即停流时间。其他字段就是进入字段写入,写完之后要把session ID重置。

当只有一条处理完之后,for循环就不需要运行了,所以这里有一个break跳转,跳出整体循环,表示后面的for循环就不用操作了,已经纪律了用户的会话,整个逻辑结束。如果它的size不等于一,if语句就不会运行,也就会运行接下来的代码。

回到画板中查看,如果size不等于1,表示至少有两条,这时候需要进行一个判断,当取到第一条的时候,直接continue跳转不处理,即当不等于1的时候跳过第一条不输出,遍历第二条的时候再输出上一条。这里隐藏了一个Java语法,分别是breakcontinuecontinue表示跳出单次循环,break表示跳出整体循环。跳出之后,i=1,核心的步骤就是用当前这一步的时间和上一步(i-1)的时间做time dif操作,即计算时间差,拿到这一步的时间和上一步时间进行相减,时间差解出来之后,是一个浪费型的值,单位是毫秒,判断它是不是小于30分钟,如果时间差小于30分钟,走一个循环,默认属于同一个会话,如果不小于30分钟,是另一个循环。如果下一步减上一步的时间小于30分钟,直接输出上一步的记录,输出的都是i-1均是上一条的记录。

需要强调的是这里的时间差就是两个相减除以1000,因为它是毫秒除以1000变成秒。接下来把step进行++。如果没有小于三分钟,而是大于三分钟,走S语句,走S语句时候输出之后还要注意把 step session 进行重置,这段代码呼应了画图中的当 i=3的时候,在输出上一步之后,把步骤号和session号做一个重置。

最后就是当拿到最后一条记录的时候,直接默认输出,因为最后一条也无法计算页面停留时间,直接默认写死60秒钟。整个逻辑代码的虽然很多,但是逻辑异常清晰,就是画图当中所写的这一段,核心思想就是要想得到是否统一是否属于同一个,要得到下一步的时间减去上一步时间,以时间差来做为判断。

写完之后就是运行主类 may 方法了,也就是比较逻辑,检查代码是成功与否。要注意 pageviews 程序,它的输入应该是上一个清洗完之后的输出路径。打开D盘,刚才输出来的路径在>这台电赔>LENOVO(D:)>weblog>output路径下,把路径复制过来作为输入路径,输出是在这个路径下,这时用本地模式右键运行一下,检查处理的数据到底符不符合规范,右键选择 run 完成运行,本地模式的代码计算相对来说会比较快,当然如果数据比较大,在企业当中建议把程序打成架包,在架构上进行执行,计算完毕,通过状态码查看其退出为0,应该是计算成功了,打开输出路径进行查看,选择 pageviews 当中 success 标识表示计算成功,右键打开part0-r-0000,可以发现当中的数据变得异常清晰。第一个字段数就是所谓的session ID,可以发现相同的 session,比如有四条记录都是C9F,均是rr用户,后面具体的操作共有四个步骤,第一步停留在六秒,第二步停留在196秒,然后是71秒再到60秒,所以就是每一步和每一步的停留时间,可以想像显示的最后一步都是默认的60秒。访问五步的同样如此,停留时间依次是25026454660秒既然是属于同一种,它们的会话ID都一样,都是5a181

 

五、回顾总结

这样就完成了点击流模型 pageviews 的实现,再次来回顾总结。pageviews 模型注重于会话的识别和每次会话类访问的几步和每一步的停留时间,需要做到是找出会话,标上动作后计算时间差。例如有五步,把这五步用点串起来,串成一条线,就变成点击流模型了,这就是pageviews模型代码的具体实现,结合画图来梳理代码逻辑。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
存储 Java 关系型数据库
基于JSP的九宫格日志网站
基于JSP的九宫格日志网站
|
8月前
|
监控 安全 前端开发
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
103 0
|
2月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
409 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
21天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
3月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
352 3
|
5月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
147 3
|
1月前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
3月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1724 14
|
2月前
|
存储 监控 安全
什么是日志管理,如何进行日志管理?
日志管理是对IT系统生成的日志数据进行收集、存储、分析和处理的实践,对维护系统健康、确保安全及获取运营智能至关重要。本文介绍了日志管理的基本概念、常见挑战、工具的主要功能及选择解决方案的方法,强调了定义管理目标、日志收集与分析、警报和报告、持续改进等关键步骤,以及如何应对数据量大、安全问题、警报疲劳等挑战,最终实现日志数据的有效管理和利用。
138 0
|
3月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
47 0