一、基本概念
一个典型的 Hbase Table 表如下:
Row Key
是用来检索记录的主键。想要访问 HBase Table 中的数据,只有以下三种方式:
Row Key
进行访问;Row Key
可以是任意字符串,存储时数据按照 Row Key
的字典序进行排序。这里需要注意以下两点:
HBase 表中的每个列,都归属于某个列族。列族是表的 Schema 的一部分,所以列族需要在创建表时进行定义。列族的所有列都以列族名作为前缀,例如 courses:history
,courses:math
都属于 courses
这个列族。
列限定符,你可以理解为是具体的列名,例如 courses:history
,courses:math
都属于 courses
这个列族,它们的列限定符分别是 history
和 math
。需要注意的是列限定符不是表 Schema 的一部分,你可以在插入数据的过程中动态创建列。
HBase 中的列由列族和列限定符组成,它们由 :
(冒号) 进行分隔,即一个完整的列名应该表述为 列族名 :列限定符
。
Cell
是行,列族和列限定符的组合,并包含值和时间戳。你可以等价理解为关系型数据库中由指定行和指定列确定的一个单元格,但不同的是 HBase 中的一个单元格是由多个版本的数据组成的,每个版本的数据用时间戳进行区分。
HBase 中通过 row key
和 column
确定的为一个存储单元称为 Cell
。每个 Cell
都保存着同一份数据的多个版本。版本通过时间戳来索引,时间戳的类型是 64 位整型,时间戳可以由 HBase 在数据写入时自动赋值,也可以由客户显式指定。每个 Cell
中,不同版本的数据按照时间戳倒序排列,即最新的数据排在最前面。
HBase Table 中的所有行按照 Row Key
的字典序排列。HBase Tables 通过行键的范围 (row key range) 被水平切分成多个 Region
, 一个 Region
包含了在 start key 和 end key 之间的所有行。
每个表一开始只有一个 Region
,随着数据不断增加,Region
会不断增大,当增大到一个阀值的时候,Region
就会等分为两个新的 Region
。当 Table 中的行不断增多,就会有越来越多的 Region
。
Region
是 HBase 中分布式存储和负载均衡的最小单元。这意味着不同的 Region
可以分布在不同的 Region Server
上。但一个 Region
是不会拆分到多个 Server 上的。
Region Server
运行在 HDFS 的 DataNode 上。它具有以下组件:
最近最少使用原则
清除多余的数据。Region Server 存取一个子表时,会创建一个 Region 对象,然后对表的每个列族创建一个 Store
实例,每个 Store
会有 0 个或多个 StoreFile
与之对应,每个 StoreFile
则对应一个 HFile
,HFile 就是实际存储在 HDFS 上的文件。
HBase 系统遵循 Master/Salve 架构,由三种不同类型的组件组成:
Zookeeper
Master
Region Server
HBase 使用 ZooKeeper 作为分布式协调服务来维护集群中的服务器状态。Zookeeper 负责维护可用服务列表,并提供服务故障通知等服务:
更为详细写入流程可以参考:HBase - 数据写入流程解析
以下是客户端首次读写 HBase 上数据的流程:
META
表所在的 Region Server;META
表所在的 Region Server,从 META
表中查询到访问行键所在的 Region Server,之后客户端将缓存这些信息以及 META
表的位置;如果再次读取,客户端将从缓存中获取行键所在的 Region Server。这样客户端就不需要再次查询 META
表,除非 Region 移动导致缓存失效,这样的话,则将会重新查询并更新缓存。
注:META
表是 HBase 中一张特殊的表,它保存了所有 Region 的位置信息,META 表自己的位置信息则存储在 ZooKeeper 上。
更为详细读取数据流程参考: HBase 原理-数据读取流程解析 HBase 原理-迟到的‘数据读取流程部分细节
本篇文章内容主要参考自官方文档和以下两篇博客,图片也主要引用自以下两篇博客:
官方文档: