背景
如果你是用户,当你使用抖音、小红书的时候,假如平台能根据你的属性、偏好、行为推荐给你感兴趣的内容,那就能够为你节省大量获取内容的时间。
如果你是商家,当你要进行广告投放的时候,假如平台推送的用户都是你潜在的买家,那你就可以花更少的钱,带来更大的收益。
这两者背后都有一项共同的技术支撑,那就是用户画像。
业务能力
京东科技画像系统,提供标准的画像功能服务,包含标签市场、人群管理、数据服务、标签管理等,可以将用户分群服务于其他各个业务系统。
挑战
- 数据量大
目前平台拥有百亿+的用户ID、5000+的标签,单个人群包内的用户数量可达数十亿级,每天更新的人群也有2W多个。
- 计算复杂
标签圈选的条件复杂,底层依赖的数据量级较高,人群计算需要进行大量的交并差计算。
- 查询时间短
如果人群数预估、人群创建的耗时较长,对业务方的影响较大。
- 数据存储成本高
大量的人群数据存储需要高昂的存储成本。
- 数据查询量大、性能要求高
大促期间接口调用量高达百万QPS,接口响应要求要在40毫秒以内,而且要支持批量人群调用。
压缩的Bitmap
Bitmap 是一个二进制集合,用0或1标识某个值是否存在,使用Bitmap的特点和标签、人群结果的结构高度契合,正常1亿的人群包使用Bitmap存储只需要50MB左右。
在求两个集合的交并差运算时,不需要遍历两个集合,只要对位进行与运算即可。无论是比较次数的降低(从 O(N^2) 到O(N) ),还是比较方式的改善(位运算),都给性能带来巨大的提升。
从RoaringBitmap说起
RoaringBitmap(简称RBM)是一种高效压缩位图,本质上是将大块的bitmap分成各个小桶,其中每个小桶在需要存储数据的时候才会被创建,从而达到了压缩存储和高性能计算的效果。
在实际存储时,先把64位的数划分成高32位和低32位,建立一个我们称为Container的容器,同样的再分别为高低32位创建高16位和低16位的Container,最终可以通过多次二分查找找到offset所在的小桶。
选择Clickhouse
- Clickhouse的特点
完备的数据库管理功能,包括DML(数据操作语言)、DDL(数据定义语言)、权限控制、数据备份与恢复、分布式计算和管理。
列式存储与数据压缩: 数据按列存储,在按列聚合的场景下,可有效减少查询时所需扫描的数据量。同时,按列存储数据对数据压缩有天然的友好性(列数据的同类性),降低网络传输和磁盘 IO 的压力。</