目录
注:此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供学习使用
0. 相关文章链接
1. HBase简介
HBase是一个高性能、列存储、可伸缩、实时读写的分布式存储系 统,同样运行在HDFS之上。与Hive不同的是,HBase能够在数据库上实 时运行,而不是跑MapReduce任务,适合进行大数据的实时查询。
画像系统中每天在Hive里跑出的结果集数据可同步到HBase数据库,用于线上实时应用的场景。
下面介绍几个基本概念:
- row key:用来表示唯一一行记录的主键,HBase的数据是按照 row key的字典顺序进行全局排列的。访问HBase中的行只有3种方式:
- 通过单个row key访问;
- 通过row key的正则访问;
- 全表扫描
由于HBase通过rowkey对数据进行检索,而rowkey由于长度限制的因素不能将很多查询条件拼接在rowkey中,因此HBase无法像关系数据 库那样根据多种条件对数据进行筛选。一般地,HBase需建立二级索引 来满足根据复杂条件查询数据的需求。
Rowkey设计时需要遵循三大原则:
- 唯一性原则:rowkey需要保证唯一性,不存在重复的情况。在 画像中一般使用用户id作为rowkey。
- 长度原则:rowkey的长度一般为10-100bytes。
- 散列原则:rowkey的散列分布有利于数据均衡分布在每个 RegionServer,可实现负载均衡。
- columns family:指列簇,HBase中的每个列都归属于某个列 簇。列簇是表的schema的一部分,必须在使用表之前定义。划分 columns family的原则如下:
- 是否具有相似的数据格式;
- 是否具有相似的访问类型。
常用的增删改查命令如下。
- 创建一个表,指定表名和列簇名:
- create '<table name>','<column family〉'
- 扫描表中数据,并显示其中的10条记录:
- scan '<table name>',{LIMIT=>10}
- 使用get命令读取数据:
- get '<table name>','row1'
- 插入数据:
- put '<table name>','row1','<colfamily:colname>','<value>'
- 更新数据:
- put '<table name>','row ','Column family:column name','new value'
- 在删除表之前先将其禁用,然后删除:
- disable '<table name>' drop '<table name>'
2. 应用场景
某渠道运营人员为促进未注册的新安装用户注册、下单,计划通 过App首页弹窗(如图3-15所示)发放红包或优惠券的方式进行引导。 在该场景中可通过画像系统实现对应功能。
业务逻辑上,渠道运营人员通过组合用户标签(如“未注册用 户”和“安装距今天数”小于XX天)筛选出对应的用户群,然后选 择将对应人群推送到“广告系统”(产品功能详见7.4节),这样每天 画像系统的ETL调度完成后对应人群数据就被推送到HBase数据库进行 存储。满足条件的新用户来访App时,由在线接口读取HBase数据库, 在查询到该用户时为其推送该弹窗。
下面通过某工程案例来讲解HBase在该触达用户场景中的应用方式。
3. 工程化案例
运营人员在画像系统中根据业务规则定义组合用户标签筛选出用户群,并将该人群上线到广告系统中(如下图所示)。
在业务人员配置好规则后,下面我们来看在数据调度层面是如何运行的。
用户标签数据经过ETL将每个用户身上的标签聚合后插入到目标表 中,如dw.userprofile_userlabel_map_all。聚合后数据存储为每个用户id,以及他身上对应的标签集合,数据格式如下图所示。
接下来需要将Hive中的数据导入血256,便于线上接口实时调用库中数据。
HBase的服务器体系结构遵循主从服务器架构(如下图所示), 同一时刻只有一个HMaster处于活跃状态,当活跃的Master挂掉后, Backup HMaster自动接管整个HBase集群。在同步数据前,首先需要判 断HBase的当前活跃节点是哪台机器。
在写入数据时为避免数据都写入一个region,造成HBase的数据倾斜问题。在当前HMaster活跃的节点上,创建预分区表:
create 'userprofile_labels', { NAME => "f", BLOCKCACHE => "true" , BLOOMFILTER => "ROWCOL" , COMPRESSION => 'snappy', IN_MEMORY => 'true' }, {NUMREGIONS => 10,SPLITALGO => 'HexStringSplit'}
将待同步的数据写入HFile,HFile中的数据以key-value键值对方 式存储,然后将HFile数据使用BulkLoad批量写入HBase集群中。具体脚本可以自行百度,使用的是批量加载方式将HFile中数据bulkload到HBase中。
在线接口在查询HBase中数据时,由于HBase无法像关系数据库那 样根据多种条件对数据进行筛选(类似SQL语言中的where筛选条 件)。一般地HBase需建立二级索引来满足根据复杂条件查询数据的需求,可以选择使用Elasticsearch存储HBase索引数据(如下图)。
在组合标签查询对应的用户人群场景中,首先通过组合标签的条 件在Elasticsearch中查询对应的索引数据,然后通过索引数据去 HBase中批量获取rowkey对应的数据(Elasticsearch中的documentid 和HBase中的rowkey都设计为用户id)。
为了避免从Hive向HBase灌入数据时缺失,在向HBase数据同步完成后,还需要校验HBase和Hive中数据量是否一致,如出现较大的波动则发送告警信息。
在将userid作为rowkey存入HBase中时,一方面在组合标签的场景中可以支持条件查询多用户人群,另一方面可以支持单个用户标签 的查询,例如查看某id用户身上的标签,以便运营人员决定是否对其 进行运营操作。HBase在离线数仓环境的服务架构如下图所示。
注:再次声明,此博文为根据 赵宏田 老师的 用户画像·方法论与工程化解决方案 一书读后笔记而来,仅供学习使用
注:其他相关文章链接由此进 -> 用户画像文章汇总