Hadoop离线数据分析平台实战——370外链信息分析Hadoop离线数据分析平台实战——370外链信息分析
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程序来计算统计数据。
- 在mysql中执行文件..文档dimension_inbound.sql
- 将文件..文档1215.log上传到hdfs上的/logs/12/15文件夹中,然后运行AnalyserLogDataRunner类并指定时间为2017-08-15。
- 编写操作dimension inbound相关类
- 编写统计活跃用户及总会话的mr程序
- 测试
- 编写统计跳出会话个数的mr程序。
- 测试
内容详解
外链跳出会话计算规则如下:
跳出会话定义是指指访问一个页面的会话,也就是说通过外链进入到网站后没有进行其他任何操作的会话就是跳出会话。
例如:(使用w_1,w_2来分别表示不同来源的外部浏览情况,使用b_1,b_2来分别表示不同的本网站的pageview事件, 只考虑同一个会话中)
- 只有本网站的访问,没有外部链接的进入:(b_n)+ b_1, b_2,b_3 访问页面为:b_1 -> b_2 -> b_3
- 先直接访问了本网站,然后再通过外部链接进入到本网站的情况:(b_n)+w_1(b_n)+ b_1, w_1, b_2, b_3 访问页面为: b_1->w_1->b_2->b_3 跳出会话:通过外链进入本网站后,如果只访问一次,就直接退出的这种情况,算做跳出会话。 w_1: 不是跳出会话
- 先通过外链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排序。
- 如何在CM中启用YARN的使用率报告
- 如何修改CDSW服务的DNS和HOSTNAME
- 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程
- 如何查看集成Sentry后Hive作业的真实用户
- 如何在Impala中实现拉链表
- 多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用
- Hue禁止用户下载数据问题分析
- 如何在RedHat6上使用Bind搭建DNS服务
- 如何使用Cloudera Manager升级Spark2.1版本至Spark2.2
- Cloudera Manager分发Parcel异常分析
- 如何在Hue中配置Impala的负载均衡
- 35行代码实现千万级别字典的快速去重
- PIMS三个漏洞+里程密最新版V2.3 SQL注入漏洞
- 如何在Redhat7.3安装CDH5.14
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- codeforces 1010A(二分答案)
- codeforces 628B(数学)
- codeforces 1385D(dfs)
- codeforces 1353D(优先队列)
- Coins (多重背包二进制优化)
- POJ 2063(完全背包)
- POJ2955(区间dp)
- codeforces 224B(思维+双指针)
- java学习应用篇|idea的基本安装和使用
- codeforces 349B(贪心)
- codeforces 1311D(暴力)
- codeforces 1382C1(思维)
- java学习原理篇|如何学习使用一个新工具
- codeforces 545C(贪心)
- codeforces 1272D(dp)