用户行为分析-埋点实时数仓实践(附用户关联源码)
目录
一、概述
二、数据模型
三、数据格式
四、架构图
五、动态添加ClickHouse列
六、用户关联(IdMapping)
七、批量写入
八、结束(附用户关联源码)
一、概述
埋点采集、用户行为分析、实时数仓、IdMapping
此文重点讲述埋点的数据模型、数据格式、数据实时采集、加工、存储及用户关联。关于用户行为分析的概念、意义以及埋点相关的东西此文不作赘述
二、数据模型
业界比较流行的事件、用户模型;即:
* who: 设备ID、登录ID
* when: 事件发生时间、上报时间
* where: 设备环境、网络环境、业务环境等
* what: 事件标识、事件参数
我们的数据存储也只有events和users两张表
events:不会变的日志表且数据量大;我们用ClickHouse的分布式表存储
users:我们只有几百万用户,且做用户关联时会频繁根据用户id查询、更新,而且做数据分析时要和事件表关联;我们用ClickHouse的mysql Engine存储
events建表语句:
-- 事件local表;按日期周分区
CREATE TABLE analytics.events_replica ON CLUSTER ck_cluster(`track_id` String COMMENT '埋点',`event_id` Int64 COMMENT '事件id',`distinct_id` String COMMENT '设备id/用户中心id',`user_id` Int64 COMMENT '用户表id',`type` String COMMENT '埋点类型',`event` String COMMENT '埋点事件',`date` Date COMMENT '埋点日期',`time` DateTime64 ( 3, 'Asia/Shanghai' ) COMMENT '埋点上传时间',`receive_time` DateTime64 ( 3, 'Asia/Shanghai' ) COMMENT '埋点接受时间',`day` Int64 COMMENT '埋点距1970/01/01的天数',`week_id` Int64 COMMENT '埋点距1970/01/01的周数',`month_id` Int64 COMMENT '埋点距1970/01/01的月数'其他业务公共字段所有事件属性) ENGINE = ReplicatedMergeTree ( '/clickhouse/tables/analytics/events_replica/{shard}', '{replica}' )
PARTITION BY toMonday ( date )
ORDER BY( track_id ) SETTINGS index_granularity = 8192-- 事件分布式表
CREATE TABLE analytics.events ON CLUSTER ck_cluster
AS analytics.events_replica ENGINE =Distributed('ck_cluster', 'analytics', 'events_replica', rand())
users建表语句:
-- ClickHouse Mysql Engine表
CREATE TABLE cON CLUSTER ck_cluster
(`id` Int64 comment '系统用户id',`first_id` String comment '第一次关联的设备id',`second_id` String comment '用户中心id',`$device_id_list` String comment '非第一次关联的设备id集合;逗号分隔'
)
ENGINE = MySQL('host:port', 'database', 'table', 'user', 'password');-- mysql表
CREATE TABLE `users` (`id` bigint(32) DEFAULT NULL,`first_id` varchar(100) DEFAULT NULL,`second_id` varchar(100) DEFAULT NULL,`$device_id_list` varchar(500) DEFAULT NULL
) 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实现了用户关联的逻辑;可以做到设备多对一,关联登录前后的用户
用户关联源码:GitHub - ostarsier/idmapping: 用户行为分析-用户关联
用户行为分析-埋点实时数仓实践(附用户关联源码)相关推荐
- 埋点数据mysql分析_用户行为分析-埋点实时数仓实践(附用户关联源码)
一.概述 埋点采集.用户行为分析.实时数仓.IdMapping 此文重点讲述埋点的数据模型.数据格式.数据实时采集.加工.存储及用户关联.关于用户行为分析的概念.意义以及埋点相关的东西此文不作赘述 二 ...
- 家用电器用户行为分析与事件识别_用户行为分析埋点实时数仓实践
点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多惊喜 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 大数据真好玩点击右侧关注,大数据真好玩! ...
- 【统一数据开发平台】-OLAP分析平台和实时数仓实践和优化
一.业务背景 BIGO 是一家面向海外的以短视频直播业务为主的公司, 目前公司的主要业务包括 BigoLive (全球直播服务),Likee (短视频创作分享平台),IMO (免费通信工具) 三部分, ...
- 「万字长文」实时数仓实践以及架构的演进
前言 "数据智能" (Data Intelligence) 有一个必须且基础的环节,就是数据仓库的建设,同时,数据仓库也是公司数据发展到一定规模后必然会提供的一种基础服务. 从智能 ...
- 实时数仓实践以及架构
前言 "数据智能" (Data Intelligence) 有一个必须且基础的环节,就是数据仓库的建设,同时,数据仓库也是公司数据发展到一定规模后必然会提供的一种基础服务. 从智能 ...
- 网易实时数仓实践与展望
分享嘉宾:马进 网易杭研 技术专家 编辑整理:张满意 出品平台:DataFunTalk 导读:随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的 ...
- 数仓 调度_网易实时数仓实践
分享嘉宾:马进 网易杭研 技术专家 编辑整理:张满意 出品平台:DataFunTalk 导读:随着大数据技术的进步,各种计算框架的涌现,数据仓库相关技术难题已经从离线数仓逐渐过渡到实时数仓,越来越多的 ...
- 基于 Flink 的严选实时数仓实践
https://www.infoq.cn/article/Lrg1J4*tWOak2WLqKyhF 今天分享的内容主要分为四个部分,首先会介绍下严选实时数仓的背景.产生的一些问题.然后是针对这些背景和 ...
- 滴滴打车 -- 实时数仓实践
桔妹导读:随着滴滴业务的高速发展,业务对于数据时效性的需求越来越高,而伴随着实时技术的不断发展和成熟,滴滴也对实时建设做了大量的尝试和实践.本文主要以顺风车这个业务为引子,从引擎侧.平台侧和业务侧各个 ...
最新文章
- Android 源码分析之 EventBus 的源码解析
- ecs要按两次才有效_猫咪想要增肥有什么办法?吃是最简单有效的了,但要吃对了才行...
- java金蝶云单据查询_如果在单据上查或下查的“单据关联”界面添加功能
- HTML5系列代码:用户注册页面
- Word文字处理技巧
- python实现三消游戏(消消乐)算法--简单案例
- 吐血整理 | 肝翻 Linux 同步管理所有知识点
- 【计算机网络】5G网络结构————5G技术大有可为
- netty报错LEAK: ByteBuf.release() was not called before it‘s garbage-collected.的解决方法
- Couldn‘t resolve host
- 【tools】信息收集-灯塔资产扫描 ARL
- SpringCloud Getway服务网关
- 0x3f3f3f3f
- 爬虫基础(6)网页解析之XPath库
- html5 canvas 扫雷游戏
- 4.电子计算机的分类,国际上对计算机进行分类的依据是什么
- c++使用ODBC读取EXCEL表格
- 【参观微软分享有礼】微软拥抱开源
- 如何使用GMAP/GSNAP进行转录组序列比对
- 电脑装的是office2013,右键新建却是2007,或者右键新建菜单中没有excel2013问题解决办法。