HBase2.0重新定义小对象实时存取

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
简介: 小对象,特别指1K~10MB范围的数据,比如图片,短视频,文档等广泛的存在于人工智能,医疗,教育,生活分享,电子商务等领域。HBase2.0在MOB技术的加持下重新定义小对象实时存取,具有低延迟,读写强一致,检索能力强,水平易扩展等关键能力

小对象,特别指1K~10MB范围的数据,比如图片,短视频,文档等。这些数据广泛的存在于人工智能,医疗,教育,生活分享,电子商务等领域。目前对象存储典型技术方案为AWS的S3以及阿里云的OSS,还有一些基于MySQL+对象存储的二次开发方案。这些方案解决了对象存储的可靠性和扩展性问题,但是存在一些缺陷:两个方案都存在访问延时问题,因为访问数据至少要2次查询,一次索引访问+一次数据访问,特别的当用户想查询一组有关联数据的时候,需要N次调用;对象存储很难将对象和一些维度、指标数据混合存储,而这些是查询时过滤数据的条件,导致对象存储的方案在检索能力上不足;MySQL+对象存储方案将维度、指标数据存储在Mysql解决了检索能力,但是引入了数据不一致问题,实现主备双活也非常困难,造成可用性上的缺陷,同时这个方案对用户代码侵入大,对运维也不友好。本文将介绍一种全新的小对象实时存取解决方案:HBase2.0,在MOB技术的加持下,HBase2.0将重新定义小对象实时存取,消除以上两个方案的缺陷,具有低延迟,读写强一致,检索能力强,水平易扩展等关键能力

本文将以一条sql展开小对象实时存取的方案演进,介绍不同架构的优缺点。然后提供人工智能和医疗方面两个采用HBase2.0的案例分析。最后总结小对象实时存取的最佳实践。

查询场景定义

用户表T:包含三个属性S1、S2、S3,属性的大小为50bytes左右,包含一个对象数据Object从100KB~10MB

查询:以S1、S2、S3为条件查询Object

select Object from T where S1 = xxx and S2 > yyy and S3 < zzz

对象存储解决方案

对象存储的模型是KV,设计逻辑表为:S1+S2+S3 => Object,将S1、S2、S3组合成一个key

查询实现

// Bucket是对象存储概念,可以理解为对象的一个集合或者表
// 对象存储支持前缀检索,下面表示按“S1 = xxx and S2 > yyy”查找元数据
List keys = GetBucket(key >= xxx+yyy)

// 用户需要自己写代码实现对S3属性列的条件过滤
filterByS3(keys, zzz)

// 依次读取出Object
for(key : keys) {
   GetObject(key);
   // do something
}

对象存储总结:

优势:

  • 读写强一致
  • 支持水平扩展

劣势:

  • 实时性差,一次请求要查询N次服务器(一次检索对象列表+n次对象读取)
  • 检索能力不足,仅支持key的前缀检索,还需要用户端增加检索逻辑;
  • 当属性列增多,特别是动态增加的情况下,对象存储很难支持(key会变得非常复杂)

MySQL+对象存储解决方案

将属性列存储在MySQL,Object存储在对象存储,通过一个引用列进行关联

image.png | left | 438x181

查询实现:

List references = select reference from T where S1 = xxx and S2 > yyy and S3 < zzz

// 依次读取出Object
for(Key : references) {
   oss.GetObject(key);
   // do something
}

MySQL+对象存储总结:

优势:

  • 检索能力强
  • 支持索引

劣势:

  • 实时性差,一次请求要查询N次服务器(1次查MySQL+n次查对象存储)
  • 读写存在不一致问题,需要额外的开发保证写MySQL和写对象存储的事务一致性
  • 不支持动态属性列的增加
  • 运维复杂

HBase解决方案

S1+S2组合作为Rowkey存储,S3属性和Object作为普通列

Rowkey 普通列 普通列
S1+S2 S3 Object

查询实现

Scan scan = new Scan();
scan.setStartKey(S1+S2); // 按S1+S2前缀查询
scan.setFilter(S3); // 利用Filter过滤S3
scan.addColumn(Object); // 返回Object列
List objects = T.scan(scan); // 一次查询即返回所有结果

HBase方案总结:

优势

  • 实时查询,延迟低
  • 读写强一致
  • 检索能力强:支持过滤器Filter;支持索引(通过Phoenix提供索引能力)
  • 业务代码简洁
  • 支持动态列,可以随意增加属性列
  • 支持水平扩展
  • 易于维护

HBase2.0 小对象存储经典案例

下面通过两个案例介绍HBase2.0给业务带来的改变与价值

案例1:某人工智能公司,利用HBase实现查询延迟从10秒提升到20ms,性能提升500倍,满足了业务对实时查询的强需求。

场景:存储人脸图片数据,每个脸有一个ID,人脸按一定逻辑进行分组;请求场景为读取每个组的全量数据
1、其中 45% 左右的组含有1张人脸
2、45%左右的组含有 2 ~ 9张人脸数据
3、其余的组人脸数范围为 10 ~ 10019
4、其中每个脸2.4k

优化前架构为MySQL+OSS,当一个组有1000张人脸时,查询大概在10s

MySQL_OSS

使用HBase作为存储,将每个组的数据存储在同一行,设计如下:

Rowkey 普通列 普通列 普通列 普通列
组ID 人脸ID1 人脸ID2 ... 人脸IDn

查询时通过一次请求即可获取所有人脸:Table.get(组ID),1000张脸耗时20ms

HBase

案例2:某医疗公司,HBase解决10亿规模,200TB检验报告数据的实时存取需求

场景:查询某个用户最近的一次检查报告;或者查询某个用户的多个历史检查报告
1、用户规模10亿+
2、每一个用户会有一个或多个检查报告,每一个报告会有一个时间戳
3、其中每一个报告在200KB左右
4、要求存储可以水平扩展

HBase表设计

rowkey 普通列
用户ID +(Long.max-时间戳) 检查报告

查询

  • 查询某个用户最近的一次检查报告:Scan(用户ID).Limit(1)
  • 查询某个用户的多个历史检查报告:Scan(用户ID).Limit(N)

HBase小对象存储最佳实践

  • 20KB一下的小对象直接存储,50KB以上的小对象需要开启MOB特性,20KB~50KB之间的情况按需开启MOB并调整MOB的阈值大小(操作方式在下面)
  • 对于逻辑上关联的对象,特别是查询时经常一起返回的,可以考虑存储在同行不同列;或者保持相同的rowkey前缀,这样可以通过一个Scan来查询数据
  • 对于属性列非常多,查询条件复杂的场景,可以利用Phoenix构建索引
  • 把属性列和对象列放在不同的column family下

MOB特性介绍

MOB在HBase2.0版本引入,解决了HBase在存储小对象上的写放大问题,关于MOB技术原理已经有文章介绍:MOB技术原理

MOB是服务端功能,如果用户使用云HBase则不需要关心细节,只需要提出需求即可;如果是自己运维,那么开启MOB功能仅需要一条命令:alter 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 
102400} 其中IS_MOB表示开启功能,MOB_THRESHOLD表示多大的数据被认为是MOB对象,单位是byte

总结

HBase2.0重新定义了小对象实时存取的业务访问方式,不再是索引+对象的多次查询,提供简洁的一体化解决方案。具有低延迟,读写强一致,检索能力强,水平易扩展等关键能力;并且具备动态列,多版本等灵活的功能;最后一体化的解决方案简化了用户端的代码,也减少了服务端的运维成本。

未来展望:数据的快速响应能力是支持实时业务的核心,但是同时成本也是业务保持竞争优势的关键。对象存储通常具有较大规模,几百TB是常见。数据天然具有冷热之分,利用这一点,HBase可以内部对数据进行划分,将访问频率低的数据转移到OSS以获得更低的存储成本。同时,在对象数据的大小分布不均的场景中,HBase可以将超大数据存储在OSS,降低长尾数据的影响。以上的工作都会对业务透明。

最后欢迎大家体验HBase2.0,点击进入阿里云HBase2.0官网

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
缓存 大数据 分布式数据库
HBase技术与应用实践 | HBase2.0重新定义小对象实时存取
本次分享来自中国HBase技术社区第七届MeetUp成都站,分享嘉宾天引 阿里巴巴 技术专家专注在大数据领域,拥有多年分布式、高并发、大规模系统的研发与实践经验,先后参与HBase、Phoenix、Lindorm等产品的内核引擎研发,目前负责阿里上万节点的HBase As a Service的发展与落地。
2003 0
|
1月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
102 0
|
10月前
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
158 0
|
13天前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储Hbase高可靠性
【6月更文挑战第2天】
27 2
|
13天前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储Hbase面向列
【6月更文挑战第2天】
13 2
|
13天前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储HBase设计目的
【6月更文挑战第2天】
24 6
|
21天前
|
分布式计算 安全 Hadoop
HBase Shell-org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 已解决
在HBase Shell遇到错误时,检查Hadoop非安全模式:`hdfs dfsadmin -safemode get`。问题解决在于`hbase-site.xml`中添加配置:Zookeeper客户端端口设为2181和预写日志提供者设为filesystem。
|
1月前
|
分布式计算 Hadoop Java
Hbase2.2.2在线安装配置(对应Hadoop 3.1.3)
Hbase2.2.2在线安装配置(对应Hadoop 3.1.3)
58 2
|
1月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
61 0
|
1月前
|
分布式计算 监控 Hadoop
Ganglia监控Hadoop与HBase集群
Ganglia监控Hadoop与HBase集群