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

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

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

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


网站流量日志分析--数据预处理--点击流模型 pageviews 编程实现思路

为了更好的理解点击流模型 pageviews,我们需要画图来看一下MR程序处理它的思路流程。

打开画图板,重点要确定的是每个阶段的 pageviews pageviews 是什么,左边填写代理数据,通过之前的画图,我们知道 pageviews,模型数据它是来自于对原始数据的清理,所以它的思路数据就是原始保存的数据,但是需要我们注意,这组数据不是我们采集到的原始数据,而是刚才预处理器已处理过的数据。

 

所以在画图板上填写:清洗完的原始访问日志。接下来是两个阶段,分别是pageviews 阶段和 visit 阶段。

pageviews 阶段,我们需要知道它输入和输出的 k v。首先第一个,它输入的kv是不能确定的,k还是每行的偏移量,v是行内容。我们需要知道它输出的kv,要知道 maptask 的输出,正好是 reducetask 的输入。既然是 reducetask 的输入,需要根据什么进行聚合聚集,要把对应的字段设为k就可以了。此时,回到我们画图部分看一下,在我们介绍pageview模型数据就说过它所专注于用户会话识别,首先第一步需要找出属于同一个用户的所有访问日志记录,把我们的ip作为key

所以回到画图板上,我们确定了我们输入的keyv,也就是 maptask的输出,我们需要记住你的输出是我的输入。接着我们把三个方框的线都连向 reducetask。我们所描述的key指的是ipv对于我们来说,后边需要的数据是用户的时间,页面。针对其他的页面,如果我们需要可以都传递过去。v指的是 WebLogBean,我们把这样的keyv传递给 reducetask,我们整个的处理逻辑在 reducetask 中完成。我们把大量的kv传递给 reducetask 之后,我们需要kv写成,

<ip1,WebLogBean><ip1,WebLogBean><ip2,WebLogBean><ip1,WebLogBean>mr reducetask 阶段的属性,首先根据 key 进行排序分组,再合并组成一个新的kv,经过排序分组后,把三个相同的<ip1,WebLogBean>分为一组,<ip2,WebLogBean>分为一组,这正是我们所需要的,把同一个用户的所有记录分到一组中。在这一组当中,我们要把它的会话的识别和每一步的停留时间。合并到一组后,数据不是单单这样存在,而是会组装成一个新的kv队。例如<ip1,WebLogBean><ip1,WebLogBean><ip2,WebLogBean><ip1,WebLogBean>变成了<ip1,Iterable[WebLogBeanWebLogBeanWebLogBean]>。这样就完成了数据的分张,这样一个类型交给 reducetask 方法进行处理,这就是 mr 编程。

在这个过程中,我们需要完成针对识别以及我们所谓的每一步的停留时间,停留几步。为了方便,我们简单的填写一下模型的数据,例如,数据字段为:192.168.1.100   8:30:25   a.tml192.168.1.100   8:30:35  d.tml192.168.1.100   8:31:00   t.tml192.168.1.100   18:30:25  b.tml192.168.1.100   18:30:35  m.tml,这些数据以WebLogBean 形象存在于 Iterable 处理器中。此时我们需要找到属于同一个用户的所有访问日志记录,此时,需要在我们判断之前做一个排序,必须排序好之后才可以用下一个减上一个时间差判断,否则并不能做。

 image.png

问题1

如何给指定的一堆对象排序,根据指定的属性进行排序。这一堆对象都是WebLogBean 的实例,根据里面请求的时间正序排序。加法当中有一个集合的方法叫做Collection.sorts(list集合,Compareable排序规则)。这样我们就可以写一个伪代码,创建一个List 11=new ArrayList<WebLogBean>,再把这个集合交给 Collection 方法进行排序就可以解决。

排序之后,需要遍历集合,根据前后两条记录的时间差判断 session,包括页面停留时间。在我们遍历集合之后,我们需要考虑集合中大小可能有一个对象,也可能有多个对象。

如果只有一个对象,意味着它只有一条记录。例如上文中的<ip2,WebLogBean>,如果有三个对象,例如<ip1,WebLogBean>有三个记录。

它的记录至少一个,多的不知道,我们需要做一个判断,如果集合l1.size=1意味着该用户今天只访问了一个页面产生了一个会话后,就没在来。针对这种情况,很多的东西就不用我们计算,因为页面就一条记录,所以我们无法计算,所以会默认计算。针对只有1,我们默认直接输出即可。

如果l1.size>1,此时,需要去遍历,核心思想就是用下一条减去上一条。例如把192.168.1.100   8:30:25  a.tml192.168.1.100   8:30:35  d.tml192.168.1.100   8:31:00   t.tml192.168.1.100   18:30:25  b.tml192.168.1.100   18:30:35  m.tml粘贴复制下来,下边结合元素应该从0开始,从0-4总共五条记录,在循环时,当i=0 l1.get(i)提取我们的元素,这时我们拿到的是第一条记录,当我们拿到第一天记录后,无法计算数据。

页面第一条停留时间和下一条有非常大的关系,因为如果下一条和第一条是同一个会话,停留时间就是下一条减去上一条时间。如果两者不是同一个页面,停留时间就是默认60s,不用计算。此时我们发现,停留时间和下一条息息相关,在得到第一条记录时,我们不能够处理什么,也不能输入什么,所以直接跳过。

在加法当中,跳过单次循环,用i=0 l1.get(i) continuei=1 time(i)-time(i-1)判断第二条的时间是否小于30min8:30:35减去8:30:35刚好是10s,所以i=1 time(i)-time(i-1)<30min,因为他们属于同一个会话,所以此时我们应该输出上一步的数据,包括步骤号,页面和停留时间,停留时间就是下一步时间减去上一步时间。

例如:这里有步骤号 step,停留时间 steptime

step下方填写1steptime下方填写time(i)-time(i-1),因为35-25等于10秒钟,所以停留时间为10s。当i=2时,拿到的是我们第三条记录,还是要做一个操作time(i)-time(i-1),我们可以看见8:31:00-8:30:35=25s,所以time(i)-time(i-1)<30min,所以还是属于同一个会话,所以还是输出上一步的数据,包括步骤号,页面停留时间等。

所以step下面填写的是2staytime下面填写的是25秒。此时下面所填写的是关键,当i=3的时,time(i)-time(i-1)18:30:25减去8:31:00不用算,肯定是大于30分钟,所以time(i)-time(i-1)>30min,大于30分钟意味着从i=3 time(i)-time(i-1)>30min这个会话开始是一个新的会话开始。

上一个会话已经结束,因此这叫做输出上一步的数据,默认值指定停留时间。既然是从新的一个会话开始,就意味着步骤号等都是从新的开始,会重置step,重置sessionID。当step下面填写3时,staytime下面填写的时间是默认60秒钟,在我们筛选完之后,步骤号等都要重置。

i=4时,time(i)-time(i-1)<30min依旧是这样,还是需要输出上一步的数据,步骤号,页面停留时间等。但是,需要我们注意,在我们上一步输出之后,我们已经重置了step,重置了session,前面几步叫做session1的话,session2就从3开始,所以在step当中,step要从1开始,用18:30:35减去18:30:2510秒钟,所以staytime填写的是10s

最后一步默认输出自己的记录,I这条记录也被输出了,小于30分钟属于同一个记录,因此我们的步骤后在下面需要加1,停留时间就不能相减了,只能是默认的60秒。

此时我们会发现,按照这个思路就可以梳理成我们的pageviews模型数据,就识别了会话以及每次会话内访问了几步和每一步的停留时间。那么整个核心的逻辑在于我们当前这一步的时间减去上一步的时间判断时间差。若小于30分钟,意味着我们两个属于同一个会话,那么就是同一个会话的延续,若大于30分钟,就意味着是一个新的会话,把步骤号筛选,进行重置。

设置完之后这里又涉及到很多属性,数据以及数据是怎么输出的,回到mr数据图上,涉及到定位问题,reducetask输出,也要确定Kv的类型,此时就很单,我之前说过涉及到 多属性的传递,现在很方便,再创造一个编号pageviewsbean,创建这个编号之后,里面指定相关的属性,我们把对象输出就可以解决了。所以我们输毕竟的叫做 pageViewsbean,若v我们不确定,若这个v我们想不到,我们可以用nullWrite 来进行填充,这样我们就确定了。

Mr编程当中,每个阶段keyv指的是什么?

这一段逻辑数据排理逻辑,的没有模型。要想搞清楚我们刚才的逻辑,首先要了解我们的 pageviews 模型侧重于什么概念,需要哪些指标,再根据这些指标业务模型,了解如何过mr编程,加法的一些程序得到这样的模型,这就是我们处理pageviews的一个具体实验思路,有了这个思路,我们去编写mr代码就会变得异常简单。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
191 6
|
2月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
本文介绍了PyTorch中的F.softmax()和F.log_softmax()函数的语法、参数和使用示例,解释了它们在进行归一化处理时的作用和区别。
515 1
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
|
2月前
|
SQL 存储 人工智能
阿里云日志服务的傻瓜式极易预测模型
预测服务有助于提前规划,减少资源消耗和成本。阿里云日志服务的AI预测服务简化了数学建模,仅需SQL操作即可预测未来指标,具备高准确性,并能处理远期预测。此外,通过ScheduledSQL功能,可将预测任务自动化,定时执行并保存结果。
94 3
|
7月前
|
C++ 开发者 Python
实现Python日志点击跳转到代码位置的方法
本文介绍了如何在Python日志中实现点击跳转到代码位置的功能,以提升调试效率。通过结合`logging`模块的`findCaller()`方法记录代码位置信息,并使用支持点击跳转的日志查看工具(如VS Code、PyCharm),开发者可以从日志直接点击链接定位到出错代码,加快问题排查。
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
57 2
|
4月前
|
jenkins 持续交付
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
|
2月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
283 0
|
2月前
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
|
5月前
|
Python
Python编程实战:利用闭包与装饰器优化日志记录功能
【7月更文挑战第7天】Python的闭包和装饰器简化了日志记录。通过定义如`log_decorator`的装饰器,可以在不修改原函数代码的情况下添加日志功能。当@log_decorator用于`add(x, y)`函数时,调用时自动记录日志。进一步,`timestamp_log_decorator`展示了如何创建特定功能的装饰器,如添加时间戳。这些技术减少了代码冗余,提高了代码的可维护性。
76 1
|
6月前
|
JSON 中间件 数据格式
Gin框架学习笔记(六)——gin中的日志使用
Gin框架学习笔记(六)——gin中的日志使用
285 0