HBase体系结构

HBase简介

HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问。HBase的目标是存储并处理大型的数据。

HBase是一个开源的,分布式的,多版本的,面向列的存储模型。它可以直接使用本地文件系统,也可以使用Hadoop的HDFS文件存储系统。为了提高数据的可靠性和系统的健壮性,并且发挥HBase处理大数据的能力,使用HDFS作为文件系统才更稳妥。

它存储的是松散型数据。具体来说,HBase存储的数据介于映射(key/value)和关系型数据之间。除此之外它还有很多其他特性,我们将在后面介绍。从图1可以看出,

HBase与Hadoop的关系,可以存储在HDFS之上,并且还可以使用Hadoop的MapReduce计算模型来并行处理大规模数据,这也是它具有强大性能的核心所在。它将数据存储与并行计算完美结合在一起。

                       图 1 HBase关系图

HBase体系结构

HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion服务器(HRegion Server)和HBase Master服务器(HBase Master Server)构成。HBase Master服务器负责管理所有的HRegion服务器,而HBase中所有的服务器都是通过ZooKeeper来进行协调并处理HBase服务器运行期间可能遇到的错误。HBase Master服务器本身并不存储HBase中的任何数据,HBase逻辑上的表可能会被划分成多个HRegion,然后存储在HRegion服务器群中。HBase Master服务器中存储的是从数据到HRegion服务器的映射。因此,HBase体系结构如图2所示。

                                   图 2 HBase 体系结构

HRegion

当表的大小超过设置值的时候,HBase会自动将表划分为不同的区域,每个区域包含所有行的一个子集。对用户来说,每个表是一堆数据的集合,靠主键来区分。从物理上来说,一张表是被拆分成了多块,每一个块就是一个HRegion。我们用表名+开始/结束主键来区分每一个HRegion。一个HRegion会保存一个表里面某段连续的数据,从开始主键到结束主键,一张完整的表格是保存在多个HRegion上面的。

HRegion 服务器

所有的数据库数据一般是保存在Hadoop分布式文件系统上面的,用户通过一系列HRegion服务器获取某些数据。一台机器上一般运行一个HRegion Server,而且每一个区段的HRegion也只会被一个HRegion Server 维护。

图3所示为HRegion服务器体系结构。

HRegion Server包含两大部分:HLOG部分和HRegion部分。其中HLOG用来存储数据日志,采取的是先写日志的方式(Write-ahead log)。HRegion部分由多个HRegion组成,存储的是实际的数据。每一个HRegion又由很多的store组成,每个store存储的实际上是一个列簇(column family)下的数据。此外,在每一个HStore中有包含一块MemStore。MemStore驻留在内存中,数据到来时首先更新到MemStore中,当到达阀值之后再更新到对应的StoreFile(又名HFile)中。每一个Store包含了多个StoreFile,StoreFile负责的是实际数据的存储,为HBase中最小的存储单元。

 

                                图 3 HRegion 服务器体系结构

HBase中不涉及数据的直接删除和更新操作,所有的数据均通过追加的方式进行更新。数据的删除和更新在HBase合并(compact)的时候进行。当Store中StoreFile的数量超过设定的阀值时将触发合并操作,该操作会把多个StoreFile文件合并成一个StoreFile。

当用户需要更新数据的时候,数据会被分配到对应的HRegion服务上提交修改。数据首先被提交到HLOG文件里面,在操作写入HLOG之后,commit()调用才会将其返回客户端。HLOG文件用于故障恢复。例如某一台HRegionServer发生故障,那么它所维护的HRegion会被重新分配到新的机器上。这时HLOG会按照HRegion进行划分。新的机器在加载HRegion的时候可以通过HLOG对数据进行恢复。

当一个HRegion变的太大巨大、超过了设定的阀值时,HRegion服务器会调用HRegion.closeAndSplit(),将此HRegion拆分成两个,并且报告给主服务器让它决定由哪台HRegion服务器来存放新的HRegion。这个拆分过程十分迅速,因为两个新的HRegion最初只是保留原来HRegion文件的引用。这时旧的HRegion会处于停止服务的状态,当新的HRegion拆分完成并且把引用删除了以后,旧的HRegion才会被删除。另外,两个HRegion可以通过调用HRegion.closeAndMerge()合并成一个新的HRegion,当前版本下进行此操作需要两台HRegion服务器都停机。

HRegion Master

每台HRegion服务器都会和HMaster服务器通信,HMaster的主要任务就是告诉每个HRegion服务器它要维护哪些HRegion。

当一台新的HRegion服务器登录到HMaster服务器时,HMaster会告诉它先等待分配数据。而当一台HRegion死机时,HMaster会把它负责的HRegion标记为未分配,然后再把它们分配到其他HRegion服务器中。

如果当前HBase已经解决了之前存在的SPFO(单点故障),并且HBase中可以启动多个HMaster,那么它就能够通过Zookeeper来保证系统中总有一个HMaster在运行。HMaster在功能上主要负责Table和HRegion的管理工作,具体包括:

²  管理用户对Table的增、删、改、查操作;

²  管理HRegion服务器的负载均衡,调整HRegion分布;

²  在HRegion分裂后,负责新的HRegion的分配;

²  在HRegion服务器停机后,负责失效HRegion服务器上的HRegion迁移;

Root表和META表

之前我们说过HRegion是按照表名和主键范围来区分的,由于主键范围是连续的,所以一般用开始主键就可以表示相应的HRegion了。

不过,因为我们有合并和分割操作,如果正好在执行这些操作的过程中出现死机,那么就可能存在多份表名和开始主键相同的数据,这样的话只有开始主键就不够了,这就要通过HBase的元数据信息来区分哪一份才是正确的数据文件,为了区分这样的情况,每个HRegion都有一个‘regionId’来标识它对的唯一性。

所以一个HRegion的表达符最后是:表名+开始主键+唯一ID(tablename+startkey+regionid)。我们可以用这个识别符来区分不同的HRegion,这些数据就是元数据(META)而元数据本身也是被保存在HRegion里面的,所以我们称这个表为元数据表(META Table),里面保存的就是HRegion标识符和实际HRegion服务器的映射关系。

元数据表也会增长,并且可能被分割为几个HRegion,为了定位这些HRegion,我们采用一个根数据表(ROOT Table),它保存了所有元数据表的位置,而根数据表是不能被分割的,永远只存在一个HRegion。

在HBase启动的时候,主服务器先去扫描根数据表,因为这个表只会有一个HRegion,所以这个HRegion的名字是被写死了的。当然要把根数据表分配到一个HRegion服务器中需要一定的时候。

当根数据表被分配好之后,主服务器就会扫描根数据表,获取元数据表的名称和位置,然后把元数据表分配到不同的HRegion服务器中。最后就是扫描元数据表,找到所有HRegion区域的信息,把它们分配给不同的HRegion服务器。

主服务器在内存中保存着当前活跃的HRegion服务器的数据,因此如果主服务器死机,整个系统也就无法访问了,这时服务器的信息也就没有必要保存在文件里面了。

元数据表和根数据表的每一行都包含在一个列族(info列族):

²  Info:regioninfo包含了一个串行化的HRegionInfo对象。

²  Info:server保存了一个字符串,是服务器的地址HServerAddress.toString()。

²  Info:startcode是一个长整形的数字字符串,它是在HRegion服务器启动的时候传给主服务器的,让主服务器确定这个HRegion服务器的信息有没有更改。

因此,当一个客户端拿到根数据表地址以后,就没有必要再连接主服务器了,主服务器的负载相对就小了很多。它只会处理超时的HRegion服务器,并在启动的时候扫描根数据表和元数据表,以及返回根数据表的HRegion服务器地址。

注意:ROOT表包含META表所在区域列表,META表包含所有的用户空间区域列表,以及Region服务器地址。客户端能够缓存所有已知的ROOT表和META表,从而提高访问的效率。

Zookeeper

ZooKeeper存储的是HBase中ROOT表和META表的位置。此外,ZooKeeper还负责监控各个机器的状态(每台机器到ZooKeeper中注册一个实例)。当某台机器发生故障的时候,ZooKeeper会第一时间感知到,并通知HBase Master进行相应的处理。同时,当HBase Master发生故障时,ZooKeeper还负责Hbase Master的恢复工作,能够保证在同一时刻系统中只有一台HBase Master提供服务。

posted @ 2014-07-12 08:20  shihuai355  阅读(782)  评论(0编辑  收藏  举报