hbase简介
上周介绍了Mysql索引,我们知道一个完整的记录是保存在一个page中的连续的空间,类似如下图
具体一个表包含了哪些字段、每个字段类型、长度等,都是在表定义的时候确定的。后续需要新增字段、修改字段类型等,那么代价是很大的,需要做很多的空间腾挪和数据的复制。
今天介绍的hbase就是没有这么多的约束了。
一 基本概念
rowKey:这个用来标示一条记录的,一般有几个字段按照特定的规则组合而成的,这个的设计比较重要,他决定了后面这个表的数据的均衡、查询效率等。
列簇:简单的讲,就是一些列的组合,比如用户信息表中,我们比如用户基本信息,这个包含id、姓名等最重要的信息,这里基本信息就可以理解为一个列簇。
列:这个没有什么特别,就不说了
版本:如果在mysql中,一个字段被更新了,那么值就找不到了,除非你通过其他的存储备份了;但是在hbase中,允许保存多份数据,具体多少份在建表的时候指定,一般使用更新时时间戳来表示版本。
二 表结构
有了上面的概念,hbase表结构如下图
但是在实际存储中,他是通过kv的格式存储的,其中:
key: rowkey+columnFamily+cloumn+version组成
value:就是具体的值
比如上面的用户存储如下图:
这些数据最终会存在Hfile中。
三 整体结构
借用一张图
HMaster:负责管理HRegionServer以实现负载均衡,负责管理和分配HRegion(数据分片),还负责管理命名空间和table元数据,以及权限控制
HRegionServer:负责管理本地的HRegion、管理数据以及和hdfs交互。
Zookeeper:负责集群的协调(如HMaster主从的failover)以及集群状态信息的存储
客户端:传输数据直接和HRegionServer通信
对于hbase而言,整个系统的核心还是在HRegionServer,所以下面重点介绍下
四 HRegionServer介绍
整个HRegionServer有一个HLog和若干个HRegion组成的
HLog: 这个类似mysql中的binlog,记录了所有的写操作,万一系统down了,可以从这个文件中去恢复数据
HRegion: 这个对应表的维度,里面存储了一个表的一段区间的数据。他主要有若干个Store组层
Store: 这个对应了表的列簇维度,他有一个memstore和若干个storefile组成。 其中memstore中包含了刚写入hbase中的数据,而storefile按照LGM树组织。
五 过程分析
写过程:
-
客户端通过HMaster确定写入的数据需要到哪个HRegionServer
-
客户端把请求发送到HRegionServer
-
在HRegionServer中,把数据写入HLog中,然后根据表名和列簇定位到具体的store中,然后把数据写入到memstore中,当memstore超过设定的大小,就会写入磁盘,形成storefile。当同层storefile数量超过阈值,就会触发storefile合并。
读过程:
-
客户端通过HMaster确定读取的数据需要在哪些HRegionServer
-
客户端把请求发送到所有的HRegionServer
-
在HRegionServer中,从store中进行数据的查找定读取目标数据。
storeFile合并
为什么需要合并:一是我们新写入的数据,一开始在memtable中的,后面会刷到磁盘中,这个时候会出现多个storefile,尽管每个文件内部是有序的,但是相互之前存在交叉,在查询时候需要访问多个文件,影响查询效率。 第二是有些数据因为被删除或者过了ttl,需要对他们进行删除,否则浪费空间,影响查询效率。
过程很简单,打开需要合并的文件,因为本身就是有序的,所有只要比较当前读取位置的数据,过滤掉无效的,把最小的数据写入新的文件,最小数据所在的文件读取位置往后移动。
六 总结
优点:
1、海量存储:HMaster把有序数据分成多个段,分别存储到不同的HReginServer上。 底层文件存在hdfs上,可以实现海量数据存储。
2、高效查询:利用LGM树和 storeFile,实现数据在磁盘上的有序存储,能够高效的实现查询和scan操作
3、高效写入:写入时候,主要写入HLog和memtable,前者是磁盘append,后者是内存,所以速度很快,支持高并发。
4、节省空间:采用列式存储,对于空的字段,不需要浪费空间,特别适合稀疏的数据。
缺点:
1、单维度查询:因为按照 rowkey存储,查询时候只能是按照rowkey或者其前缀进行查询,如果需要其他维度就没发实现。这个有点类似我们分库、分表,只能按照分的字段进行查询。 之前有人在搞二级索引,这个是个思路,不清楚现在搞怎么样了,有空也学习下。
2、抖动:因为合并会有大量的磁盘读取和写入操作,所以会出现抖动,这也导致了hbase没发用到高要求的业务场景。
想交流或者疑问的,可以关注我们的公众号