工作生活

HBase 之工作原理

2019-07-04  本文已影响0人  MrSocean
借用HBase官网对其的介绍来初步认识一下HBase,当你需要对大量的数据进行随机,实时的读/写访问时,请使用Apache HBase™。这个项目的目标是在非常大的表中,存储管理亿级别的行和百万级别的列。Apache HBase是一个开源的、分布式的、版本化的、非关系数据库。在此借鉴网络,来去帮助自己再去理解理解HBase是什么?在此记录下来,便于自己后期翻看。

HBase特性

HBase数据模型

图1

类似于传统数据库中的表的概念,用于组织存放数据在HBase中。

HBase中的数据是以行的形式进行存储,每一行数据都会被一个唯一行健(Row Key)进行标识。Row Key在存储的过程中是按照字典的顺序排序的。其只能存储64k的字节数据。

HBase表中的每个列都归属于某个列簇,列簇在我们定义表的时候指定。列名以列簇作为前缀,每个列簇都可以有多个列成员(column),新的列可以随后按需,动态加入;权限控制,存储以及调优都是在列簇层面进行的。

Cell是由行,列簇和列的坐标交叉决定的,其是有版本号的,每个Cell的内容是未解析的字节数组。由{row key, column( =<family> +<qualifier>), version}唯一确定Cell。Cell中的数据是没有类型的,全部是字节码的形式存储。

在HBase中每个Cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。

HBase物理存储

图2

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

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

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

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

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

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读写流程

HBase读流程
图3

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写流程
图4

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这个小节里查找☞☞☞

图5

HBase文件合并

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

图6

HBase Region 的分裂

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

图7
上一篇下一篇

猜你喜欢

热点阅读