问题
用户浏览网站、App或者小程序的基础行为(浏览、点击、搜索与收藏等)数据怎么采集?会话粒度的数据怎么获取? 埋点与无埋点采集?
背景
数据采集是整个数据分析的前奏,直接关系到后续数据展现的准确性。本文聚焦网站及H5编写的微信服务号,旨在统一用户行为数据采集方式,形成一致的SDK编码规范。
当前,主流数据采集方式有埋点与无埋点两种。所谓的埋点方式即在网站、APP或者小程序的前或后端某处嵌入一段js或java(scala、c++等)代码,用来监控、收集并上报用户的基础行为数据至服务器。埋点采集最大的弊端在于每分析一个业务指标都需要手动添加一段代码,后期开发与运维成本较高。而无埋点只加一段SDK就能实时、全量、自动收集用户的行为数据,能极大地简化数据采集成本,但技术瓶颈较高。关于无埋点的原理及应用,请参考文末相关链接。
本方案基于埋点方式实现。
方案
一、系统结构
SDK 组件 : 在网站或app前端及后端埋点监听并获取用户的原生行为数据.
Nginx 组件 : 按照制定的格式收集sdk端发送过来的数据.
Flume 组件 : 监控Ng服务器的日志目录,并按照数据的特点分类推送 -实时数据推送Kafka、离线数据推送到 Hdfs.
Hdfs 组件 : 存放采集后的原始离线数据.
Kafka 组件 : 存放采集后的原始实时数据.
整个数据采集流程从渠道 PC、adroid&ios与微信服务号三大门户开始,通过在门户前端集成js SDK,埋点收集用户的基础行为数据,并向Nginx服务器发送http请求(eg、http://jr.midea.com/approval.html ? requestdata,其中requestdata为json格式的日志数据)。Nginx在本地目录按照指定的格式生成一份日志文件,Flume监听并主动拉取新增的日志数据,根据业务场景对数据实时性要求的不同分别sink到不同的接收源:hdfs-离线数据,kafka-实时数据。
注:Flume直接从Nginx生产环境拉取日志数据,会影响系统性能,后续考虑在Nginx与Flume之间增加一层FTP服务器:Nginx在空闲时间定时主动上报日志数据到FTP,Flume监听并获取FTP上的日志数据。
二、SDK 介绍
2.1 工作原理
基于事件驱动,按照采集数据类型的不同,分成三类事件:Register、PageView、自定义js与java事件。
js SDK 与 java SDK 工作流程图
注意:
1)、使用UUID而非IP地址作为用户的 以为标识符?采用拨号的方式上网,用户ip会发生变化,可能出现多个IP地址对应同一个用户。
2)、在前端生成会话ID,而不是从数据库读取。
2.2 API 说明
这部分以 PageView 事件为例,介绍api的基本格式。
a) 共性参数说明。不同api所涉及到的参数不尽相同,但都有一些共性参数:
b) PageView事件说明
当用户访问页面/刷新页面的时候触发该事件。该事件会自动调用,也可以让程序员手动调用:
操作手册
a) 编写 API
按照业务分析需求,编写相关采集方式。 模板代码 略。
b)集成 SDK
Js sdk的集成分为两种方式,第一种是直接使用script标签引入js,第二种是在页面加载完成后执行js代码,js代码再进行js的加载 :
1 <script src=”//jr.midea.com/analytics.js”></script>
2 <script type=”text/javascript”>
var _aelog_ = _aelog_ || [];
// 设置_aelog_相关属性
(function(){
var aejs = document.createElement(‘script’);
})();
</script>
1
2
3
4
5
6
7
8
Java sdk 直接通过eclipse等自带的打包工具打成.jar包,然后添加到项目的依赖中。
总结
本文简要介绍了埋点采集与无埋点采集、详细地描述了数据采集系统结构与JS SDK工作原理及基本数据请求格式。
至于具体的 js SDK样例代码及 Nginx与Flume的配置详见后文。
参 考
1】 走出只关注PV、UV的误区,数据分析这样做才能解决问题 by 叶钉钉
2】 无埋点技术产品级应用Growing IO官网
3】 Flume官网
4】 Flume+Spark+Hive+Spark SQL离线分析系统
5】 离线分析项目实战-北风网 Jerry Liu [特别致谢]
数据采集方案初探_Memory of Mr.Snail-CSDN博客_数据采集方案
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/notes/207659.html