HBase 学习第 6 天:HBase 数据结构及 RowKey 设计原则
HBase 数据结构由RowKey、Column Family、Cell、Time Stamp、命名空间等部分组成,以下的内容对 HBase 数据结构作详细介绍。

一、RowKey

和关系型数据库一样,HBase 数据库中也有一个表示唯一的键,这个唯一的键是 RowKey,HBase 中管道 RowKey 是用来检索记录的主键,它具有唯一性。HBase 中行的访问方式如下:

  1. scan:全表扫描(在 HBase 学习第五天有具体描述)
  2. get:单个 RowKey 访问(检索单挑记录)
  3. like:通过 RowKey 的range(正则表达式)访问
  • RowKey 组成:HBase 中 RowKey 由任意字符串组成,组成长度不超过 64KB ,在实际应用中长度一般为10-100bytes,一般用到70-100bytes就能满足需求
  • 在HBASE内部,RowKey保存为字节数组。存储时,数据按照RowKey的字典序(byte order)排序存储。设计RowKey时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

二、Column Family

列族: HBase 中的每个列,都属于某一个列族,列族必须在使用表之前定义,列名都以列族作为前缀,例如:‘name:zhangsan’,‘name:lisi’,其中列族是 name ,而列族的值为 ‘zhangsan’ 和 ‘lisi’

三、Cell

cell 是细胞的意思, HBase 中的 Cell表示的是表中的单元格
由{rowkey, column Family:columu, version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。
其中 version 就是这个单元格中的 Time Stamp

四、Time Stamp

HBASE 中通过rowkey和columns确定的为一个存贮单元称为cell。每个 cell都保存 着同一份数据的多个版本。版本通过时间戳来索引。时间戳的类型是 64位整型。时间戳可以由HBASE(在数据写入时自动 )赋值,此时时间戳是精确到毫秒 的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版 本冲突,就必须自己生成具有唯一性的时间戳。每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。

为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,HBASE提供 了两种数据版本回收方式。一是保存数据的最后n个版本,二是保存最近一段 时间内的版本(比如最近七天)。用户可以针对每个列族进行设置。

五、命名空间

  1. Table:表,所有的表都是命名空间的成员,即表必属于某个命名空间,如果没有指定,则在default默认的命名空间中。

  2. RegionServer group:一个命名空间包含了默认的RegionServer Group。

  3. Permission:权限,命名空间能够让我们来定义访问控制列表ACL(Access Control List)。例如,创建表,读取表,删除,更新等等操作。

  4. Quota:限额,可以强制一个命名空间可包含的region的数量。

六、HBase RowKey 设计原则

hbase 数据存储时,要考虑把重要的信息放左边,不重要的信息放到右边。这样可以提高查询数据的速度。这样,最重要的提高索引速度的就是设计合适的rowkey。

1. 唯一性原则

保证 rowkey 的唯一性,它是 RowKey 设计的首要原则。

2.长度原则

RowKey 设计的长度最大不能超过64K。
RowKey 设计太长的影响有两点

  • 一是极大影响了 HFile 的存储效率
  • 二是缓存 memstore 不能得到有效利用,缓存不能存放太多的信息,造成检索效率的降低。

3. 独自一条原则

尽量保证经常一起用的 RowKey 存储在同一个 Region 上,这样有助于提升检索效率。但要避免热点问题。具体的热点问题以及解决方案在后面的文章中有详细介绍,敬请期待……

4.常用的检索的rowkey

RowKey 检索尽量使用高表(行多列少),而不选择宽表(列多行少)。

总结

本节对 HBase 数据结构以及 HBase 的 RowKey 设计原则作简单描述,记录学习的点滴,为后面成为更好的自己做铺垫。

本文参考:https://blog.csdn.net/m0_37294838/article/details/89736345

相关文章: