一、概述

埋点采集、用户行为分析、实时数仓、IdMapping

此文重点讲述埋点的数据模型、数据格式、数据实时采集、加工、存储及用户关联。关于用户行为分析的概念、意义以及埋点相关的东西此文不作赘述

二、数据模型

业界比较流行的事件、用户模型;即:who: 设备ID、登录ID

* when: 事件发生时间、上报时间

* where: 设备环境、网络环境、业务环境等

* what: 事件标识、事件参数

我们的数据存储也只有events和users两张表

events:不会变的日志表且数据量大;我们用ClickHouse的分布式表存储

users:我们只有几百万用户,且做用户关联时会频繁根据用户id查询、更新,而且做数据分析时要和事件表关联;我们用ClickHouse的mysql Engine存储

events建表语句:1. -- 事件local表;按日期周分区

2. CREATE TABLE analytics.events_replica ON CLUSTER ck_cluster(

3. `track_id` String COMMENT '埋点',

4. `event_id` Int64 COMMENT '事件id',

5. `distinct_id` String COMMENT '设备id/用户中心id',

6. `user_id` Int64 COMMENT '用户表id',

7. `type` String COMMENT '埋点类型',

8. `event` String COMMENT '埋点事件',

9. `date` Date COMMENT '埋点日期',

10. `time` DateTime64 ( 3, 'Asia/Shanghai' ) COMMENT '埋点上传时间',

11. `receive_time` DateTime64 ( 3, 'Asia/Shanghai' ) COMMENT '埋点接受时间',

12. `day` Int64 COMMENT '埋点距1970/01/01的天数',

13. `week_id` Int64 COMMENT '埋点距1970/01/01的周数',

14. `month_id` Int64 COMMENT '埋点距1970/01/01的月数'

15. 其他业务公共字段

16. 所有事件属性

18. ) ENGINE = ReplicatedMergeTree ( '/clickhouse/tables/analytics/events_replica/{shard}', '{replica}' )

19. PARTITION BY toMonday ( date )

20. ORDER BY

21. ( track_id ) SETTINGS index_granularity = 8192

23. -- 事件分布式表

24. CREATE TABLE analytics.events ON CLUSTER ck_cluster

25. AS analytics.events_replica ENGINE =Distributed('ck_cluster', 'analytics', 'events_replica', rand())

users建表语句:1. -- ClickHouse Mysql Engine表

2. CREATE TABLE cON CLUSTER ck_cluster

3. (

4. `id` Int64 comment '系统用户id',

5. `first_id` String comment '第一次关联的设备id',

6. `second_id` String comment '用户中心id',

7. `$device_id_list` String comment '非第一次关联的设备id集合;逗号分隔'

8. )

9. ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password');

11. -- mysql表

12. CREATE TABLE `users` (

13. `id` bigint(32) DEFAULT NULL,

14. `first_id` varchar(100) DEFAULT NULL,

15. `second_id` varchar(100) DEFAULT NULL,

16. `$device_id_list` varchar(500) DEFAULT NULL

17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

三、数据格式

1.事件埋点

埋点时机: 行为事件记录

type = track

用户登录前: is_login_id=false, distinct_id=设备id

用户登录后: is_login_id=true, distinct_id=用户id

只能在properties里添加属性

{

"distinct_id": "登录前(设备id)、登录后(用户id)",

"time": "当前时间戳",

"type": "track",

"event": "事件名",

"properties": {

"$is_login_id": true,

"$内置属性名": "内置属性值",

"$自定义属性名": "自定义属性值"

}

}

例子:

{

"distinct_id": "123456",

"time": 1434556935000,

"type": "track",

"event": "ViewProduct",

"properties": {

"$is_login_id": true,

"$app_version": "1.3",

"$wifi": true,

"$ip": "180.79.35.65",

"$province": "湖南",

"$city": "长沙",

"$user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/58.0.3029.113 Mobile/14F89 Safari/602.1",

"$screen_width": 320,

"$screen_height": 568,

"product_id": 12345,

"product_name": "苹果",

"product_classify": "水果",

"product_price": 14.0

}

}

2. 用户关联

埋点时机: 用户登录后

type=track_signup; event=$SignUp; distinct_id=用户ID; original_id=设备id

{

"distinct_id":"用户Id",

"original_id":"设备id",

"time": "当前时间戳",

"type": "track_signup",

"event": "$SignUp",

"properties": {

"$内置属性名":"内置属性值"

}

}

例子:

{

"distinct_id":"12345",

"original_id":"2b0a6f51a3cd6775",

"time": 1434557935000,

"type": "track_signup",

"event": "$SignUp",

"properties": {

"$manufacturer":"Apple",

"$model": "iPhone5,2",

"$os":"iOS",

"$os_version":"7.0",

"$app_version":"1.3",

"$wifi":true,

"$ip":"180.79.35.65",

"$province":"湖南",

"$city":"长沙",

"$screen_width":320,

"$screen_height":568

}

}

四、架构图

前后端埋点:分为全埋点和自定义事件埋点;按数据条数和时间间隔批量发送

埋点收集器:一个API接口,通过nginx作负载均衡,接收到埋点后异步写入kafka;业界通用的做法是用nginx接受埋点后直接落盘,然后再通过flume、logstash等日志采集工具采集到kafka。

kafka原始数据:通过flume采集一份到离线数仓

Flink ETL:核心数据处理逻辑

1.动态添加ClickHouse列

2.用户关联

3.数据校验、解析、清洗批量写入:按数据条数和时间间隔批量写入ClickHouse

五、动态添加ClickHouse列

自定义埋点的事件属性会随着业务增加,事件属性会作为events表的列形成一张宽表,所以采集到事件后,会根据事件的属性实时动态添加events表的字段

events表的列会初始化一份到redis的set里,在Flink ETL里,和埋点属性的集合取差集,并更新redis

需要注意的时:添加列时需要同时添加events的local表和distributed表

六、用户关联(IdMapping)

参考某策的用户关联:标识用户

大概逻辑:

1.根据埋点事件、用户关联事件的设备ID或登录ID去用户表里找到对应的用户ID作为事件表的用户ID

2.定时调度刷新设备多对一的情况

流程图如下(源码见文末):

七、批量写入

由于jdbc的batchInsert需要sql一样,我们的实时采集事件却有所差别,导致sql不一样;这里我们可以根据sql分组,按一分钟或1000条批量写入即可

八、结束(附用户关联源码)

我基于mysql实现了用户关联的逻辑;可以做到设备多对一,关联登录前后的用户

埋点数据mysql分析_用户行为分析-埋点实时数仓实践(附用户关联源码)相关推荐

  1. 用户行为分析-埋点实时数仓实践(附用户关联源码)

    目录 一.概述 二.数据模型 三.数据格式 四.架构图 五.动态添加ClickHouse列 六.用户关联(IdMapping) 七.批量写入 八.结束(附用户关联源码) 一.概述 埋点采集.用户行为分 ...

  2. 家用电器用户行为分析与事件识别_用户行为分析埋点实时数仓实践

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多惊喜 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 大数据真好玩点击右侧关注,大数据真好玩! ...

  3. 【统一数据开发平台】-OLAP分析平台和实时数仓实践和优化

    一.业务背景 BIGO 是一家面向海外的以短视频直播业务为主的公司, 目前公司的主要业务包括 BigoLive (全球直播服务),Likee (短视频创作分享平台),IMO (免费通信工具) 三部分, ...

  4. 数仓 调度_网易实时数仓实践

    分享嘉宾:马进 网易杭研 技术专家 编辑整理:张满意 出品平台:DataFunTalk 导读:随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的 ...

  5. 数据运营时代,如何基于AnalyticDB构建企业实时数仓?

    摘要:万事万物每时每刻都在产生大量的数据,数据无处不在,数据化运营在今天的物流.零售.电商.金融等等行业中都有诸多成功的实践,但是如何降低企业大数据的建设门槛,使得大数据分析成为一种人人都可以获得的普 ...

  6. 机器人编程python代码_自己动手开发智能聊天机器人完全指南(附python完整源码)...

    一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...

  7. php获取微信小程序用户头像,微信小程序获取用户头像+昵称+openid,小程序登录!附前端后端源码!...

    做一款小程序,如果需要判断用户,当然要获取一些基本信息,例如头像,昵称,openid.所以本次案例就直接上代码了. 小程序前端 index.wxml 获取头像昵称 {{userInfo.nickNam ...

  8. 数据查询和业务流分开_滴滴实时数仓逐层剖解:实时与离线数据误差0.5%

    原标题:滴滴实时数仓逐层剖解:实时与离线数据误差< 作者介绍 潘澄,资深软件开发工程师.负责实时数据仓库建设,多年数据相关工作经验,专注数据建模.数据仓库.实时数据技术等领域. 朱峰,高级软件开 ...

  9. MySQL用户如何构建实时数仓

    依托数据库生态,AnalyticDB for MySQL可以给用户提供分析场景下的标准解决方案,尤其是在大数据和性能要求较高的情况下AnalyticDB for MySQL的价值可以更好的体现. My ...

最新文章

  1. AngularJS和DataModel
  2. 对比:Linux和Windows系统线程间的区别
  3. linux shell 获取字符串最后一个字符 去掉字符串最后一个字符 去掉末尾一个字符 去掉末尾两个字符
  4. Flutter - International 国际化,Localization 本地化, 使用Intl
  5. spring中使用注解代替xml配置
  6. 数据分析与挖掘理论-数据预处理
  7. CentOS下面ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
  8. 计算机上的usb设备是什么东西,联接一个USB的线在电脑桌上方便插U盘的东西叫什么?...
  9. Golang——深浅拷贝
  10. 转换到bot模式失败_《认知觉醒》:为什么越“努力”,会越失败
  11. Android之ContentProvider数据存储
  12. Electron 实战:前端人的最佳跨平台解决方案
  13. java 53个关键字_java的保留(53个)关键字v11.docx
  14. 谷歌约束控件(ConstraintLayout)扁平化布局入门
  15. 数据仓库建设 —— 数据质量管理
  16. 离散数学 第十三章 欧拉图与哈密顿图
  17. dell笔记本重装win10系统超详细的教程(适用所有windows系统的一套流程)
  18. 【电子商务突围物流瓶颈】南风窗商业杂志采访我的观点
  19. Shi-Tomasi特征点(角点)检测及追踪方法
  20. 计算机信息系统打印输出的涉密文件,计算机信息系统打印输出的涉密文件,应当按相应的()文件进行管理。...

热门文章

  1. 数据库|SQL内置函数使用手册
  2. CAD软件卸载不完全,该怎么解决呢?
  3. 芯片组x299是服务器主板吗,X299主板怎么样/值得买吗?新一代酷睿i9和发烧级X299主板全面深度评测...
  4. java使用MD5进行不可逆加密
  5. 设置linux-kali 2022语言为中文(保姆级图文)
  6. 自制USB接口供电的手机电池充电器电路
  7. VBA 批量打印多工作簿的指定工作表
  8. Excel批量打印同一个工作簿中的多个工作表文件
  9. 2017湘潭邀请赛E-Partical Sum | 绝对值的特性
  10. 【问题解决】MySql添加新用户提示错误