Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Clickhouse在大数据分析平台-留存分析上的应用

Clickhouse在大数据分析平台-留存分析上的应用

作者头像
腾讯云大数据
发布于 2020-08-07 03:10:14
发布于 2020-08-07 03:10:14
3.8K10
代码可运行
举报
文章被收录于专栏:腾讯云大数据腾讯云大数据
运行总次数:0
代码可运行

导语 | 本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案。同时,除了留存分析,对于用户群分析,事件分析等也可以尝试用此方案来解决。

文章作者:陈璐,腾讯高级数据分析

  背景

你可能听说过Growingio、神策等数据分析平台,本文主要介绍实现留存分析工具相关的内容。

留存分析是一种用来分析用户参与情况/活跃程度的分析模型,可考查进行初始行为后的用户中,有多少人会进行后续行为,这是衡量产品对用户价值高低的重要指标。如,为评估产品更新效果或渠道推广效果,我们常常需要对同期进入产品或同期使用了产品某个功能的用户的后续行为表现进行评估 [1]。大部分数据分析平台主要包括如图的几个功能(以神策为例):

本文主要介绍留存分析工具的优化方案(只涉及数据存储和查询的方案设计,不涉及平台)。

我想每个数据/产品同学在以往的取数分析过程中,都曾有一个痛点,就是每次查询留存相关的数据时,都要等到天荒地老,慢!而最近采用优化方案的目的也是为了提高查询的效率和减少数据的存储,可以帮助产品快速地查询/分析留存相关的数据。

优化方案的核心是在Clickhouse中使用Roaringbitmap对用户进行压缩,将留存率的计算交给高效率的位图函数,这样既省空间又可以提高查询速度。

希望本实践方案可以给你带来一些帮助和启示。下面主要分3个部分详细介绍:Roaringbitmap简介、思路与实现、总结与思考。

一、Roaringbitmap 简介

下面先简单介绍一下高效的位图压缩方法Roaringbitmap。先来看一个问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
给定含有40亿个不重复的位于[0,2^32-1]区间内的整数集合,如何快速判定某个数是否在该集合内?

显然,如果我们将这40亿个数原样存储下来,需要耗费高达14.9GB的内存,这是难以接受的。所以我们可以用位图(bitmap)来存储,即第0个比特表示数字0,第1个比特表示数字1,以此类推。如果某个数位于原集合内,就将它对应的位图内的比特置为1,否则保持为0,这样就能很方便地查询得出结果了,仅仅需要占用512MB的内存,不到原来的3.4% [3]。但是这种方式也有缺点:比如我需要将1~5000w这5000w个连续的整数存储起来,用普通的bitmap同样需要消耗512M的存储,显然,对于这种情况其实有很大的优化空间。

2016年由S. Chambi、D. Lemire、O. Kaser等人在论文《Better bitmap performance with Roaring bitmaps》与《Consistently faster and smaller compressed bitmaps with Roaring》中提出了roaringbitmap,主要特点就是可以极大程度地节约存储及提供了快速的位图计算,因此考虑用它来做优化。对于前文提及的存储连续的5000w个整数,只需要几十KB。

它的主要思路是:将32位无符号整数按照高16位分桶,即最多可能有2^16=65536个桶,论文内称为container。存储数据时,按照数据的高16位找到container(找不到就会新建一个),再将低16位放入container中。也就是说,一个roaringbitmap就是很多container的集合 [3],具体细节可以自行查看文末的参考文章。

二、思路与实现

我们的原始数据主要分为:

  • 1.用户操作行为数据table_oper_raw 包括时间分区(ds)、用户标识id(user_id)和用户操作行为名称(oper_name),如:20200701|6053002|点击首页banner 表示用户6053002在20200701这天点击了首页banner(同一天中同一个用户多次操作了同一个行为只保留一条)。实践过程中,此表每日记录数达几十亿行。
  • 2.用户属性数据table_attribute_raw 表示用户在产品/画像中的属性,包括时间分区(ds)、用户标识(user_id)及各种用户属性字段(可能是用户的新进渠道、所在省份等),如20200701|6053002|小米商店|广东省。实践过程中,此表每日有千万级的用户数,测试属性在20+个。

现在我们需要根据这两类数据,求出某天操作了某个行为的用户在后续的某一天操作了另一个行为的留存率,比如,在20200701这天操作了“点击banner”的用户有100个,这部分用户在20200702这天操作了“点击app签到”的有20个,那么对于分析时间是20200701,且“点击banner”的用户在次日“点击app签到”的留存率是20%。同时,还需要考虑利用用户属性对留存比例进行区分,例如只考虑广东省的用户的留存率,或者只考虑小米商店用户的留存率,或者在广东的小米商店的用户的留存率等等。

一般来说,求留存率的做法就是两天的用户求交集,例如前文说到的情况,就是先获取出20200701的所有操作了“点击banner”的用户标识id集合假设为S1,然后获取20200702的所有操作了“点击app签到”的用户标识id集合假设为S2,最后求解S1和S2的交集:

可以看到,当s1和s2的集合中用户数都比较大的时候,join的速度会比较慢。

在此我们考虑前文说到的bitmap,假若每一个用户都可以表示成一个32位的无符号整型,用bitmap的形式去存储,S1和S2的求交过程就是直接的一个位比较过程,这样速度会得到巨大的提升。而Roaringbitmap对数据进行了压缩,其求交的速度在绝大部分情况下比bitmap还要快,因此这里我们考虑使用Roaringbitmap的方法来对计算留存的过程进行优化。

1.数据构建

整个过程主要是:首先对初始的两张表——用户操作数据表table_oper_raw和用户筛选维度数据表table_attribute_raw中的user_id字段进行编码,将每个用户映射成唯一的id(32位的无符号整型),分别得到两个新表table_oper_middle和table_attribute_middle。再将他们导入clickhouse,使用roaringbitmap的方法对用户进行压缩存储,最后得到压缩后的两张表table_oper_bit和table_attribute_bit,即为最终的查询表。流程图如下:

  • (1).生成用户id映射表 首先,需要构建一个映射表table_user_map,包含时间分区(ds)、用户标识id(user_d)及映射后的id(id),它将每个用户(String类型)映射成一个32位的无符号整型。这里我们从1开始编码,这样每个用户的标识就转化成了指定的一个数字。
  • (2).初始数据转化 分别将用户操作数据表和用户筛选维度数据中的imei字段替换成对应的数值,生成编码后的用户操作数据:

和用户筛选维度数据:

  • (3).导入clickhouse 首先在clickhouse中创建相同结构的表,如table_oper_middle_ch: 同样的,在clickhouse中创建表table_attribute_middle_ch。然后用spark将这两份数据分别导入这两张表。这一步导入很快,几十亿的数据大概10分多钟就可以完成
  • (4).Roaringbitmap压缩 对于用户操作流水数据,我们先建一个可以存放bitmap的表table_oper_bit,建表语句如下:

用户属性数据table_attribute_bit也类似:

接着用聚合函数groupBitmapState对用户id进行压缩:

这样,对于用户操作数据表,原本几十亿的数据就压缩成了几万行的数据,每行包括操作名称和对应的用户id形成的bitmap:

同样的,用户属性的数据也可以这样处理,得到table_attribute_bit表,每行包括某个属性的某个属性值对应的用户的id形成的bitmap:

至此,数据压缩的过程就这样完成了。

2.查询过程

首先,简要地介绍下方案中常用的bitmap函数(详细见文末的参考资料):

1.bitmapCardinality 返回一个UInt64类型的数值,表示bitmap对象的基数。用来计算不同条件下的用户数,可以粗略理解为count(distinct)

2.bitmapAnd 为两个bitmap对象进行与操作,返回一个新的bitmap对象。可以理解为用来满足两个条件之间的and,但是参数只能是两个bitmap

3.bitmapOr 为两个bitmap对象进行或操作,返回一个新的bitmap对象。可以理解为用来满足两个条件之间的or,但是参数也同样只能是两个bitmap。如果是多个的情况,可以尝试使用groupBitmapMergeState

举例来说,假设20200701这天只有[1,2,3,5,8]这5个用户点击了banner,则有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回5
select bitmapCardinality(user_bit)
from tddb.table_oper_bit
where ds = 20200701 AND oper_name = '点击banner'

又如果20200701从小米商店新进的用户是[1,3,8,111,2000,100000],则有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回3,因为两者的重合用户只有1,3,83个用户
select bitmapCardinality(bitmapAnd(
	(SELECT user_bit
         FROM tddb.table_oper_bit
         WHERE (ds = 20200701) AND (oper_name = '点击banner')), 
	(SELECT user_bit
	 FROM tddb.table_attribute_bit
	 WHERE ds = 20200701 and (attr_id = 'first_channel') and (attr_value IN ('小米商店')))))

有了以上的数据生成过程和bitmap函数,我们就可以根据不同的条件使用不同的位图函数来快速查询,具体来说,主要是以下几种情况:

  • a. 操作了某个行为的用户在后续某一天操作了另一个行为的留存: 如“20200701点击了banner的用户在次日点击app签到的留存人数”,就可以用以下的sql快速求解:
  • b. 操作了某个行为并且带有某个属性的用户在后续的某一天操作了另一个行为的留存: 如“20200701点击了banner且来自广东/江西/河南的用户在次日点击app签到的留存人数”:
  • c. 操作了某个行为并且带有某几个属性的用户在后续的某一天操作了另一个行为的留存: 如“20200701点击了banner、来自广东且新进渠道是小米商店的用户在次日点击app签到的留存人数”:

3.实践效果

根据这套方案做了实践,对每日按时间分区、用户、操作名称去重后包括几十亿的操作记录,其中包含千万级别的用户数,万级别的操作数。最后实现了:

  • 存储 原本每日几十G的操作流水数据经压缩后得到的表table_oper_bit为4GB左右/天。而用户属性表table_attribute_bit为500MB左右/天
  • 查询速度 clickhouse集群现状:12核125G内存机器10台。clickhouse版本:20.4.7.67。查询的表都存放在其中一台机器上。测试了查询在20200701操作了行为oper_name_1(用户数量级为3000+w)的用户在后续7天内每天操作了另一个行为oper_name_2(用户数量级为2700+w)的留存数据(用户重合度在1000w以上),耗时0.2秒左右
  • 反馈 最后和前端打通,效果也是有了明显的优化,麻麻再也不用担心我会转晕~

三、总结与思考

总的来说,本方案的优点是:

  • 存储小,极大地节约了存储
  • 查询快,利用bitmapCardinality、bitmapAnd、bitmapOr等位图函数快速计算用户数和满足一些条件的查询,将缓慢的join操作转化成位图间的计算
  • 适用于灵活天数的留存查询
  • 便于更新,用户操作数据和用户属性数据分开存储,便于后续属性的增加和数据回滚

另外,根据本方案的特点,除了留存分析工具,对于用户群分析,事件分析等工具也可以尝试用此方案来解决。

PS : 作者初入坑ch,对于以上内容,有不正确/不严谨之处请轻拍~ 欢迎交流~

参考文献:

[1] 解析常见的数据分析模型——留存分析:https://www.sensorsdata.cn/blog/jie-xi-chang-jian-de-shu-ju-fen-xi-mo-xing-liu-cun-fen-xi/

[2] RoaringBitmap数据结构及原理:https://blog.csdn.net/yizishou/article/details/78342499

[3] 高效压缩位图RoaringBitmap的原理与应用:https://www.jianshu.com/p/818ac4e90daf

[4] 论文:Better bitmap performance with Roaring bitmaps:https://arxiv.org/abs/1402.6407v9?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+DanielLemiresArticlesOnArxiv+(Daniel+Lemire%27s+articles+on+arXiv)

[5] Clickhouse文档-位图函数:https://clickhouse.tech/docs/zh/sql-reference/functions/bitmap-functions/

腾讯云大数据

长按二维码 关注我们

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
大佬,请教个问题。你的案例中渠道,城市等属性都是用户属性,如果要筛选事件属性,比如终端,版本等,行为表应该如何抽取bitmap?如果按照事件id和事件属性进行分组抽取,比如a用户用安卓访问了app首页1.1版本,当天a用户又用苹果手机访问了app首页1.2版本,初始事件指定用安卓访问1.2版本的用户,那a这个用户是不是会被误判为符合起始事件啊?真心求教
大佬,请教个问题。你的案例中渠道,城市等属性都是用户属性,如果要筛选事件属性,比如终端,版本等,行为表应该如何抽取bitmap?如果按照事件id和事件属性进行分组抽取,比如a用户用安卓访问了app首页1.1版本,当天a用户又用苹果手机访问了app首页1.2版本,初始事件指定用安卓访问1.2版本的用户,那a这个用户是不是会被误判为符合起始事件啊?真心求教
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Clickhouse在大数据分析平台-留存分析上的应用
你可能听说过Growingio、神策等数据分析平台,所在部门也在构建自己的大数据分析平台MVP(地址:http://mvp.wsd.com),本文主要介绍实现留存分析工具相关的内容。
腾讯云大数据
2021/01/07
2.3K0
ClickHouse实战留存、路径、漏斗、session
关于用户留存模型是各大商业数据分析平台必不可少的功能,企业一般用该模型衡量用户的活跃情况,也是能直接反应产品功能价值的直接指标;如,boss想要了解商城改版后,对用户加购以及后续下单情况的影响等。如下图,这就是一个典型的留存分析功能:
小晨说数据
2022/03/10
2.2K0
ClickHouse实战留存、路径、漏斗、session
PB级数据实时分析,ClickHouse到底有多彪悍?
腾讯公司内部有很多业务使用 ClickHouse,比较典型的就是QQ音乐。QQ音乐在使用 ClickHouse 之前,用的是基于 Hive 构建的离线数仓,当时遇到了很多问题,主要在于以下三个方面:
腾讯云开发者
2020/10/21
8.3K2
小程序是如何设计百亿级用户画像分析系统的?
导语 | We 分析是微信小程序官方推出的、面向小程序服务商的数据分析平台,其中画像洞察是一个非常重要的功能模块。微信开发工程师钟文波将描述 We 分析画像系统各模块是如何设计,在介绍基础标签模块之后,重点讲解用户分群模块设计。希望相关的技术实现思路,能够对你有所启发。 目录 1 背景介绍    1.1 画像系统简述    1.2 画像系统设计目标 2 画像系统整体概述 3 基础标签模块    3.1 功能描述    3.2 技术实现 4 用户分群模块    4.1 功能描述    4.2 人群包实时预估
腾讯云开发者
2023/03/10
2.5K0
小程序是如何设计百亿级用户画像分析系统的?
苏宁基于 ClickHouse 的大数据全链路监控实践
ClickHouse 是一款优秀的 OLAP 分析引擎,尤其是在单表分析 、Colocate Join 方面性能表现尤为突出。ClickHouse 之所以在众多的 OLAP 分析引擎中成为佼佼者,主要是因为它具备以下特点:列式存储、LSM-Tree 存储引擎、向量化执行引擎、异步 Merge 和 Mutation 机制、并发 MPP+ SMP 等。
深度学习与Python
2020/09/14
2.2K0
大数据ClickHouse(一):入门介绍与其特性
批处理会将源业务系统中的数据通过数据抽取工具(例如Sqoop)将数据抽取到HDFS中,这个过程可以使用MapReduce、Spark、Flink技术对数据进行ETL清洗处理,也可以直接将数据抽取到Hive数仓中,一般可以将结构化的数据直接抽取到Hive数据仓库中,然后使用HiveSQL或者SparkSQL进行业务指标分析,如果涉及到的分析业务非常复杂,可以使用Hive的自定义函数或者Spark、Flink进行复杂分析,这就是我们通常说的数据指标分析。分析之后的结果可以保存到Hive、HBase、MySQL、Redis等,供后续查询使用。一般在数仓构建中,如果指标存入Hive中,我们可以使用Sqoop工具将结果导入到关系型数据库中供后续查询。HBase中更擅长存储原子性非聚合查询数据,如果有大量结果数据后期不需要聚合查询,也可以通过业务分析处理考虑存入HBase中。对于一些查询需求结果反馈非常快的场景可以考虑将结果存入Redis中。
Lansonli
2022/08/08
1.9K0
大数据ClickHouse(一):入门介绍与其特性
快手HBase在千亿级用户特征数据分析中的应用与实践
快手每天产生数百亿用户特征数据,分析师需要在跨30-90天的数千亿特征数据中,任意选择多维度组合(如:城市=北京&性别=男),秒级分析用户行为。针对这一需求, 快手基于HBase自主研发了支持bitmap转化、存储、索引、快速计算的分析服务--BitBase,并成功应用于留存分析、用户增长、广告营销、ABTest 等多个业务场景。
大数据真好玩
2019/10/23
1.1K0
快手HBase在千亿级用户特征数据分析中的应用与实践
一文读懂比BitMap有更好性能的Roaring Bitmap
1.什么是bitmap?为什么使用bitmap?Roaring bitmap与其他bitmap编码技术相比有哪些优势?2.Roaring bitmap将32位无符号整数按照高16位分容器,即最多可能有216=65536个容器(container),存储数据时,按照数据的高16位找到container(找不到就会新建一个),再将低16位放入container中。高16位又称为共享有效位,它用于索引应该到哪个容器中查找对应的数值,属于roaring bitmap的一级索引。3.Roaring bitmaps以紧凑高效的两级索引数据结构存储32位整数。高密度块使用位图存储;稀疏块使用16位整数的压缩数组。当一个块包含不超过4096个整数时,我们使用一个排好序的16位整数数组。当有超过4096个整数时,我们使用2^16 位的位图。为什么按4096作为阀值呢?仅仅是因为当数据块中的整数数量超过这个值之后,bitmap将比数组的内存使用率更高。
山行AI
2020/11/26
10K0
快手 HBase 在千亿级用户特征数据分析中的应用与实践
快手建设 HBase 差不多有2年时间,在公司里面有比较丰富的应用场景:如短视频的存储、IM、直播里评论 feed 流等场景。本次只分享其中的一个应用场景:快手 HBase 在千亿级用户特征数据分析中的应用与实践。为什么分享这个 Topic?主要原因:对于大部分公司来说,这都是一个普适的场景,因为很普遍,所以可选择的分析引擎也非常多,但是目前直接用 HBase 这种分析用户特征的比较少,希望通过今天的分享,大家在将来遇到这种场景时, 可以给大家提供一个新的解决方案。
Fayson
2019/09/03
1.4K0
快手 HBase 在千亿级用户特征数据分析中的应用与实践
Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算
       笔者在近一两年接触了Clickhouse数据库,在项目中也进行了一些实践,但一直都没有一些技术文章的沉淀,近期打算做个系列,通过一些具体的场景将Clickhouse的用法进行沉淀和分享,供大家参考。
粲然
2023/10/12
5780
Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算
Flink基于两阶段聚合及Roaringbitmap的实时去重方案
去重是大数据计算中的常见场景,本文介绍了Flink结合数据倾斜问题的一般性解决方案——两阶段聚合,以及位图(Bitmap)的优化版数据结构——Roaringbitmap给出的一种实时去重解决方案,并在最后与其他方案进行了对比。
可君
2023/01/03
3.5K0
ClickHouse 在有赞的实践之路
本文主要介绍了 ClickHouse 的简单原理,有赞 OLAP 相关组件以及 ClickHouse 在有赞的实践之路。
用户1278550
2021/02/01
1.8K0
ClickHouse 在有赞的实践之路
ClickHouse SQL 语法基础极简教程 + bitmap 位图数据类型的使用实例
Application: Listening for http://127.0.0.1:8123
一个会写诗的程序员
2022/03/07
2.8K0
ClickHouse SQL 语法基础极简教程 + bitmap 位图数据类型的使用实例
高效大数据开发之 bitmap 思想的应用
作者:xmxiong,PCG 运营开发工程师 数据仓库的数据统计,可以归纳为三类:增量类、累计类、留存类。而累计类又分为历史至今的累计与最近一段时间内的累计(比如滚动月活跃天,滚动周活跃天,最近 N 天消费情况等),借助 bitmap 思想统计的模型表可以快速统计最近一段时间内的累计类与留存类。 一、背景 数据仓库的数据统计,可以归纳为三类:增量类、累计类、留存类。而累计类又分为历史至今的累计与最近一段时间内的累计(比如滚动月活跃天,滚动周活跃天,最近 N 天消费情况等),借助 bitmap 思想统计
腾讯技术工程官方号
2020/09/08
1.5K0
超快!大数据分析引擎ClickHouse
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
凹谷
2021/01/18
1.8K0
超快!大数据分析引擎ClickHouse
大数据标签查询优化实战之pg_roaringbitmap
pg_roaringbitmap是一个基于roaringbitmap而实现的压缩位图存储数据插件,支持roaring bitmap的存取、集合操作,聚合等运算。
腾讯云数据库 TencentDB
2022/01/18
2.2K1
大数据标签查询优化实战之pg_roaringbitmap
Kylin、Druid、ClickHouse该如何选择?
Kylin、Druid、ClickHouse是目前主流的OLAP引擎,本文尝试从数据模型和索引结构两个角度,分析这几个引擎的核心技术,并做简单对比。在阅读本文之前希望能对Kylin、Druid、ClickHouse有所理解。
大数据老哥
2022/04/07
1.2K0
Kylin、Druid、ClickHouse该如何选择?
案例-ClickHouse在头条的技术演进
ClickHouse 是由号称“俄罗斯 Google”的 Yandex 开发而来,在 2016 年开源,在计算引擎里算是一个后起之秀,在内存数据库领域号称是最快的。大家从网上也能够看到,它有几倍于 GreenPlum 等引擎的性能优势。
smartsi
2019/08/07
4.2K0
案例-ClickHouse在头条的技术演进
画像平台人群创建方式-规则人群创建
规则圈选是按照指定条件从画像数据中找到满足要求的用户并沉淀为人群的一种常见的人群创建方式。所谓的规则就是条件的组合,比如北京市男性用户,最近一周平均在线时长介于2到10分钟之间的中老年用户。规则圈选的实现依赖画像宽表数据或者BitMap数据,其实现逻辑如图5-12所示。
张叔叔讲互联网
2023/10/18
7860
画像平台人群创建方式-规则人群创建
解决Hadoop的短板,实时大数据分析引擎ClickHouse解析
安海雄,京东系统架构师,从事架构设计与开发工作,熟悉各种开源软件架构。在Web开发、架构优化上有较丰富实战经历。
京东技术
2018/07/30
5.6K0
解决Hadoop的短板,实时大数据分析引擎ClickHouse解析
推荐阅读
相关推荐
Clickhouse在大数据分析平台-留存分析上的应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档