欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hadoop离线数据分析平台实战——370外链信息分析

程序员文章站 2022-05-27 22:40:54
...

Hadoop离线数据分析平台实战——370外链信息分析

项目进度

模块名称 完成情况
用户基本信息分析(MR)� 完成
浏览器信息分析(MR) 完成
地域信息分析(MR) 完成
外链信息分析(MR) 未完成
用户浏览深度分析(Hive) 未完成
订单分析(Hive) 未完成
事件分析(Hive) 未完成

外链信息分析规则

和地域信息分析一样,在外链分析系统中,
我们也只是统计活跃用户、总会话以及跳出会话这三个指标的数据。
其中活跃用户和总会话个数和地域分析一样,采用uuid和sid的去重数量来表示,
也就是分别将去重后的uuid个数和去重后的sid个数作为外链分析模块中的活跃用户和总会话指标。
区别在于计算跳出会话。


外链维度信息(不考虑平台platform和日期date),
我们需要统计两个层面的数据,即:all、具体外链。
也就是说需要分别统计这两个维度的活跃用户、总会话以及跳出会话个数。
同以前的维度信息不一样,在这里外链维度采用完全确定的模式,
也就是说在运行过程中,代码中不会涉及到外链信息的插入。

需要原始数据:referrer url、uuid、u_sd、serverTime、platform这五个维度的字段信息,
所以在当前只有pc端数据和后台服务端数据的情况下,只需要对pageview事件的数据进行统计计算就可以了。


活跃用户和总会话的统计规则就是统计去重后的uuid和sid的个数。
这里主要介绍下,统计跳出会话的个数。
详见..\文档\外链信息分析-跳出会话计算规则.txt
统计的最终数据保存到表:
stats_inbound表的active_users、sessions以及bounce_sessions三列上。
涉及到其他表有:dimension_platform、dimension_date以及dimension_inbound。

编码步骤

由于计算跳出会话的规则和计算活跃用户&总会话的规则不一样,所以这里我们采用两个不同mapreduce程序来计算统计数据。

  1. 在mysql中执行文件..\文档\dimension_inbound.sql
  2. 将文件..\文档\1215.log上传到hdfs上的/logs/12/15文件夹中,然后运行AnalyserLogDataRunner类并指定时间为2017-08-15。
  3. 编写操作dimension inbound相关类
  4. 编写统计活跃用户及总会话的mr程序
  5. 测试
  6. 编写统计跳出会话个数的mr程序。
  7. 测试

内容详解

外链跳出会话计算规则如下:

跳出会话定义是指指访问一个页面的会话,也就是说通过外链进入到网站后没有进行其他任何操作的会话就是跳出会话。

例如:(使用w_1,w_2来分别表示不同来源的外部浏览情况,使用b_1,b_2来分别表示不同的本网站的pageview事件, 只考虑同一个会话中)

  1. 只有本网站的访问,没有外部链接的进入:(b_n)+
    b_1, b_2,b_3
    访问页面为:b_1 -> b_2 -> b_3
  2. 先直接访问了本网站,然后再通过外部链接进入到本网站的情况:(b_n)+w_1(b_n)+
    b_1, w_1, b_2, b_3
    访问页面为: b_1->w_1->b_2->b_3
    跳出会话:通过外链进入本网站后,如果只访问一次,就直接退出的这种情况,算做跳出会话。
    w_1: 不是跳出会话
  3. 先通过外链1进入本网站,再通过外链2进入本网站:(b_n)+(w_1(b_n)+)+
    b_1, w_1, b_2, w_2, b_3, b_4,w_3,b_5
    访问页面为:b_1->w_1->b_2->w_2->b_3->b_4->w_3->b_5
    跳出会话:通过外链进入本网站后,在通过其他外链进入之前,如果只访问过一次本网站就算作跳出会话。
    w_1: 是跳出会话
    w_2: 不是跳出会话
    w_3: 是跳出会话
    完善:通过访问的链路的确定是否是跳出会话。

跳出会话,不仅仅只需要inbound进入的页面数据,而且还需要后续的普通页面。
platform+date inboundid(0表示普通页面) + sid + servertime: map阶段输出
reducer阶段工作:

1. 按照sid进行分组操作,放到map集合中
2. 针对map集合中的单个会话集合数据进行按照时间排序
3. 计算跳出会话个数

解决方案:

采用二次排序来避免在reducer阶段的大量内存操作。
platform+date+sid+servertime inboundid: map阶段输出
platform+date进行分组,先按照platform+date进行排序,然后按照sid排序,最后按照serverTime排序。