2006年年末,Google发表了著名的Bigtable论文。此后HBase便诞生了。

概述

HBase是一个构建在HDFS之上的、分布式的、支持多版本的NoSql数据库。它也是Google BigTable的开源实现。HBase非常适合于对海量数据进行实时随机读写,HBase中的一张表能够支撑数十亿行和数百万列。

HBase是由三类服务组成的Master/Slave架构服务。

  • HBase Master进程负责处理Region分配、DDL(create、delete表)这类操作。
  • 数据的读写由Region Servers进程负责处理。
  • 底层数据存储和集群协同管理则交由HDFS和Zookeeper进行管理

HBase的所有数据最终都以HDFS文件的形式进行存储,Region Server服务通常是伴随着HDFS的Datanode进行部署的,这样可以更好地利用数据本地性的优势。HBase采用主从架构。其分布式协调是通过Zookeeper进行管理的,而数据的物理存储最终会以文件的形式存储到HDFS。

数据模型

四维数据模型:

  • RowKey:每行数据都必须拥有一个唯一的行键,它类似于关系型数据库中的主键。
  • Column Family:每个列都归属于一个列簇,它类似于子表的概念。一个列簇对应一个MemStore对象。
  • Column:HBase用列来定义数据属性字段,和关系型数据库中的表字段类似。
  • Version:HBase中的数据是有版本概念的,每次新增或者修改数据都会产生一个新的版本。

Regions

HBase的表以RowKey的起止区间为范围被水平切分成了多个Region。每个Region中包含了RowKey从开始到结束区间的所有行。这些Region被分配到的集群节点称为RegionServers,RegionServers负责提供HBase中数据的读写功能,一个RegionServer可以容纳约1000个Region。

为了利用HDFS数据本地性的能力,通常会将Region Server一同安装在HDFS的Datanode所在的服务器之上。Region Server包含:

  • WAL:预写日志,它是HDFS上的一个文件,一种容灾策略。HBase为了提高写入性能,在写入数据的时候并不急于将数据保存到磁盘,而是将数据直接保留在内存中。但是内存中的数据并不是一直可靠的,所以HBase采用了预写日志的方案。当有新数据写入的时候,RegionServer先通过预写日志的方式记录数据,同时将数据放入内存对象MemStore中。当日志写完之后就立刻返回客户端告知写入成功。
  • BlockCache:数据块缓存是一种读缓存,客户端读取数据的时候会先从这个缓存中查找有没相应的数据。块数据缓存采用LRU失效策略。
  • MemStore:MemStore是一种写缓存,HBase为了提升写入性能不会直接将数据刷入磁盘而是先使用MemStore内存对象存储数据。再通过一个守护线程定期将MemStore刷入磁盘。在一个region中每个列簇都拥有一个MemStore。
  • Hfile:Hfile是HBase最终数据存储的载体,它本质上是HDFS上的一个文件。

为了提高数据写入时的吞吐量,HBase并不会实时的将写入的数据直接刷入磁盘,而是先将数据放入内存中进行保管,MemStroe对象就是负责此项任务的逻辑对象,它将数据以Key-Values的形式保存在内存中。当客户端向HBase发起一次写入请求的时候,HBase首先会通过RegionServer将数据写入预写日志,之后再用MemStroe对象将数据保存到内存之中。

HFile是HBase最终存储数据的载体,它本质上对应的是HDFS的文件。因为HFile是以经过排序的Key-Values对象的形式进行存储的,所以它的在写入文件的时候只需要采用顺序写,写入速度非常快。

使用场景

由于HBase构建在HDFS之上,这意味着它能像HDFS一样实现存储的线性扩容。同时它又能提供毫秒级的查询性能。所以它可以作为其他大数据组件的低层存储支持。
由于HBase出色的写入性能,它非常适合大规模数据的实时写入场景。比如在流计算、用户行为数据存储等场景就非常适合用HBase进行存储。

参考资料

  • 《企业级大数据平台构建:架构与实现》