HBase 系列(二)—— HBase 系统架构及数据结构

1、基本概念

一个典型的 Hbase Table 表以下:html

1.1 Row Key (行键)

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 做左填充。服务器

  • 行的一次读写操做时原子性的 (不论一次读写多少列)。数据结构

1.2 Column Family(列族)

HBase 表中的每一个列,都归属于某个列族。列族是表的 Schema 的一部分,因此列族须要在建立表时进行定义。列族的全部列都以列族名做为前缀,例如 courses:historycourses:math 都属于 courses 这个列族。架构

1.3 Column Qualifier (列限定符)

列限定符,你能够理解为是具体的列名,例如 courses:historycourses:math 都属于 courses 这个列族,它们的列限定符分别是 historymath。须要注意的是列限定符不是表 Schema 的一部分,你能够在插入数据的过程当中动态建立列。负载均衡

1.4 Column(列)

HBase 中的列由列族和列限定符组成,它们由 :(冒号) 进行分隔,即一个完整的列名应该表述为 列族名 :列限定符

1.5 Cell

Cell 是行,列族和列限定符的组合,并包含值和时间戳。你能够等价理解为关系型数据库中由指定行和指定列肯定的一个单元格,但不一样的是 HBase 中的一个单元格是由多个版本的数据组成的,每一个版本的数据用时间戳进行区分。

1.6 Timestamp(时间戳)

HBase 中经过 row keycolumn 肯定的为一个存储单元称为 Cell。每一个 Cell 都保存着同一份数据的多个版本。版本经过时间戳来索引,时间戳的类型是 64 位整型,时间戳能够由 HBase 在数据写入时自动赋值,也能够由客户显式指定。每一个 Cell 中,不一样版本的数据按照时间戳倒序排列,即最新的数据排在最前面。

2、存储结构

2.1 Regions

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 上的。

2.2 Region Server

Region Server 运行在 HDFS 的 DataNode 上。它具备如下组件:

  • WAL(Write Ahead Log,预写日志):用于存储还没有进持久化存储的数据记录,以便在发生故障时进行恢复。
  • BlockCache:读缓存。它将频繁读取的数据存储在内存中,若是存储不足,它将按照 最近最少使用原则 清除多余的数据。
  • MemStore:写缓存。它存储还没有写入磁盘的新数据,并会在数据写入磁盘以前对其进行排序。每一个 Region 上的每一个列族都有一个 MemStore。
  • HFile :将行数据按照 Key\Values 的形式存储在文件系统上。

Region Server 存取一个子表时,会建立一个 Region 对象,而后对表的每一个列族建立一个 Store 实例,每一个 Store 会有 0 个或多个 StoreFile 与之对应,每一个 StoreFile 则对应一个 HFile,HFile 就是实际存储在 HDFS 上的文件。

3、Hbase系统架构

3.1 系统架构

HBase 系统遵循 Master/Salve 架构,由三种不一样类型的组件组成:

Zookeeper

  1. 保证任什么时候候,集群中只有一个 Master;

  2. 存贮全部 Region 的寻址入口;

  3. 实时监控 Region Server 的状态,将 Region Server 的上线和下线信息实时通知给 Master;

  4. 存储 HBase 的 Schema,包括有哪些 Table,每一个 Table 有哪些 Column Family 等信息。

Master

  1. 为 Region Server 分配 Region ;

  2. 负责 Region Server 的负载均衡 ;

  3. 发现失效的 Region Server 并从新分配其上的 Region;

  4. GFS 上的垃圾文件回收;

  5. 处理 Schema 的更新请求。

Region Server

  1. Region Server 负责维护 Master 分配给它的 Region ,并处理发送到 Region 上的 IO 请求;

  2. Region Server 负责切分在运行过程当中变得过大的 Region。

3.2 组件间的协做

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 的选举。

4、数据的读写流程简述

4.1 写入数据的流程

  1. Client 向 Region Server 提交写请求;

  2. Region Server 找到目标 Region;

  3. Region 检查数据是否与 Schema 一致;

  4. 若是客户端没有指定版本,则获取当前系统时间做为数据版本;

  5. 将更新写入 WAL Log;

  6. 将更新写入 Memstore;

  7. 判断 Memstore 存储是否已满,若是存储已满则须要 flush 为 Store Hfile 文件。

更为详细写入流程能够参考:HBase - 数据写入流程解析

4.2 读取数据的流程

如下是客户端首次读写 HBase 上数据的流程:

  1. 客户端从 Zookeeper 获取 META 表所在的 Region Server;

  2. 客户端访问 META 表所在的 Region Server,从 META 表中查询到访问行键所在的 Region Server,以后客户端将缓存这些信息以及 META 表的位置;

  3. 客户端从行键所在的 Region Server 上获取数据。

若是再次读取,客户端将从缓存中获取行键所在的 Region Server。这样客户端就不须要再次查询 META 表,除非 Region 移动致使缓存失效,这样的话,则将会从新查询并更新缓存。

注:META 表是 HBase 中一张特殊的表,它保存了全部 Region 的位置信息,META 表本身的位置信息则存储在 ZooKeeper 上。

更为详细读取数据流程参考:

HBase 原理-数据读取流程解析

HBase 原理-迟到的‘数据读取流程部分细节

参考资料

本篇文章内容主要参考自官方文档和如下两篇博客,图片也主要引用自如下两篇博客:

官方文档:

更多大数据系列文章能够参见 GitHub 开源项目大数据入门指南

相关文章
相关标签/搜索