Hbase系列(二)---- Hbase的体系结构及其作用
在上一个章节,我们了解到Hbase的数据是怎么存储的,对Hbase的数据结构大致上有了一定的理解,在本章节,我们来看看Hbase的一些体系结构。
一.Hbase客户端
Hbase客户端提供了Shell命令行接口、原生的Java API编程接口、以及MapReduce编程接口。Hbase客户端访问数据之前,首先需要通过元数据表来定位目标数据锁在的RegionServer,之后才会发送请求到目标RegionServer中。同时这些元数据会被缓存在客户端本地,以方便之后的请求访问。如果集群RegionServer发生宕机或者执行了负载均衡等,从而导致数据分片发生迁移,客户端需要重新请求元数据并缓存到本地。
二.zookeeper
zookeeper的应用场景有很多,在hadoop生态中,非常多组件都依赖zookeeper实现集群管理,这里我们只讨论zookeeper在Hbase中的应用。
1.实现HMaster的高可用,一般情况下,在Hbase集群中,是只有一个Master在工作的,当active Master处于异常宕机后,zookeeper会检测到宕机事件,并且通过一定的机制选举出新的Master。
2.管理核心的元数据,例如当前集群中正常运行的RegionServer集合。
3.参与RegionServer的宕机恢复,zookeeper通过心跳检测可以感知到RegionServer是否宕机,并在宕机后通知Master进行恢复。
4.实现分布式锁,Hbase中对一张表进行各种管理操作,需要先加表锁,防止多个用户对同一张表进行管理操作,造成表状态不一致。
三.master
master主要负责Hbase系统的各种管理工作。
1.处理用户各种管理请求,包括建表、修改表、权限操作、切分表、合并数据分片以及Compaction。
2.管理集群中所有regionServer,包括regionServer中region的负载均衡,regionServer的宕机恢复以及数据迁移。
3.负责清理过期日志以及文件,Master会每隔一段时间检查HDFS中Hlog是否过期,HFile是否以及被删除,并在过期之后将其删除。
四.regionServer
1.WAL(Hlog) Hlog在Hbase中有两个核心作用
第一是用于实现数据的高可靠,Hbase数据随机写入时,并非直接写到HFile数据文件中,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入Hlog,这样,即使缓存数据丢失,也可以从Hlog中恢复。
第二是实现集群数据的主从复制。
2.blockCache,它是Hbase中的读缓存,每个regionServer只有一个blockCache,客户端从磁盘读取到数据后,会将数据暂时缓存blockCache中。blockCache是由一些列block块组成的,默认块大小是64kb,它由“物理相邻”的多个KV数据组成,也因此,它具有“空间局部性”和“时间局部性”。
目前blockCache由两种实现方式,分别是LRUblockCache和BucketCache。
空间局部性是指用户在读取数据的时候,上一次读取的数据和这次读取的时间很可能是物理相邻的,因此缓存的时候直接以block为单位,而不是一个个KV对进行缓存。
时间局部性是指一个KV数据正在被访问,那么他近期还可能会再次被访问。
3.region,它是数据表的一个分片,当数据表大小超过一定的阈值,就会“水平切分”成两个或多个数据分片。region是集群负载均衡的基本单位,通常一张表的region会分布在整个集群的多台regionServer上,一个regionServer上会管理多个region,而同一个regionServer上的region一般来自不同的数据表。
一个region由多个store组成,store是根据列簇来划分的,有多少个列簇,就有多少各store,每个列簇中的数据集中存放在一个store里面。
一个store由一个memstore和多个Hfile组成,memstore是hbase的写入缓存,用户写入数据时首先会写到memstore,当memstore写满之后(阈值默认是128M),会异步flush成一个Hfile,而当写入操作持续进行,Hfile会越来越多,这时候系统会进行compact操作,将这些小文件通过一定的策略合并成一个或多个大文件。
五.HDFS
Hbase的底层时HDFS,用户数据和HLog日志最终都会落盘到HDFS中。