开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第二阶段):网站流量日志分析--数据预处理--点击流模型 pageviews 编程实现思路】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/694/detail/12193
网站流量日志分析--数据预处理--点击流模型 pageviews 编程实现思路
为了更好的理解点击流模型 pageviews,我们需要画图来看一下MR程序处理它的思路流程。
打开画图板,重点要确定的是每个阶段的 pageviews 是 pageviews 是什么,左边填写代理数据,通过之前的画图,我们知道 pageviews,模型数据它是来自于对原始数据的清理,所以它的思路数据就是原始保存的数据,但是需要我们注意,这组数据不是我们采集到的原始数据,而是刚才预处理器已处理过的数据。
所以在画图板上填写:清洗完的原始访问日志。接下来是两个阶段,分别是pageviews 阶段和 visit 阶段。
在 pageviews 阶段,我们需要知道它输入和输出的 k 和 v。首先第一个,它输入的k和v是不能确定的,k还是每行的偏移量,v是行内容。我们需要知道它输出的k和v,要知道 maptask 的输出,正好是 reducetask 的输入。既然是 reducetask 的输入,需要根据什么进行聚合聚集,要把对应的字段设为k就可以了。此时,回到我们画图部分看一下,在我们介绍pageview模型数据就说过它所专注于用户会话识别,首先第一步需要找出属于同一个用户的所有访问日志记录,把我们的ip作为key。
所以回到画图板上,我们确定了我们输入的key和v,也就是 maptask的输出,我们需要记住你的输出是我的输入。接着我们把三个方框的线都连向 reducetask。我们所描述的key指的是ip,v对于我们来说,后边需要的数据是用户的时间,页面。针对其他的页面,如果我们需要可以都传递过去。v指的是 WebLogBean,我们把这样的key和v传递给 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[WebLogBean,WebLogBean,WebLogBean]>
。这样就完成了数据的分张,这样一个类型交给 reducetask 方法进行处理,这就是 mr 编程。
在这个过程中,我们需要完成针对识别以及我们所谓的每一步的停留时间,停留几步。为了方便,我们简单的填写一下模型的数据,例如,数据字段为:192.168.1.100 8:30:25 a.tml,192.168.1.100 8:30:35 d.tml,192.168.1.100 8:31:00 t.tml,192.168.1.100 18:30:25 b.tml,192.168.1.100 18:30:35 m.tml
,这些数据以WebLogBean 形象存在于 Iterable 处理器中。此时我们需要找到属于同一个用户的所有访问日志记录,此时,需要在我们判断之前做一个排序,必须排序好之后才可以用下一个减上一个时间差判断,否则并不能做。
问题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.tml,192.168.1.100 8:30:35 d.tml,192.168.1.100 8:31:00 t.tml,192.168.1.100 18:30:25 b.tml,192.168.1.
100
18:30:35 m.tml
粘贴复制下来,下边结合元素应该从0开始,从0-4总共五条记录,在循环时,当i=0 l1.get(i)
提取我们的元素,这时我们拿到的是第一条记录,当我们拿到第一天记录后,无法计算数据。
页面第一条停留时间和下一条有非常大的关系,因为如果下一条和第一条是同一个会话,停留时间就是下一条减去上一条时间。如果两者不是同一个页面,停留时间就是默认60s,不用计算。此时我们发现,停留时间和下一条息息相关,在得到第一条记录时,我们不能够处理什么,也不能输入什么,所以直接跳过。
在加法当中,跳过单次循环,用i=0 l1.get(i) continue;i=1 time(i)-time(i-1)
判断第二条的时间是否小于30min,8:30:35减去8:30:35刚好是10s,所以i=1 time(i)-time(i-1)<30min
,因为他们属于同一个会话,所以此时我们应该输出上一步的数据,包括步骤号,页面和停留时间,停留时间就是下一步时间减去上一步时间。
例如:这里有步骤号 step,停留时间 steptime。
在step下方填写1,steptime下方填写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下面填写的是2,staytime下面填写的是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:25是10秒钟,所以staytime填写的是10s。
最后一步默认输出自己的记录,I这条记录也被输出了,小于30分钟属于同一个记录,因此我们的步骤后在下面需要加1,停留时间就不能相减了,只能是默认的60秒。
此时我们会发现,按照这个思路就可以梳理成我们的pageviews模型数据,就识别了会话以及每次会话内访问了几步和每一步的停留时间。那么整个核心的逻辑在于我们当前这一步的时间减去上一步的时间判断时间差。若小于30分钟,意味着我们两个属于同一个会话,那么就是同一个会话的延续,若大于30分钟,就意味着是一个新的会话,把步骤号筛选,进行重置。
设置完之后这里又涉及到很多属性,数据以及数据是怎么输出的,回到mr数据图上,涉及到定位问题,reducetask输出,也要确定Kv的类型,此时就很单,我之前说过涉及到 多属性的传递,现在很方便,再创造一个编号pageviewsbean,创建这个编号之后,里面指定相关的属性,我们把对象输出就可以解决了。所以我们输毕竟的叫做 pageViewsbean,若v我们不确定,若这个v我们想不到,我们可以用nullWrite 来进行填充,这样我们就确定了。
在Mr编程当中,每个阶段key和v指的是什么?
这一段逻辑数据排理逻辑,的没有模型。要想搞清楚我们刚才的逻辑,首先要了解我们的 pageviews 模型侧重于什么概念,需要哪些指标,再根据这些指标业务模型,了解如何过mr编程,加法的一些程序得到这样的模型,这就是我们处理pageviews的一个具体实验思路,有了这个思路,我们去编写mr代码就会变得异常简单。