一个典型的 Hbase Table 表以下:html
Row Key
是用来检索记录的主键。想要访问 HBase Table 中的数据,只有如下三种方式:git
经过指定的 Row Key
进行访问;github
经过 Row Key 的 range 进行访问,即访问指定范围内的行;数据库
进行全表扫描。apache
Row Key
能够是任意字符串,存储时数据按照 Row Key
的字典序进行排序。这里须要注意如下两点:缓存
由于字典序对 Int 排序的结果是 1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。若是你使用整型的字符串做为行键,那么为了保持整型的天然序,行键必须用 0 做左填充。服务器
行的一次读写操做时原子性的 (不论一次读写多少列)。数据结构
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 的寻址入口;
实时监控 Region Server 的状态,将 Region Server 的上线和下线信息实时通知给 Master;
存储 HBase 的 Schema,包括有哪些 Table,每一个 Table 有哪些 Column Family 等信息。
Master
为 Region Server 分配 Region ;
负责 Region Server 的负载均衡 ;
发现失效的 Region Server 并从新分配其上的 Region;
GFS 上的垃圾文件回收;
处理 Schema 的更新请求。
Region Server
Region Server 负责维护 Master 分配给它的 Region ,并处理发送到 Region 上的 IO 请求;
Region Server 负责切分在运行过程当中变得过大的 Region。
HBase 使用 ZooKeeper 做为分布式协调服务来维护集群中的服务器状态。 Zookeeper 负责维护可用服务列表,并提供服务故障通知等服务:
每一个 Region Server 都会在 ZooKeeper 上建立一个临时节点,Master 经过 Zookeeper 的 Watcher 机制对节点进行监控,从而能够发现新加入的 Region Server 或故障退出的 Region Server;
全部 Masters 会竞争性地在 Zookeeper 上建立同一个临时节点,因为 Zookeeper 只能有一个同名节点,因此必然只有一个 Master 可以建立成功,此时该 Master 就是主 Master,主 Master 会按期向 Zookeeper 发送心跳。备用 Masters 则经过 Watcher 机制对主 HMaster 所在节点进行监听;
若是主 Master 未能定时发送心跳,则其持有的 Zookeeper 会话会过时,相应的临时节点也会被删除,这会触发定义在该节点上的 Watcher 事件,使得备用的 Master Servers 获得通知。全部备用的 Master Servers 在接到通知后,会再次去竞争性地建立临时节点,完成主 Master 的选举。
Client 向 Region Server 提交写请求;
Region Server 找到目标 Region;
Region 检查数据是否与 Schema 一致;
若是客户端没有指定版本,则获取当前系统时间做为数据版本;
将更新写入 WAL Log;
将更新写入 Memstore;
判断 Memstore 存储是否已满,若是存储已满则须要 flush 为 Store Hfile 文件。
更为详细写入流程能够参考:HBase - 数据写入流程解析
如下是客户端首次读写 HBase 上数据的流程:
客户端从 Zookeeper 获取 META
表所在的 Region Server;
客户端访问 META
表所在的 Region Server,从 META
表中查询到访问行键所在的 Region Server,以后客户端将缓存这些信息以及 META
表的位置;
客户端从行键所在的 Region Server 上获取数据。
若是再次读取,客户端将从缓存中获取行键所在的 Region Server。这样客户端就不须要再次查询 META
表,除非 Region 移动致使缓存失效,这样的话,则将会从新查询并更新缓存。
注:META
表是 HBase 中一张特殊的表,它保存了全部 Region 的位置信息,META 表本身的位置信息则存储在 ZooKeeper 上。
更为详细读取数据流程参考:
本篇文章内容主要参考自官方文档和如下两篇博客,图片也主要引用自如下两篇博客:
官方文档:
更多大数据系列文章能够参见 GitHub 开源项目: 大数据入门指南