1. 介绍

HBase是一个构建在HDFS上的分布式列存储系统,基于Google BigTable模型开发的,是典型的key/value系统。支持海量结构化数据存储、横向扩展、高可用

2. hbase数据模型

hbase以表的方式在HBase存储数据的。表是由行和列构成的,所有的列是从属于某一个列族的。行和列的交叉点称之为cell,cell是版本化的。cell的内容是不可分割的字节数组。

表的行键也是一段字节数组,所以任何东西都可以保存进去,不论是字符串或者数字。HBase的表是按key排序的,排序方式之针对字节的。所有的表都必须要有主键-key.

2.1 概念视图

我们可以将一个表想象成一个大的映射关系,通过行健、行健+时间戳或行键+列(列族:列修饰符),就可以定位特定数据,HBase是稀疏存储数据的,因此某些列可以是空白的。每个单元称作cell

下图演示了hbase中定义的一张表的逻辑视图。可以看到同样的key根据时间戳可以有不同的版本。某些cell可以为空。

根据hbase的逻辑视图以及官方资料我们可以总结出hbase表的一些特点:

  1. 写支持行级锁
  2. 空cell不占用空间,表可以是稀疏表,不会造成存储空间浪费
  3. cell的内容是不可分割的字节数组,不区分类型
  4. 一个列名是由它的列族前缀和修饰符(qualifier)连接而成。例如上图c1表示列族,冒号后面接修饰符。
  5. 每一张表有一个固定的列族集合。修改列族集合需要修改表结构;列修饰符可以随意修改
  6. 相同的key值hbase会保存一定数量的版本,默认用时间戳来区分,读取的时候,列族和列修饰符都相同,则默认选最新的(列族相同,修饰符不同则还是会都显示的)。

2.2 物理视图

虽然从概念视图来看每个表格是由很多行组成的,但是在物理存储上面,它是按照列来保存的。例如上图中的key=r1相关的行按照列族c1和c2不同,在物理上分成两部分存储,如下图:

总结:

  1. HBase 为每个值维护了多级索引,即:
  2. 存储优化都是针对列族级别的,这就意味着,一个colimn family的所有成员的是用相同的方式访问的
  3. 在物理上,一个的列族成员在文件系统上都是存储在一起

2.3 hbase物理存储结构

  1. Table在行的方向上分割为多个Region;

  1. Region按大小分割的,每个表开始只有一个region,随着数据增多,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region;

  1. Region是Hbase中分布式存储和负载均衡的最小单元,不同Region分布到不同RegionServer上。

  1. Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore和0至多个StoreFile组成,StoreFile包含HFile(StoreFile是HFile的轻量级包装);memStore存储在内存中,StoreFile存储在HDFS上。

2.4 列族的设计原则


每个列族都会MemStore和BlockCache,数据在硬盘中以HFile形式存储。HFile不会存储跨列族的数据。
因此,根据上图可以得出,HBase表中列族设计的原则是:

  1. 同一个列族里存储相似访问模式的所有有数据。可以理解为关系数据库中一对一关系,一对一关系的两张表,在HBase中可以存储在一张表中,放到不同的列族。
  2. 大多数的表,设计一个列族就够了。在HBase中,高表比宽表性能好,可以设计多张表来满足需求。

总结:1张表1个列族最好

3. hbase基本架构

3.1 client

包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息

3.2 master

  1. 为Region server分配region

  2. 负责Region server的负载均衡

  3. 发现失效的Region server并重新分配其上的region

  4. 管理用户对table的增删改查操作

3.3 Region Server

  1. Regionserver维护region,处理对这些region的IO请求

  2. Regionserver负责切分在运行过程中变得过大的region

3.4 zookeeper

  1. 通过选举,保证任何时候,集群中只有一个master,Master与RegionServers 启动时会向ZooKeeper注册

  2. 存贮所有Region的寻址入口

  3. 实时监控Region server的上线和下线信息。并实时通知给Master

  4. 存储HBase的schema和table元数据

  5. 默认情况下,HBase 管理ZooKeeper 实例,比如, 启动或者停止ZooKeeper

  6. Zookeeper的引入使得Master不再是单点故障

4. 高可用

4.1 Write-Ahead-Log(WAL)保障数据高可用


该机制用于数据的容错和恢复:

每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中(HLog文件格式见后续),HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)。当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的 HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取 到这些region的HRegionServer在Load Region的过程中,会发现有历史HLog需要处理,因此会Replay HLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复

4.2 组件高可用

  1. Master容错:Zookeeper重新选择一个新的Master。如果无Master过程中,数据读取仍照常进行,但是,region切分、负载均衡等无法进行;
  2. RegionServer容错:定时向Zookeeper汇报心跳,如果一旦时间内未出现心跳,Master将该RegionServer上的Region重新分配到其他RegionServer上,失效服务器上“预写”日志由主服务器进行分割并派送给新的RegionServer
  3. Zookeeper容错:Zookeeper是一个可靠地服务,一般配置3或5个Zookeeper实例

5. HBASE与HDFS对比

两者都具有良好的容错性和扩展性,都可以扩展到成百上千个节点;

HDFS适合批处理场景,但是不支持数据随机查找、不适合增量数据处理、不支持数据更新

参考资料:

  1. hbase官方网站