我爱编程

深入了解HBase架构

2017-08-17  本文已影响0人  anvoid

HBase组件

HBase是典型的主从架构,包含三种类型的server。Client直接与Region server通信进行数据读写,HBase Master负责region分配、DDL(创建、删除表)等操作,Zookeeper则负责维护集群状态。

每个RegionServer与DataNode协作的,其所管理的数据都由对应的DataNode存储。所有的HBase数据都保存为HDFS文件形式。这是一种本地化策略,所有的读写操作都是在RegionServer所在机器完成,当然不包括region被移动的情况。

NameNode维护了所有数据块的元数据信息。

image.png

Regions

在水平方向上,HBase Tables根据RowKey被划分为多个Region。一个Region包含了在start key和end key之间的所有行。这些Region被分配到集群中不同的节点上,也就是Region Server。一个Region Server大约可以管理1000个Region。

image.png

HBase Master

Region分配、DDL操作都是由HBase Master进行管理。
Master负责的内容如下:

image.png

Zookeeper-协调者

HBase使用Zookeeper实现分布式环境中的一致性,它可以维护集群的共享状态,在Master失败时选举新的Master,在Region Server失败时发送通知,以便恢复。值得注意的是为了保证一致性,我们一般使用3台或者5台机器构建Zookeeper集群。

image.png

组件如何协同工作

Zookeeper是用于协调分布式系统成员之间的共享状态信息。Region Servers和活跃的HMaster通过session连接到Zookeeper,然后Zookeeper通过心跳为这些session创建临时结点。

image.png

每个Region Server都会创建在Zookeeper中创建一个临时结点,之后HMaster可以通过这些临时结点发现集群中可用的Region Server,当然也可以发现宕机的server。HMasters同样回创建临时结点,Zookeeper会选择第一个创建的HMaster临时结点,将其作为active的主节点,其他HMasters作为备用进行failover。active的HMaster向Zookeeper发送心跳,其他HMasters监听active HMaster失败的通知。

如果某个region sersver或者HMaster无法发送心跳,对应的session会过期,然后对应临时结点会被删除。监听器会监听到结点被删除。HMaster监听到region server不可用时,会进行region server的故障恢复。Inactive的HMaster监听到HMaster的失败时,它会尝试变为active HMaster。

HBase读写

HBase中有一个特殊的表叫做META表,其中保存了regions的位置。而这个表是保存着在Zookeeper中的。

当客户端要向HBase进行读写操作时,流程如下:

1.从Zookeeper获取META表信息
2.根据要查询的RowKey从META中匹配对应的Region Server,这些信息都会缓存下来
3.从对应Region Server读取行

对于接下来的读写请求,client直接使用缓存获取相应Region Server。除非region被移动导致缓存没有命中,它才会重现获取META表并更新缓存。

image.png

HBase Meta Table

image.png

Region Server组成

Region Server是运行在HDFS的datanode之上,包含了以下部分:

image.png

HBase写步骤-1

当client发起一个写请求,首先将数据写入write-ahead log,WAL的特性:

- 编辑操作是追加到WAL文件尾部。
- WAL是为了在服务宕机时恢复还未持久化的数据。

image.png

HBase写步骤-2

一旦数据追加到WAL之后,数据就会存入MemStore,然后写请求操作完成,并返回给客户端应答。

image.png

HBase MemStore

MemStore在内存中把数据保存为排序键值对,与磁盘上的HFile是一样的。
每个column family一个MemStore,更新操作也会进行排序。

![image.png](https://img.haomeiwen.com/i5243207/c8a91457511e3516.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

HBase Region刷盘

每当MemStore积累了足够的数据,排序的数据集整个写入到HDFS上的HFile中。HBase每个column family都使用很多个这样的HFile存储实际的Key-Value数据。随着MemStore写满刷盘,会不停的创建HFiles。

这也是HBase限制column family数量的一个原因,因为每个CF有一个MemStore,每当MemStore写满,然后刷盘就会创建这样一个文件。同时最后一个写序号也会持久化。
最大的序号作为HFile的元字段存储,它可以反映持久化在哪里结束,将在哪里开始。当一块Region初始化时,所有序号读入内存,最大的序号被用于新的编辑操作。

image.png

HBase HFile

HFile存储了实际的数据,形式是排序的key/values。MemStore刷盘是顺序写的过程,速度非常快。

image.png

HBase HFile 结构

HFile使用了三级索引结构使得HBase可以快速查询数据而不用遍历整个文件。多级索引结构比较像B+树。

Trailer指向数据块元信息,存储在文件的尾部。Trailer包含bloom filter和时间区间信息,bloom filter可以帮助判断文件是否包含指定rowkey,时间区间也可以帮助判断文件是否同rowkey时间版本一致。

image.png

HFile Index

HFile索引被加载到内存中,通过索引可以通过一次磁盘寻址完成查询。

image.png

HBase读合并

从上面的内容可以知道,rowkey对应的KeyValue可以出现在很多地方,已经持久化的存储在HFile中,最近读取的缓存在BlockCache中,最近更新的保存在MemStore中,那么当我们读取一行时,HBase是如何返回相应的Column KeyValue?其实读操作会合并从BlockCache、MemStore、HFile查询的结果:

  1. 首先从读缓存即Block Cache中读row cells。
  2. 然后从写缓存即MemStore中读row cells。
  3. 如果在前两步中没有拿到所有的row cells,那么将通过BlockCache和bloom filter将可能包含row的HFile加载到内存中
image.png

对于行的内容来说可能分布在多个HFile中,那么读时需要检查多个HFile,这回导致读取速度变慢。

image.png

HBase Minor Compaction

HBase会自动的将一些小的HFiles,通过归并排序的方式,合并为大的HFile,从而减少系统中HFile的数量。这个过程叫做minor compaction。

image.png

HBase Major Compaction

HBase还可以通过Major Compaction合并整个系统中的HFiles,每个region的每个Column family的HFiles会合并为一个HFile,这可以提高系统的读性能。但是由于在此过程中,HBase需要重写所有的文件,会占用大量的磁盘IO和网络带宽,会影响系统的写性能。
建议Major Compaction在晚上或者周末执行,以免影响系统性能。

image.png

Region = Contiguous Keys

下面是一些关于region的描述:

image.png

Region Split

最开始每个Table只有一个region,当存储的数据越来越多,region分解为两个子region,并向HMaster报告。当集群负载不均衡时,HMaster可能将region分配到其他Region Server。

image.png

原文链接

上一篇 下一篇

猜你喜欢

热点阅读