HBase的体系结构借鉴了BigTable论文,是典型的Master-Slave模型。
HBase客户端提供了Shell命令行接口、原生Java API编程接口、Thrift/REST API编程接口以及MapReduce编程接口。HBase客户端支持所有常见的DML操作以及DDL操作,即数据的增删改查和表的日常维护等。其中Thrift/REST API主要用于支持Java的上层业务需求,MapReduce接口主要用于批量数据导入以及批量数据读取。
HBase客户端访问数据行之前,首先需要通过元数据表定位目标数据所在的RegionServer,之后才会发送请求到该RegionServer。同时这些元数据会被缓存在客户端本地,以方便之后的请求访问。如果集群RegionServer发生宕机或者执行了负载均衡等,从而导致数据分片发生迁移,客户端需要重新请求最新的元数据并缓存在本地。
Master主要负责HBase系统的各种管理工作,其实现类为HMaster,主要作用如下:
RegionServer主要用来响应用户的IO请求,是HBase中最核心的模块,由WAL(HLog)、BlockCache以及多个Region构成。
HLog在HBase中有两个核心作用:
? 1. 用于实现数据的高可靠性,HBase数据随机写入时,并非直接写入HFile数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入HLog,这样,即使缓存数据丢失,仍然可以通过HLog日志恢复。
? 2. 用于实现HBase集群间主从复制,通过回放主集群推送过来的HLog日志实现主从复制。
HBase系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存到系统内存中,后续访问同一行数据可以直接从内存中获取而不用访问磁盘。对于带有大量热点数读的业务请求来说,缓存机制会带来极大的性能提升。
Region就是类似于表的概念,在HBase中它是一张表进行横向切分的切片,横跨多个列族。当数据表大小超过一定阈值就会“水平切分”,分裂为两个Region。Region是集群负载均衡的基本单位。通常一张表的Region会分布在整个集群的多台RegionServer上,一个RegionServer上会管理多个Region,当然,这些Region一般来自不同的数据表。
一个Region由一个或者多个Store构成,Store的个数取决于表中列族的个数,多少个列族就有多少个Store。HBase中,每个列族的数据都集中存放在一起形成一个存储单元Store,因此建议将具有相同IO特性的数据设置在同一个列族中。
每个Store由一个MemStore和一个或者多个HFile组成。MemStore称为写缓存,由于HFile 中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,当MemStore写满之后(缓存数据超过阈值,默认128M)系统会异步地将数据flush成一个HFile文件。显然,随着数据的不断写入,HFile文件会越来越多,当HFile文件数超过一定阈值之后系统将会执行Compact操作,将这些小文件通过一定策略合并成一个或者多个大文件。数据在每个HFile中都是有序的。
RegionServer为Region的管理者(数据级别的管理),其实现类为HRegionServer,它可以实现如下具体的操作:
HDFS为HBase提供最终的底层数据存储服务,包括用户数据文件、HLog日志文件等最终都会写入HDFS落盘。同时HDFS默认的三副本存储策略可以有效保证数据的高可靠性。HDFS内部封装了一个名为DFSClient的HDFS客户端组件,负责对HDFS的实际数据进行读写访问。
从HBase的结构图可以看出,用户Client并没有和Master直接相连,而是直接连接的zookeeper,zookeeper承担了一部分Master的功能,Client除了连接zookeeper还连接了RegionServer,所以即使Master挂掉了,用户客户端依旧可以完成对数据的读写操作。
原文:https://www.cnblogs.com/yxym2016/p/14928996.html