51CTO|苏宁6亿会员是如何做到快速精确分析的?( 二 )


但是如何在海量的用户行为日志中第一时间进行人群构建、客群洞察、再到精准地广告投放是有一定难度的 。
如果采用离线计算方案其时效性不能保障 , 可能在这期间就丢失了目标客户 , 在此场景下 , 高效、精确的计算出目标人群尤为重要 。
在引入RoaringBitmap后 , 在海量的数据中对受众人群进行全面深入的画像 , 精准投放广告 , 最终帮助企业构建了完整的数字化营销闭环 。
基于PostgreSQL实现的RoaringBitmap
苏宁在对非时序化的海量数据进行分析的场景 , 采用的是分布式HTAP数据库PostgreSQL+Citus的架构方案 。
我们将RoaringBitmap与Citus做了整合 , 将RoaringBitmap融合进了Citus集群 , 而具体的体现就是表中的一个bitmap列 , 如下图所示:
51CTO|苏宁6亿会员是如何做到快速精确分析的?
文章图片
下面简单介绍下以PostgreSQL+Citus+RoaringBitmap的技术架构方案来实现会员新、老买家的场景 。
数据字典
在进行RoaringBitmap的存储和计算的之前 , 我们首先要构建一个全局字典表 , 此表就是将要转化的维度维值跟int或long进行一个映射关系 。
将这个映射关系存储在全局字典表中 , RoaringBitmap的32位和64位选择根据实际的数据量进行抉择 。
流程设计
整体的设计流程可分为三步:
模型创建
数据摄入
数据分析
51CTO|苏宁6亿会员是如何做到快速精确分析的?
文章图片
数据模型创建流程图
模型创建流程如上图:
①模型的创建、数据初始化、以及查询我们采用的基于Citus的存储过程实现方式 , 经测试基于存储过程的方式比常用的SQL方式在性能方面有所提升 。
②分片表设计:模型中的元素是有维度、指标、bitmap组成 , Citus目前支持三种类型的表 , 分别为本地表、参考表以及分片表 , 分别应用在不同的场景 。
Citus支持Hash和Append的方式进行分片 , 以新老买家为例 , 我们以会员的member_id进行Hash分片 。
分片表设计的不仅解决了T级别的数据存储问题 , 也可以根据分片进行并行计算最后再汇总 , 提高计算效率 。
③Cube_bitmap表的创建是基于模型的 , 在后台我们有收集用户的查询方式 , 根据采集的样本数据我们会根据Cost自动的创建Cube用于加速 。
④数据分析的数据源我们会根据Cost计算从预计算结果、Cube_bitmap或模型bitmap表中获取 。
51CTO|苏宁6亿会员是如何做到快速精确分析的?
文章图片
数据摄入流程图
数据摄入流程如上图:
①数据字典同步:全量和增量的模型摄入时候需要同步更新全局字典表 。
②模型bitmap表逻辑处理(以会员为例):
第一步:模型表和字典表通过设置的业务主键Key进行关联 。
第二步:获取模型增量维度对应的会员bitmap数据信息 , 可根据rb_or_agg(rb_build(ARRAY[b.id::INT]))获取 。
第三步:将模型bitmap表里当天的(flag=1)和前一天(flag=2)统计的bitmap数据进行rb_or_agg(bitmap)操作 , 数据整合后作为当天的flag=2数据插入到bitmap表中 。
第四步:日全量统计表只有flag+statis_date+bitmap字段 , 主要统计当天的用户和历史用户bitmap情况 , 统计flag=1的当天bitmap数据 。
模型bitmap表与会员表进行关联bitmap取rb_or_agg(rb_build(ARRAY[b.id::INT])) 。
第五步:日全量统计表统计flag=2的当天bitmap数据 , 从自身表中获取当天flag=1和昨天统计的flag=2的数据然后做rb_or_agg(bitmap) 。
③Cube_bitmap、预聚合结果表的源来自于数据模型表 , 在此基础上做加速处理 。
51CTO|苏宁6亿会员是如何做到快速精确分析的?