初探HBase

初探HBase

Scroll Down

HBase是一个基于HDFS文件系统的分布式NO-SQL数据库,比起RDBMS,它的特点是高可靠性、高性能、面向列、可伸缩,且能够在廉价硬件构成的集群上管理超大规模的稀疏表。

粒度

HBase表(table)中纵向的最基本的单位是列(qualifier),多个列组成一个列族(family),横向的最基本单位为行(row),每个行拥有一个唯一行键(row key),多个行组成一个区域(Region),且所有行键按照字典序进行排序存储,列和行的每个交错点为一个单元格,每个单元格可以保存多个版本。 引用列的时候一般需要带上列族(family:qualifier),列和列族可以是任何的字节数组,列族的数量受HBase实现的限制(大约为几十),但列的数量没有限制

纵向

  • 列(qualifier)
  • 列族(family)

横向

  • 行(row)
  • 区域(Region)

单元格(Cell)

  • 单元格(Cell)是列(qualifier)和行(row)的交错点
  • HBase中每一个单元格的值都具有一个时间戳,默认为系统取当前时间,也可以由用户显示指定,可以通过不同的时间戳区分一个值的不同版本,一个单元格的不同版本值按照降序排列在一起,访问时不指定版本时默认读取最新的值
  • 用户可以指定每个值所能保存的最大版本数

Region

Region是HBase中拓展和负载均衡的基本单元,每个Region由表中行的子集构成,每个Region由它所属的表,它所包含的第一行及其包含的最后一行(不包括最后一行)来表示,一张表初始时只有一个Region,,但当Region的大小超过配置的最大值时,系统会在中间键处将这个Region拆分成两个大致相等的子Region 每一个Region只能由一个Region服务器加载,分布式多Region 服务器情况下一张表的逻辑视图如下所示: hbaseregion.png

可视化表现

HBase与普通RDBMS在行设计上不同,因此在可视化表现上也没有想经典的电子表格模型那样排列,而是采用了标签描述,具体的值都保存在一个特定的标签下 hbaseview.png

在标签描述下我们可以发现NULL值不会对应到任何标签,实际上,在HBase的存储架构中,会省略NULL值对应的整个列,也就是说,NULL值不占任何的存储结构开销。

存储相关

预写日志

每次更新数据时,数据记录都会先提交在一个提交日志中,然后才会将这些数据写入内存的memstore缓存区中。当memstore缓存区中的写入量累计大小超过了一个给定的最大值,系统才会将这些数据移出内存作为HFile文件刷写到磁盘中,memstore中的数据已经按照键排序,所以持久化到磁盘中的HFile也是按照这个顺序排列的

majar compaction

当HBase中的数据经历过多次删除,TTL后,将会产生大量零碎的HFile,因此需要一种操作将一个Region中一个列族的若干个HFile重写为一个新的HFile,这就是majar compaction,经过majar compaction后,HFile数量减少,文件大小减小,能够显著提高读数据的效率,但是缺点是它非常占用资源,在执行的过程中将会严重影响读写效率

触发时机

  • 通过 CompactionChecker 线程来定时检查是否需要执行 compaction(RegionServer 启动时在 initializeThreads() 中初始化),每隔10000秒(可配置)检查一次
  • 每当 RegionServer 发生一次 Memstore flush 操作之后也会进行检查是否需要进行 Compaction 操作
  • 手动触发,执行命令 major_compact 、 compact

split

split是HBase根据一定的触发条件和一定的分裂策略将HBase的一个Region进行分裂成两个子Region并对父Region进行清除处理的过程

Pre-splitting

一个表刚被创建的时候,Hbase 默认分配一个 Region 给表,所有的读写请求都会访问到一个 RegionServer 上的唯一一个 Region。这样就达不到负载均衡的效果了,对于该表的请求将不会负载到集群中的其他 RegionServer上,形成读写热区

触发split的三种条件

  1. 当memstore flush操作后,HRegion写入新的HFile,有可能产生较大的HFile,HBase就会调用CompactSplitThread.requestSplit判断是否需要split操作
  2. HStore刚刚进行完compact操作后有可能产生较大的HFile,当满足HBase的某一分裂策略后就会进行split操作。
  3. 当HBaseAdmin使用命令手动发起split时,也会触发split操作

物理架构

HBase物理架构主要由三个组件组成:

  • 主服务器(一般采用ZooKeeper为Region服务器分配Region)
  • Region服务器(加载被分配的Region)
  • 客户端