本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者亲绘大数据生态圈思维导图…持续更新,欢迎star!
前言
上一篇文章已经为大家介绍了 MySQL 在用户画像的标签数据存储中的具体应用场景,本篇我们来谈谈 HBase 的使用!
原著作者:赵宏田
来源:《用户画像方法论与工程化解决方案》
HBase存储
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的原则如下:
- 是否具有相似的数据格式
- 是否具有相似的访问类型
常用的增删改查命令如下:
1)创建一个表,指定表名和列簇名:
create '<table name>','<column family>'
2)扫描表中数据,并显示其中的10条记录:
scan '<table name>',{
LIMIT=>10}
3)使用get命令读取数据:
get '<table name>','row1'
4)插入数据:
put '<table name>','row1','<colfamily:colname>','<value>'
5)更新数据:
put '<table name>','row ','Column family:column name','new value'
6)在删除表之前先将其禁用,然后删除:
disable '<table name>'
drop '<table name>'
下面通过一个案例来介绍HBase在画像系统中的应用场景和工程化实现方式。
2. 应用场景
渠道运营人员为促进未注册的新安装用户注册、下单,计划通过App首页弹窗(如下图所示)发放红包或优惠券的方式进行引导。在该场景中可通过画像系统实现对应功能。
业务逻辑上,渠道运营人员通过组合用户标签(如“未注册用户”和“安装距今天数”小于××天)筛选出对应的用户群,然后选择将对应人群推送到“广告系统”,这样每天画像系统的ETL调度完成后对应人群数据就被推送到HBase数据库进行存储。满足条件的新用户来访App时,由在线接口读取HBase数据库,在查询到该用户时为其推送该弹窗。
下面通过某工程案例来讲解HBase在该触达用户场景中的应用方式。
3. 工程化案例
运营人员在画像系统中根据业务规则定义组合用户标签筛选出用户群,并将该人群上线到广告系统中。
在业务人员配置好规则后,下面我们来看在数据调度层面是如何运行的。
用户标签数据经过ETL将每个用户身上的标签聚合后插入到目标表中,如dw.userprofile_userlabel_map_all
。聚合后数据存储为每个用户id,以及他身上对应的标签集合,数据格式如图所示:
接下来需要将 Hive 中的数据导入HBase,便于线上接口实时调用库中数据。
HBase的服务器体系结构遵循主从服务器架构(如图所示),同一时刻只有一个HMaster处于活跃状态,当活跃的Master挂掉后,Backup HMaster自动接管整个HBase集群。在同步数据前,首先需要判断HBase的当前活跃节点是哪台机器。