HBase 系统架构及数据结构

1、基本概念

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

1.1 Row Key (行键)

Row Key是用来检索记录的主键。想要访问HBase Table中的数据,只有如下三种方式:git

  • 经过指定的Row Key进行访问;
  • 经过Row Key的range进行访问,即访问指定范围内的行;
  • 进行全表扫描。

Row Key能够是任意字符串,存储时数据按照Row Key的字典序进行排序。这里须要注意如下两点:github

  • 由于字典序对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的一部分,你能够在插入数据的过程当中动态建立列。apache

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 开源项目: 大数据入门指南

相关文章
相关标签/搜索