Hbase 架构介绍

1.Hbase 整体构架介绍

HBase中的组件包括Client、Zookeeper、HMaster、HRegionServer、HRegion、Store、MemStore、StoreFile、HFile、HLog等。HBase中的每张表都通过行键按照一定的范围被分割成多个子表(HRegion),默认一个HRegion超过256M就要被分割成两个,这个过程由HRegionServer管理,而HRegion的分配由HMaster管理。

如下图所示:

1543913443176829.png

HBase是一种“NoSQL”数据库。 “NoSQL”是一个通用术语,意思是数据库不是支持SQL作为其主要访问语言的RDBMS。有许多类型的NoSQL数据库:BerkeleyDB是本地NoSQL数据库的一个例子,而HBase分布式数据库从技术上讲,HBase实际上更像是一个“数据存储”而不是“数据库”,它缺少在RDBMS中找到的许多功能,例如字段类型,索引,触发器和高级查询语言等。但是,HBase具有很多支持线性和模块化缩放的功能。通过添加普通服务器上托管的RegionServers来扩展HBase集群。例如,如果一个集群从10个扩展到20个RegionServers,则它在存储和处理能力方面都会翻倍。 RDBMS也可以很好地扩展,但只能达到单个数据库服务器的大小 ,并且为了获得最佳性能,需要专门的硬件和存储设备。

下面将介绍一系列主要的Hbase 组成组件。

2. Catalog Table

Hbase Catalog 表hbase:meta以HBase表的形式存在,该 meta表被HBase shell的list命令过滤掉,但本质上与其他表一样。

Hbase:meta

hbase:meta(以前称为.META.)保留了系统中所有region的列表,并且hbase:meta的位置存储在ZooKeeper中。

hbase:meta结构如下:

Key

Region key 的格式  ([table],[region start key],[region id])

Values

info:regioninfo (serialized HRegionInfo instance for this region)

info:server (server:port of the RegionServer containing this region)

info:serverstartcode (start-time of the RegionServer process containing this region)

info:serverstartcode(包含此Region的RegionServer进程的开始时间)

当一个表正在拆分过程中时,将创建两个列,分别称为info:splitA和info:splitB, 这两列代表两个daughter regions。 这些列的值也是序列化的HRegionInfo实例。 该Region被拆分后,该行将最终被删除。

3. Client

Hbase Client查找正在服务特定行的Region的RegionServers,通过查询hbase:meta表来完成此操作。  找到所需的Region后,Client联系为该Region服务的RegionServer,而不通过Master,发出读取或写入请求。 这些信息被缓存在client中,以便后续请求不需要经过查找Region过程以节省响应时间。 如果Region由Master Load balancer重新分配或由于RegionServer已经死亡,Client将重新查询目录表以确定用户Region的新位置。

在HBase 1.0中,从ConnectionFactory获取一个Connection对象,然后根据需要从中获取Table,Admin和RegionLocator的实例。 完成后关闭获取的实例。 最后,确保在退出之前清理Connection实例。 Connection是重量级对象,它是线程安全的,因此可以为应用程序创建一个对象并保持Connection实例。 Table,Admin和RegionLocator实例是轻量级的,可以随时创建。

Asynchronous Client是HBase 2.0中引入的新API,旨在提供异步访问HBase的能力。可以从ConnectionFactory获取AsyncConnection,然后从中获取一个asynchronous table实例以访问HBase。 完成后,关闭AsyncConnection实例。对于异步表,大多数方法与旧的Table接口具有相同的含义,期望返回值通常包含CompletableFuture。 没有任何缓冲区,异步表没有close方法,不需要关闭它,并且是线程安全的。

4. Master

HMaster是Master Server的实现, Master Server负责监视集群中的所有RegionServer实例,是所有metadata修改的接口,如添加或删除Region, 在分布式群集中,Master通常在NameNode上运行。主要功能包含:

? 为Region server分配region

? 负责Region server的负载均衡

? 发现失效的Region server并重新分配其上的region。

? HDFS上的垃圾文件回收。

? 处理schema更新请求。

HBase体系结构遵循传统的Master-Slave模型,在这种模型中,有一个主服务器负责决策,如上述功能所示,多个Slave执行真正的任务。 在HBase中,主服务器称为HMaster,从服务器称为HregionServers。

1542118206270514.png

请看上图, HMaster 和 其主要组件;

External Interface

外部接口负责与外部应用,如Hmaster UI,Client,RegionServer和其他管理实用程序,如JConsole进行交互。

Executor Services

Executor Services用于执行不同事件类型的事件队列,事件由各自的Runnable处理程序处理 。 比如要创建新的服务,先创建此类的实例,然后执行:instance.startExecutorService(“myService”)。 完成后调用shutdown()。

Zookeeper System Trackers

Master和RS使用zookeeper来跟踪集群中的事件。 在Master中,名为ZookeeperWatcher实例监控记录zookeeper的任何事件,这里处理所有常见的事情,如连接处理,节点管理和异常等。

5. RegionServer

HRegionServer是RegionServer实现。 它负责服务和管理Region。 在分布式群集中,RegionServer在DataNode上运行。HRegionRegionInterface的方法中包含面向数据和Region的方法,如对于数据,提供 get, put, delete, next 方法等;对于Region,提供splitRegion,compactRegion等 。RegionServer 维护master分配给它的region,处理对这些region的IO请求;并且负责切分运行过程中变的过大的region。Client访问Hbase上的数据并不需要master参与,master仅仅维护Table和Region的元数据信息, HRegionServer存取一个子表时,会创建一个HRegion对象,然后对表的每个列族创建一个Store实例,每个Store都会有一个MemStore和0个或多个StoreFile与之对应,每个StoreFile都会对应一个HFile, HFile就是实际的存储文件。因此,一个HRegion有多少个列族就有多少个Store。 

RegionServer处理写入的请求,这些请求会累积在memstore的内存存储系统中。 memstore填充后,其内容将作为存储文件写入磁盘。 该事件称为memstore flush。 随着存储文件的累积,RegionServer会将它们压缩为更少,更大的文件。RegionServer会检查Region是否已经变得过大,或者是否应该进行拆分。当StoreFile文件数量增长到一定阀值,就会触发Compact合并操作,并将多个StoreFile合并成一个StoreFile,当这个StoreFile大小超过一定阀值后,会触发Split操作,同时把当前Region Split成2个Region,拆分前的Region会下线,新Split出的2个Region会被HMaster分配到相应的HregionServer上,使得原先1个Region的压力得以分散到2个Region上。

6. Region

Region是Table的可用性和分布式存储的基本单元,并且由列族的存储组成。 Region的层次结构如下:

1542118394155871.png

Table在行的方向上分隔为多个Region, Region作为HBase中分布式存储和负载均衡的最小单元,不同的region可以分别在不同的Region Server上,但同一个Region不会拆分到多个server上。Region按大小切分,随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值(默认256M)时就会分成两个新的region。

下面是一些常用到的概念解释:

Store

每一个Region由一个或多个store组成,至少是一个store,hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。一个Store由一个memStore和0或者 多个StoreFile组成。 HBase以store的大小来判断是否需要切分region;

MemStore

MemStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认64MB)时,MemStore会被flush到文 件,Hbase 会有一个线程来负责memStore的flush操作;

StoreFile

memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存;

HFile

HBase中所有的数据文件都存储在Hadoop HDFS上, Hfile是HBase中KeyValue数据的存储格式,HFile是Hadoop的 二进制格式文件,实际上StoreFile就是对Hfile做了轻量级包装,即StoreFile底层就是Hfile;

HLog

HLog(WAL log):WAL意为write ahead log,用来做灾难恢复使用,HLog记录数据的所有变更,如果region server 宕机,就可以从log中进行恢复。

HLog文件是一个普通的Hadoop Sequence File, Sequence File的value是key时HLogKey对象,其中记录了写入数据的归属信息,除了table和region名字外,还同时包括sequence number和timestamp,timestamp是写入时间,sequence number的起始值为0,或者是最近一次存入文件系统中的sequence number。 Sequence File的value是HBase的KeyValue对象,即对应HFile中的KeyValue。

7. ZooKeeper

HBase依赖于正在运行的ZooKeeper集群,所有参与节点和客户端都需要能够访问正在运行的ZooKeeper集群。 Apache HBase默认管理ZooKeeper集群。当HBase启动/停止时,将启动和停止ZooKeeper集群作为HBase启动/停止过程的一部分。 要切换ZooKeeper的HBase管理,可以设置conf / hbase-env.sh中的HBASE_MANAGES_ZK变量。此变量默认为true,告诉HBase是否启动/停止ZooKeeper作为HBase启动/停止的一部分。当HBase管理ZooKeeper集合时,可以直接在conf / hbase-site.xml中指定ZooKeeper配置。通过将ZooKeeper选项名称与hbase.zookeeper.property作为前缀,可以将ZooKeeper配置选项设置为HBase hbase-site.xml XML配置文件中的属性。例如,可以通过设置hbase.zookeeper.property.clientPort属性来更改ZooKeeper中的clientPort设置。对于HBase使用的所有默认值,包括ZooKeeper配置,可以参考Hbase默认配置。Zookeeper维护了不同的RegionServer节点, Master使用这些节点来发现可用的Region Server,除了RegionServer的可用性外,还可以跟踪RegionServer的故障。

HBase Client使用RPC(远程过程调用)机制与Master和RegionServer进行通信,但如何寻址呢?由于Zookeeper中存储了hbase:meta 和Master的地址,所以需要先到Zookeeper上进行寻址。

Hbase 架构介绍

发表评论

邮箱地址不会被公开。 必填项已用*标注

÷ 四 = 2

滚动到顶部