本文共 1753 字,大约阅读时间需要 5 分钟。
写过程
1.Client访问ZK,根据ROOT表获取meta表所在Region的位置信息,并将该位置信息Client Cache。 (注:为了加快数据访问速度,我们将元数据、Region位置等信息缓存在Client Cache中。)2.Client读取meta表,再根据meta表中查询得到的Namespace、表名和RowKey等相关信息,获取将要写入Region的位置信息(此过程即Region三层定位,如下图),最后client端会将meta表写入Client Cache。
3.Client向上一步HRegionServer发出写请求,HRegionServer先将操作和数据写入HLog(预写日志,Write Ahead Log,WAL),再将数据写入MemStore,并保持有序。
(联想:HDFS中也是如此,EditLog写入时机也是在真实读写之前发生)4.当MemStore的数据量超过阈值时,将数据溢写磁盘,生成一个StoreFile文件。
当Store中StoreFile的数量超过阈值时,将若干小StoreFile合并(Compact)为一个大StoreFile。 当Region中最大Store的大小超过阈值时,Region分裂(Split),等分成两个子Region。大型分布式系统中硬件故障很常见,HBase也不例外。
HBase通过在写动作发生之前先写入WAL(即:HLog)。 HBase集群中每台服务器维护一个WAL来记录发生的变化。获取将要读取Region的位置信息(同读的1、2步)。
1.Client向HRegionServer发出读请求。 2.HRegionServer先从MemStore读取数据,如未找到,再从StoreFile中读取。 3.StoreFile合并(Compaction) 目的:减少StoreFile数量,提升数据读取效率。Compaction分为两种:
1.minor compaction:
轻量级合并过程。将符合条件的一开始生成的多个storefile合并成一个大的storfile,此时不会删除被标记为"delete"的数据和已经过期的数据。执行一次minor合并操作后,还会有多个storefile文件。 2.major compaction: 重量级合并过程。把所有storefile合并成单一的storefile文件,在合并过程中会把标记为"删除"的数据和过期数据一并删除。合并过程中,对请求该Region的所有客户端阻塞,直到合并完毕。最后删除参与合并的(小)storefile文件。Region分割(Split)
目的:实现数据访问的负载均衡。做法:利用Middle Key将当前Region划分为两个等分的子Region。需要指出的是:Split会产生大量的I/O操作,Split开始前和Split完成后,HRegionServer都会通知HMaster。Split完成后,由于Region映射关系已变更,故HRegionServer会更新meta表。
由于无法直接修改HBase里的数据,所有的Update和Delete操作都转换成Append操作。而且HBase里也没有索引,因此读数据都是以Scan的方式进行。
Client在读数据时,一般会指定TimeStamp和ColumnFamily。根据ColumnFamily和TimeStamp可以过滤掉很大一部分Store,然后在剩下的Store中Scan。 在ZooKeeper中有HBase的两个缺省命名空间:default和hbase。其中hbase中存放的都是系统内建表(用户创建的namespace和meta表);default中存放未指定命名空间的表。转载地址:http://mxrwi.baihongyu.com/