HBase数据模型与读写方式

 

  • HBase表结构

这里以一个公司员工表为案例来讲解,此表中包含员工基本信息(员工姓名、年龄),员工详细信息(工资、角色),以及时间戳。整体表结构如下:

如上,每一行有一个RowKey用于唯一地标识和定位行,各行数据按RowKey的字典序排列。其中ImployeeBasicInfoCLF和DetailInfoCLF是两个列族,列族下又有多个具体列。(员工基本信息列族:姓名、年龄。详细信息列族:薪水、角色)

(注1:图中列族下面每一行中特定列中只画了最新版本的数据,实际上HBase最小存储单元为cell,图中每个单元格中其实有多个MVCC version版本的cell,Hbase的更新操作会带时间戳,对每个数据单元cell,可存取指定数量版本的cell,client端可以指定查询某时间点后的最新数据,也可以一次性得到cell的所有版本。)
(注2:刚刚评论里有同学提到cell的概念,这里详细说一下,cell里可得道的信息包含: row、 column family、 column qualifier(列限定符)、timestamp、type6、MVCC version、value。其中每个cell 由 row、column family、column qualifier、timestamp,、and type唯一标识。
 

  • 命名空间

命名空间是对表的逻辑分组,不同的命名空间类似于关系型数据库中的不同的Database数据库。利用命名空间,在多租户场景下可做到更好的资源和数据隔离。


对应于关系型数据库中的一张张表,HBase以“表”为单位组织数据,表由多行组成。


行由一个RowKey和多个列族组成,一个行有一个RowKey,用来唯一标示。

列族
每一行由若干列族组成,每个列族下可包含多个列,如上ImployeeBasicInfoCLF和DetailInfoCLF即是两个列族。列族是列共性的一些体现。注意:物理上,同一列族的数据存储在一起的。

列限定符
列由列族和列限定符唯一指定,像如上的name、age即是ImployeeBasicInfoCLF列族的列限定符。

单元格
单元格由RowKey、列族、列限定符唯一定位,单元格之中存放一个值(Value)和一个版本号。

时间戳
单元格内不同版本的值按时间倒序排列,最新的数据排在最前面
 

  • HBase表特点

    数据规模大,单表可容纳数十亿行,上百万列。
    无模式,不像关系型数据库有严格的Scheme,每行可以有任意多的列,列可以动态增加,不同行可以有不同的列,列的类型没有限制。
    稀疏,值为空的列不占存储空间,表可以非常稀疏,但实际存储时,能进行压缩。
    面向列族,面向列族的存储和权限控制,支持列族独立查询。
    数据多版本,利用时间戳来标识版本
    数据无类型,所有数据以字节数据形式存储

这篇比较基础,介绍了HBase的适用场景、表的形式、数据模型以及特点,主要是让大家从感性上认识HBase。

 

  • HRegion

HBase表中的数据按照行键的字典顺序排序,HBase表中的数据会按照行的方向切分为多个HRegion。最开始只有一个HRegion,但是随着数据量的不断增加,HRegion会产生分裂,这个过程不停的进行。一个表可能对应一个或者多个HRegion。HRegion是HBase表分布式存储和负载均衡的基本单元,一个表的多个HRegion可能分布在多台HRegionServer上。HRegion和Region是同一个意思,只是叫法不同。

  • Store

HRegion是分布式存储的基本单元,但不是存储的基本单元。其内部结构为,一个HRegion由多个Store来组成。有几个Store取决于建表的时候设置的列簇的数量,一个列簇对应一个Store。之所以这么设计,是因为一个列簇中的数据往往数据很类似,方便进行压缩,节省存储空间。

  • MemStore

表的一个列簇对应一个Store,Store的数量由表的列簇的数量来决定。一个Store由一个MemStore和零个或者多个StoreFile组成。MemStore作为内存缓存区,数据的写操作会先写到MemStore中,当MemStore中的数据增长到一定阀值后,RegionServer会将其中的数据flush到StoreFile中,每次写入行成一个单独的StoreFile。

  • StoreFile

当StoreFile数量增长到一定阀值后,系统会进行合并(minor compaction和major compaction),合并过程会进行版本的合并和删除工作,形成更大的StoreFile。

  • HFile

HFile和StoreFile是同一个东西,只不过是站在HDFS的角度称这个文件时HFile,在HBase的角度叫做StoreFile。

  • HLog(WAL log)

WAL(Write ahead log),类似MySQL中的Binlog,用来做灾难恢复用的,HLog记录数据的所有变更,一旦数据修改,就可以从HLog中进行恢复。
每个HRegionServer维护一个HLog。HLog文件就是一个普通的Hadoop Sequence File,Sequence File的Key是HLogKey对象,HLogKey中记录了写入数据的归属馨馨,除了Table和Region名字外,同事还包括Sequence number和timestamp,timestamp是写入时间,sequence number的起始值是0。HLog Sequence File的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。



HBase读写流程

1.Client先访问Zookeeper,从meta表读取Region的位置,然后读取meta表中的数据。meta中又存储了用户表的Region信息;
2.根据namespace,表名和RowKey在meta表中找到对应的Region信息;
3.找到这个Region对应的RegionServer;
4.查找对应的Region;
5.先从BlockCache找数据,如果没有,再到MemStore里面读;
6.MemStore如果没有,再到StoreFile上读(为了读取的效率);
7.如果是从StoreFile里面读取的数据,不是直接返回给客户端,而是先写入BlockCache里,再返回给客户端。

 

HBase写流程

1.客户端向ZK发送请求,获取meta表所在的RegionServer;
2.客户端通过RegionServer获取到meta表的数据;
3.然后客户端向集群中的RegionServer发送写入数据的请求;
4.RegionServer收到写数据的请求后,将数据写到HLog中,这一步是为了数据的持久化和恢复;
5.RegionServer将数据写入内存(MemStore);
6.然后通知客户端数据写入成功。

HBase Region Flush

MemStore中的数据Flush到HDFS上的触发条件有哪些呢?HBase会在如下几种情况下触发flush操作,需要注意的是MemStore的最小flush单元是HRegion而不是单个MemStore。可想而知,如果一个HRegion中MemStore过多,每次flush的开销必然会很大,因此建议进行表设计的时候尽量减少ColumnFamily的个数。下面设置的参数可以移步官网,在HBase Default Configuration这个小节里查找☞☞☞

  • MemStore级别限制:当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发MemStore刷新;

  • Region级别限制:当Region中所有MemStore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 4* 128M = 512M),会触发MemStore刷新;

  • RegionServer 级别限制:当一个RegionServer中所有MemStore的大小总和达到了上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认40%的JVM内存使用量),会触发部分MemStore刷新。Flush顺序是按照MemStore由大道小执行,先Flush MemStore最大的Region,再执行次大的,直至总体MemStore内存使用量低于阀值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38%的JVM内存使用量);

  • 当一个RegionServer中HLog数量达到上限(可以通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个HLog对应的一个或者多个Region进行flush;

  • HBase定期刷新MemStore:默认周期为1小时,确保MemStore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致有问题,定期的flush操作有20000左右的随机延迟;

  • 手动执行flush:用户可以通过shell命令flush 'tablename' 或者 flush 'region name'分别对一个表或者一个Region进行flush。

图5

HBase文件合并

MemStore每次Flush会创建新的HFile,而过多的HFile会引起读的性能问题,那么如果解决这个问题呢?HBase采用Compaction机制来解决这个问题,在HBase中Compaction分为两种:Minor Compaction和Major Compaction。

图6

 

  • Minor Compaction
    Minor Compaction是指选取一些小的,相邻的StoreFile将它们合并成一个更大的StoreFile,在这个过程中不会处理已经Deleted和Expired的Cell。一次Minor Compaction的结果是更少并且更大的StoreFile。
  • Major Compaction
    Major Compaction是指将所有的StoreFile合并成一个StoreFile,在这个过程中,标记为Deleted的Cell会被删除,而那些已经TTL(time-to-live)的Cell会被丢弃。一次Major Compaction的结果是一个HStore只有一个StoreFile存在。Major Compaction可以手动或自动触发,然而由于它会引起很多的I/O操作而引起性能问题,因而它一般会被安排在比较闲的时间进行。

HBase Region 的分裂

刚开始的时候每个表只有一个Region,当Region变的特别大的时候,它会被分割成两个Region。分隔的Region各自持有原Region一部分数据,当然分裂会报告给HMaster。然后有时候,HMaster会将新分裂的Region移动到其它的RegionServer上面。

图7



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值