Hbase作者为什么允许一张表可以有多个列簇?

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: HBase的设计目标是海量,高吞吐存储。数据在底层是基于LSMT那一套的实现(当然分了很多region,支持分布式)。简单来说,要维护一套memstore + 可分裂的filestore的存储,差不多就是:新数据写入/更改先写入WAL,然后进入memstorememstore满了就进filestorefilestore太大了就分裂而这一套机制实现的单位是column family——每个column family有自己的memstore和filestore。尽管在高层上看起来是同一张表,但是表里每一个column family的存储都是相互独立的。如果和mysql比较的话,colum

HBase的设计目标是海量,高吞吐存储。数据在底层是基于LSMT那一套的实现(当然分了很多region,支持分布式)。简单来说,要维护一套memstore + 可分裂的filestore的存储,差不多就是:

新数据写入/更改先写入WAL,然后进入memstore
memstore满了就进filestore
filestore太大了就分裂
而这一套机制实现的单位是column family——每个column family有自己的memstore和filestore。尽管在高层上看起来是同一张表,但是表里每一个column family的存储都是相互独立的。如果和mysql比较的话,column family更像是mysql里的table,而hbase的table更像是mysql里的一个db。如果同时查询同一个hbase table的不同column family,大概等价于不同mysql table之间基于row key做了一个join。

那到底为啥要区分column family呢?

3个原因:

访问的方式不一样(access pattern )。试想一下用hbase存储一个产品的信息,比如A列是产品详情。这个详情可能非常大,但是并不会经常变。而B列是产品的关注次数,会频繁地随着用户点击“关注“/“取消关注”而变化。对于hbase来讲,新的数据更新总会进入memstore,然后满了就会写filestore。如果A和B在一个column family,那么这个写入的过程是要A和B两列都要写的。但实际上A的数据可能压根就没变,所以直观上A列的写入浪费了IO。如果A和B拆到两个column family,那么B的手游拍卖更改只会引发他自己的filestore写入。
压缩(compression)方式不一样。HBase允许为每个column family配置一个compressor。问题是不同数据类型适合的压缩方式不一样。比如文本很适合压缩。但是类似于jpg和png这种图片就不适合——它们的数据本身已经是被压缩的了,再压一遍只是浪费CPU而已。但是如果不同类型数据在同一个column family,就意味着它们要共享同一个压缩方式。这时也许需要考虑将他们拆开成不同的column family。
权限管理。HBase的ACL控制可以定义每个column family可以定义不同的权限。所以如果有希望一拨人能访问列A、B、C,另外一拨人访问列D、E、F这样的需求,可以考虑使用column family。
那么为什么一般都不建议弄很多个column family呢?因为太多了会影响性能,比如做file compact和file splict时,备选的文件会增多(记得每个column family都会增加一批文件);比如说memstore里要为每个column family分配一部分空间。毕竟我们用HBase的原因是希望他能高吞吐明显影响性能就得不偿失了。于是乎设计时就要折衷,比如上面产品详情和关注数的例子,我们是可以考虑直接拆成两个HBase table然后再进行app join的。

总之,trade off is everything

相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
5月前
|
机器学习/深度学习 分布式计算 Hadoop
一种HBase表数据迁移方法的优化
一种HBase表数据迁移方法的优化
52 0
|
存储 缓存 分布式计算
【Hbase】(十一)详解 HBase 表的设计原则
【Hbase】(十一)详解 HBase 表的设计原则
962 0
【Hbase】(十一)详解 HBase 表的设计原则
|
7天前
|
SQL Java 分布式数据库
实现HBase表和RDB表的转化(附Java源码资源)
该文介绍了如何将数据从RDB转换为HBase表,主要涉及三个来源:RDB Table、Client API和Files。文章重点讲解了RDB到HBase的转换,通过批处理思想,利用RDB接口批量导出数据并转化为`List<Put>`,然后导入HBase。目录结构包括配置文件、RDB接口及实现类、HBase接口及实现类,以及一个通用转换器接口和实现。代码中,`RDBImpl`负责从RDB读取数据并构造`Put`对象,`HBaseImpl`则负责将`Put`写入HBase表。整个过程通过配置文件`transfer.properties`管理HBase和RDB的映射关系。
22 3
实现HBase表和RDB表的转化(附Java源码资源)
|
10月前
|
存储 Java Shell
分布式数据库HBase的常用操作的基本Shell命令的表操作
HBase是一个分布式数据库系统,支持高性能、可伸缩、实时的数据存储和处理。在HBase中,我们可以使用Shell命令来进行常用的操作,如创建表、插入数据、查询数据、更新数据等。本文将介绍关于分布式数据库HBase的常用操作基本Shell命令的表操作。
144 0
|
SQL 缓存 分布式计算
HBase查询一张表的数据条数的方法
HBase查询一张表的数据条数的方法
802 0
HBase查询一张表的数据条数的方法
|
存储 分布式数据库 开发者
HBase表设计_8 | 学习笔记
快速学习 HBase表设计_8
117 0
|
存储 分布式数据库 开发者
HBase 表设计_7 | 学习笔记
快速学习 HBase 表设计_7
104 0
|
分布式数据库 开发者 Hbase
HBase 表设计_6 | 学习笔记
快速学习 HBase 表设计_6
101 0
|
存储 大数据 Java
HBase 表设计_5 | 学习笔记
快速学习 HBase 表设计_5
97 0
|
分布式数据库 开发者 Hbase
HBase 表设计_4 | 学习笔记
快速学习 HBase 表设计_4
103 0