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树组织。

 

五 过程分析

 

写过程:

  1.  客户端通过HMaster确定写入的数据需要到哪个HRegionServer

  2.  客户端把请求发送到HRegionServer

  3.  在HRegionServer中,把数据写入HLog中,然后根据表名和列簇定位到具体的store中,然后把数据写入到memstore中,当memstore超过设定的大小,就会写入磁盘,形成storefile。当同层storefile数量超过阈值,就会触发storefile合并。 

     

     

 

 

读过程:

 

  1.  客户端通过HMaster确定读取的数据需要在哪些HRegionServer

  2.  客户端把请求发送到所有的HRegionServer

  3.  在HRegionServer中,从store中进行数据的查找定读取目标数据。 

 

 

storeFile合并

为什么需要合并:一是我们新写入的数据,一开始在memtable中的,后面会刷到磁盘中,这个时候会出现多个storefile,尽管每个文件内部是有序的,但是相互之前存在交叉,在查询时候需要访问多个文件,影响查询效率。 第二是有些数据因为被删除或者过了ttl,需要对他们进行删除,否则浪费空间,影响查询效率。 

 

过程很简单,打开需要合并的文件,因为本身就是有序的,所有只要比较当前读取位置的数据,过滤掉无效的,把最小的数据写入新的文件,最小数据所在的文件读取位置往后移动。 
 

六 总结
 

优点:

 

1、海量存储:HMaster把有序数据分成多个段,分别存储到不同的HReginServer上。 底层文件存在hdfs上,可以实现海量数据存储。 

 

2、高效查询:利用LGM树和 storeFile,实现数据在磁盘上的有序存储,能够高效的实现查询和scan操作

 

3、高效写入:写入时候,主要写入HLog和memtable,前者是磁盘append,后者是内存,所以速度很快,支持高并发。 

 

4、节省空间:采用列式存储,对于空的字段,不需要浪费空间,特别适合稀疏的数据。 

 

缺点:

 

1、单维度查询:因为按照 rowkey存储,查询时候只能是按照rowkey或者其前缀进行查询,如果需要其他维度就没发实现。这个有点类似我们分库、分表,只能按照分的字段进行查询。 之前有人在搞二级索引,这个是个思路,不清楚现在搞怎么样了,有空也学习下。 

 

2、抖动:因为合并会有大量的磁盘读取和写入操作,所以会出现抖动,这也导致了hbase没发用到高要求的业务场景。 

想交流或者疑问的,可以关注我们的公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值