HBase 物理模型

概念视图

HBase以表的形式存储数据。表有行键、时间戳和列族组成。列族划分为若干个列。其结构如下:
HBase 物理模型
HBase 物理模型
HBase 物理模型

基本概念

表(Table)

HBase采用表来组织数据,表由许多行和列组成,列划分为多个列族。
特点:

  • 大:一个表可以是10亿行,上百万列。
  • 面向列:面向列(族)的存储和权限控制,列(簇)独立检索。(提升查询的性能)
  • 稀疏:对于空(null)的列,并不占用空间,因此,表可以设计非常稀疏。
  • 无严格模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列。(读写的时候,都会做格式校验)

行(Row)

在表里面,每一行代表着一个数据对象。每一行都是由一个行键(Row Key)和一个或者多个列组成的。行键是行的唯一标识,行键并没有什么特定的数据类型,以二进制的字节来存储,按字母顺序排序

因为表的行是按照行键顺序来进行存储的,所以行键的设计相当重要。设计行键的一个重要原则就是相关的行键要存储在接近的位置,例如,设计记录网站的表时,行键需要将域名反转(例如,org.apache.www、org.apache.mail、org.apache.jira),这样的设计能使与 apache 相关的域名在表中存储的位置非常接近。

行键(Rowkey)

  • hbase本质上也是一种Key-Value存储系统。Key相当于RowKey,Value相当于列族数据的集合。
  • 与非关系型数据库们一样,row key是用来检索记录的主键。
  • 访问hbase table中的行,只有三种方式:通过单个行键获取单行数据通过一个行键的区间来访问给定区间的多行数据全表扫描
  • Row key行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,row key保存为字节数组
  • 存储时, 数据按照Rowkey的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)

列(Column)

列由列族(Column Family)和列限定符(Column Qualifier)联合标识,由“:”进行间隔。

列族(Column Family)

  • hbase表中的每个列,都归属与某个列族。
  • 列族是表的schema的一部分(而列不是),列族必须在使用表之前定义
  • 列名都以列族作为前缀。例如courses:history , courses:math 都属于 courses 这个列族。
  • 访问控制、磁盘和内存的使用统计都是在列族层面进行的。实际应用中,列族上的控制权限能帮助管理不同类型的应用:允许一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因不能浏览所有数据)。
  • 开发过程中,一般建议 列族的数量不要超过3个。不建议跨列族查询。
  • 列族一旦确定后,就不能轻易修改,因为它会影响到 HBase 真实的物理存储结构,但是列族中的列限定符及其对应的值可以动态增删。
  • 表中的每一行都有相同的列族,但是不需要每一行的列族里都有一致的列限定符,所以说是一种稀疏的表结构,这样可以在一定程度上避免数据的冗余。
  • 一个列族的所有列成员都有着相同的前缀,例如,courses:history 和 courses:math 都是列族 courses 的成员。“:”是列族的分隔符,用来区分前缀和列名。
  • 列族必须在表建立的时候声明,列随时可以新建。

列限定符(Column Qualifier)

  • 列族中的数据通过列限定符来进行映射。
  • 列限定符不需要事先定义,也不需要在不同行之间保持一致。
  • 列限定符没有特定的数据类型,以二进制字节来存储。

单元(Cell)

  • 由{row key, column( = + < label>), version} 唯一确定的单元。即HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格。
  • 存储在单元里的数据称为单元数据,没有特定的数据类型,以二进制字节来存储。
  • cell中的数据是没有类型的,全部是字节码形式存贮。
  • 每个 cell都保存着同一份数据的多个版本,版本通过时间戳来索引

时间戳(Timestamp)

  • 时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值
  • 如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳
  • 每个 cell中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面
  • 为了避免数据存在过多版本造成的的管理 (包括存贮和索引)负担,hbase提供了两种数据版本回收方式:
    a. 保存数据的最后n个版本
    b. 保存最近一段时间内的版本(比如最近七天)
    用户可以针对每个列族进行设置