今天来学习HBase
相较于Redis,memcached等缓存型的NoSQL数据库,HBase虽然也是NoSQL数据库,但是其使用更贴近于传统DB数据存储的功能,那么HBase与RDBMS(关系型数据库)的差异在哪里?为何HBase是NoSQL数据库?又为什么要使用HBase呢?今天让我们走近HBase。
1. HBase
HBase是一个开源的、分布式的、面向列(column-oriented)的数据库管理系统。它构建在Hadoop分布式文件系统(HDFS)之上,并受到了Google的Bigtable数据存储系统的启发。HBase提供了实时读/写访问大规模数据集的能力,并具有高可扩展性和高可靠性。
在本质上,HBase仍然是k-v型的数据存储,但是和Redis,memcached等简单直接的k-v存储不同,HBase本身有一些类似于关系型数据库的概念设计,这也为我们初识HBase增加了不小的难度。
2. HBase的逻辑结构
为了更好的理解HBase,让我们先来重新看看MySQL的数据结构:
MySQL的基本数据组织单元是表,表由数据行组成,每一行又有很多属性列。当我们查询数据时,可以按照属性列的值进行判断,筛选出我们所需的数据行,进行数据查询。
HBase和MySQL的结构有一丝丝相像,但其实完全不同:
HBase也有行的概念,并且通过RowKey进行唯一标识,每一行会有很多列族(Colunm Family),每个列族中又可以设置多个列作为属性。与MySQL不同,HBase不同行的同一列族中的列是可以不一样的。当我们在查询数据时,是通过 RowKey+Colunm Family+Colunm 来定位到我们要查找的value的,其本质还是通过一个key来定位value的查询逻辑,所以HBase本质也是k-v型的nosql数据库。
3. HBase的存储结构
HBase在磁盘中的存储结构式HFile,其由一个个k-v数据对组成,而k-v对就是我们上面提及的RowKey+Colunm Family+Colunm到val的映射。值得注意的是,key中还有version与keyType两个属性,其中version也是时间戳,在HBase中,数据的修改操作并不是直接覆盖式的,而是像日志一样增加一条新版本的数据(和ES是一样的,LSM树的思想),因此,同一个RowKey+Colunm Family+Colunm可能会映射到多个val,我们只读取最新的val。
HFile是Hbase在磁盘中的存储结构,我们前面提到,Hbase和ES类似,使用的也是LSM树的存储结构,那么什么是LSM树呢?简单来说分为四步:
- 增删改操作先写入AWL日志(Ahead Write Log),日志写入成功就视为操作成果,日志用于融灾恢复
- 数据先写入内存中的Memstore,提高写入效率。
- 定期刷新内存的Memstore到磁盘的HFile中。
- HFile是一个分层结构,老数据逐步合并下沉。
在搜索时,Hbase也是按照先查内存的Memstore,再逐级查找磁盘的HFile的顺序执行。
4. HBase的分布式架构
HBase的一个重要特点是其天生就是要支持分布式的。
从上图中可以看出,Hbase内部的核心结构由以下几大块组成:HMaster,HRegionServer,HLog,HRegion等,外部系统有Zookeeper等。
- HMaster:用来管理HRegionServer,管理HRegionServer的负载均衡,调整Region分布,不直接与client交互。在一个HBase集群中会存在多个HMaster,不过zookeeper的Master Election机制会保证只有一个HMaster在运行。当运行的HMaster出问题后,其他的HMaster就会立刻补上。
- HRegionServer:一个Hbase集群中有许多个HRegionServer,一个HRegion拥有多个Store(每个Store只会存储一个ColumnFamily)。当客户端发起一个查询数据的请求后,首先,客户端会先连接上zookeeper集群,之后会被路由到对应的HRegionServer。
转载自:https://juejin.cn/post/7393314542095400970