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排序。
- 【推荐】开源项目minapp-重新定义微信小程序的开发
- 【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
- hadoop性能调优
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
- DiscuzX v3.4 任意文件删除漏洞
- 系列3|走进Node.js之多进程模型
- Java中Arraylist与linkedlist的区别
- 手把手教你撸一个 Webpack Loader
- HashMap与HashTable区别
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
- React Native 网络层分析
- 如何实现VM框架中的数据绑定
- Java盲点解析
- 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 数组属性和方法
- 手把手教你用 Python 搞定网页爬虫!
- 为并发而生的 ConcurrentHashMap,基于 Java8 分析
- 使用Kustomize定制Helm Chart
- 踩坑了,JDK8 中 HashMap 依然会产生死循环问题!
- 使用shell-operator实现Operator
- 教你用Python 操作 PDF 的几种方法
- 如何在K8s上设置生产级的EFK?(上)
- IntelliJ IDEA 构建 Maven 多模块工程项目
- GDP越高就越幸福吗?用Python分析《世界幸福指数报告》后我们发现…
- 图解:什么是哈希?
- 【Python基础】一文看懂 Pandas 中的透视表
- 彻底干掉恶心的 SQL 注入漏洞, 一网打尽!
- 某小型公司持续集成工具 Jenkins 实践
- 使用RBAC Impersonation简化Kubernetes资源访问控制
- 求求你别再用 MySQL offset 和 limit 分页了?