用户画像的数据存储的技术选型有多种,不同存储方式适用于不同场景。主要有Hive、MySQL、HBase、Elasticsearch。
如果将用户标签开发成一个大宽表,那么这个宽表每天ETL作业将会耗费大量时间,所以一般数据会这样执行:1、分区存储,分别执行作业;2、标签脚本性能调优;3、基于一些标签的共同数据来源,开发中间表。
一般地,我们只保留最近一段时间的日全量数据,我们可以规定比如删除30天以前的数据,这样来节省存储的空间。应用到画像产品中,就是当我们输入用户id后通过直接查询上表,即可解析标签ID及对应的标签权重,可在画像产品前端展示该用户的相关信息,如下图:
一、Hive数据仓库
Hive是基于Hadoop的一个数据仓库工具,依赖于HDFS存储数据,可以将结构化的数据文件映射为一张数据库表,提供SQL语言查询存储在HDFS中的数据。一般使用Hive作为数据仓库用来存储标签、用户特征库等相关数据。适合大数据量的批量作业,主要用来做离线数据分析,比直接用MapReduce开发效率更高。
1.数据仓库
在数仓建模过程中,主要是设计事实表和维度表的建模开发。在画像系统中主要使用Hive作为数据仓库,开发相应的事实表和维度表来存储标签、人群、应用到服务层的相关数据。
a.事实表
事务事实表:用于描述业务过程,按业务过程的单一或多业务过程可进一步分为单事务事实表和多事务事实表。
周期快照事实表:在一个确定的时间段内对业务状态进行度量。例如:查看一个用户近1年的付款金额、近1年购物次数、近30天登录天数等。
累计快照事实表:对不同的事件之间的时间间隔进行度量。例如:用户从购买到支付的时长、从下单到订单完结的时长。一般用于统计时间周期明显的业务过程。
b.维度表
维度表是对事实属性的各个维度的描述。例如,商标维度包括:价格、折扣、品牌、原厂家、型号等方面的信息。维度表的开发中,经常遇到维度缓慢变化的情况,对于缓慢变化维,一般采用:
① 重写维度值,对历史数据进行覆盖;
② 保留多条数据,通过插入维度列字段区分;
③ 开发日期分区表,每日分区数据积累当日维度的属性;
④ 开发拉链表,按时间变化进行全量存储等方式处理。
2、ID-MAP
用来做人群映射的。开发用户标签的时候,需要把用户不同来源的身份通过数据手段识别为同一主体,即ID-Mapping。用户的属性、行为相关数据分散在不同来源中,通过ID-Mapping能够把不同场景下的数据联系到一起,消除数据孤岛。即通过ID-Mapping打通userid和cookieid的对应关系。
在设计ID-Mapping表时,由于一个用户可在多个设备登录,一个设备也可以被多个用户登录,所以考虑用缓慢变化维表来记录不同时间点的状态变化,如下,记录一个事物从开始到当前状态的全部状态变化信息。
① 从埋点表和访问日志表获取到cookieid和userid同时出现的访问记录;
② 将获取到的userid和cookieid插入cookieid-userid关系表;
③ 创建ID-Map拉链表,将每天新增到cookie表的数据与拉链表历史数据做笔记,若有变化或新增,则更新拉链表;
④ 创建完成后,每天ETL调度将数据更新到ID-Mapping拉链表中。
⑤ 对于拉链表,可查看某日的快照数据,以查看某个用户在某天关联到的设备id。
对于实际开发中,还需要考虑用户在不同平台间(如Web端和App端)的打通情况。
二、MySQL
MySQL是关系型数据库,在用户画像系统中可用于元数据管理、监控预警数据、结果集存储等应用中。对于量级较小(例如小于百万)的数据,MySQL具有更快的读写速度,web端产品读写MySQL数据库能够更快的反应。例如元数据、监控预警数据、结果集等可存储在MySQL中。
1、元数据管理
平台标签视图中的标签元数据可存储在MySQL关系数据库中,便于便签编辑、查询、管理。
2、监控预警数据
MySQL还可以用于存储每日对ETL结果的监控信息。从标签计算数据的监控,到服务层同步数据的监控。
① 标签计算数据监控
监控每天标签ETL的数据量,若有异常则发送警告通知,同时暂停后续任务。
② 服务层同步数据监控
即将标签相关数据从Hive数仓像服务层同步数据的监控。服务层一般采用HBase、Elasticsearchzuo作为数据库存储标签数据供线上调用。当相关数据在Hive中的数量不等于同步到服务层后的数量,则会触发警告。
3、结果集存储
在打通画像业务与业务系统时,考虑将hive中的用户标签同步到各个业务系统中,此时MySQL可以用来存储结果集。
Sqoop是一个用来将Hadoop和关系型数据库中的数据相关迁移的工具,它可以将关系型数据库中的数据导入Hadoop的HDFS中,也可将HDFS中的数据导入关系型数据库中。
三、HBase
HBase是存储线上接口实时调用的数据,是高性能、列存储、可伸缩、实时读写的分布式存储系统,运行在HDFS上。Hive是跑MapReduce任务离线查询,适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。HBase 则适合用来进行大数据的实时查询,例如 Facebook 用 HBase 进行消息和实时的分析。
画像系统中每天在Hive里跑出的结果集数据可同步到HBase数据库,用于线上实时应用的场景。
1、应用场景
弹窗广告:某渠道运营人员为促进未注册的新安装用户注册、下单,计划通过App首页弹窗发放红包或优惠券的方式进行引导注册。
① 通过组合用户标签(如“”“未注册用户”“”“按照据今天数”小于7天)筛选出对应用户群,然后将对于人群推送到“广告系统”,这样每天画像系统的ETL调度完成后对应的人群数据会推送到HBase数据库进行存储。
② 当满足条件的新用户来访App时,由在线接口读取HBase数据库,查询到该用户时就会为其推送该弹窗。
四、Elasticsearch
Elasticsearch存储标签用于人群计算和人群多维透视分析,是一个开源的分布式全文检索引擎,开源近乎实时地存储、检索数据。而且扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。对于用户标签查询、用户分群计算、用户群多维透视分析这类时间响应要求极高的场景适用。
Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用json作为文档格式。
1、应用场景
① 在每天的ETL调度中,将Hive计算的标签数据导入Elasticsearch中。
② 在标签调度完成且通过校验后(标签监控预警完成),将标签数据同步到Elasticsearch中。
③ 在与elasticsearch数据同步完成并通过校验后,向在MySQL维护的状态表中插入一条状态记录,表示当日数据可用,线上计算用户人群的接口则读取最近的数据。
④ 如果当天因为调度延迟或其他原因没有及时将当日数据导入Elasticsearch,接口也能读取最近一天对于的数据。如当日数据产出正常时,state字段=0,异常=1,。图1月20日异常时,线上接口扫描该状态记录后不读取1月20日的数据,而是读取前一天的数据。
③ 为避免从Hive到Elasticsearch中灌入数据时发生数据缺失,在像MySQL状态表更新状态位前需要校验elasticsearch与Hive中的数据是否一致。
④ Hive中的用户标签灌入Elasticsearch中后,业务人员在画像产品端计算人群或分析人群时,通过RESTful API访问Elasticsearch进行计算。
总结:
· ES存储标签用于人群计算和人群多维透视分析,满足用户画像产品的查询、分析、使用,查询时间秒级;
· HBase存储线上接口实时调用的数据,满足线上服务的实时调用,查询时间亚秒级;
· MySQL存储元数据,监控数据及结果集数据,查询时间秒级;
· Hive存储数据相关标签表,人群计算表的表结构设计,跑大数据作业。
参考资料:
《用户画像:方法论与工程化解决方案》赵宏田 著