HBase 架构|存储

.tmp

临时数据,比如更新.tableinfo文件时生成的临时数据 md5..region级文件

.tableinfo文件在.tabledesc目录里面

region级文件

HBase 架构|存储

region级文件位于表目录里面。region级文件的目录时一部分region名字的MD5散列值。

目录/文件名用途
.regioninfo对应region的HRegionInfo实例反序列化的信息
recovered.edits存放临时的拆分文件

- 在WAL回收时,任何未提交的修改都会被写入到每个region的一个单独的文件(splitlog)中。

- 将上述文件移动到临时的recovered.edits文件中

- 若region被打开,region服务器将会看到需要恢复的文件,并放回其中对应的条目

一旦region超过了配置中region大小的最大值,region就需要拆分,其会创建一个对应的splits目录,它被用来临时存放两个region相关的数据。如果拆分成功(通常这个过程持续几秒或更短),之后它们会被移动到表目录中,并形成两个新的region,每个region代表原始值的一半。

当用户看到region的目录中:

- 没有.tmp目录,意味着还没有进行过压缩操作

- 没有recovered.edits目录,意味着WAL没有进行过回放操作

region拆分

在拆分过程中,所有的步骤在ZooKeeper中都进行跟踪,这使得一个服务器失效时,其他进程可以直到这个region的状态。

HBase 架构|存储

region合并

存储文件会被后台的管理进程仔细的监控起来以确保它们处于控制值夏,随着memstore的写入会生成很多的磁盘文件,如果文件的数目达到阈值,合并过程将会把它们合并成数量更少,体积更大的文件。这个过程持续到这些文件超过配置的最大存储文件大小,会触发一个region拆分

压缩合并有两种,即minor和major。

  • minor合并负责重写最后生成的几个文件到一个更大的文件中。
  • major合并会将所有文件压缩成一个单独的文件,在执行压缩检查时,系统自动决定运行哪种合并。

minor合并可以处理的最大文件数量默认是10,用户可以通过hbase.hstore.compaction.max来配置。 如果海没有达到major合并的执行周期,系统会选择minor合并执行。当minor合并包括所有的存储文件,且所有文件均未达到设置的每次压缩的最大文件数时,minor合并可能被提升成major合并。

HFile 格式

实际的存储文件功能是由HFile类实现的,它被专门创建达到一个目的:有效的存储HBase的数据。它们基于Hadoop的TFile类。HFile参考BigTable的SSTable和Hadoop的TFile实现,从HBase开始到现在,HFile经历了三个版本,其中V2在0.92引入,V3在0.98引入。这里我们看下V1的格式。

HBase 架构|存储

这些文件是可变长度的,唯一固定的块是File Info块和Trailer块。如上图所示:

Trailer有指向其他块的指针,它是在持久化数据到文件结束时写入的,写入后即确定其成为不可变的数据存储文件。

Index块记录Data和Meta块的偏移量。

Data和Meta块实际上都是可选的,但是考虑到HBase如何使用数据文件,在存储文件中用户几乎总能找到Data块。

在HDFS中,文件的默认块大小是64MB(现默认是128MB),这个是HFile默认块大小的1024倍,因此HBase存储文件的块与Hadoop的块之间并没有匹配关系。事实上,这两种块类型之间根本没有相关性。HBase把它的文件透明的存储到文件系统中,而HDFS也使用块来切分文件仅仅是一个巧合,并且HDFS并不知道HBase中存储的是什么。

下图描述了逻辑上把一个单元格的数据存储到一张表中,到实际存储到HDFS的映射过程。

HBase 架构|存储

KeyValue格式

KeyValue类是HBase中数据存储的核心,由keylengthvaluelengthkeyvalue四个部分组成。

其中Key又由Row Length

Row、Column Family LengthColumn FamilyColumn QualifierTime StampKey Type七部分组成。

KeyValue不会在块之间拆分。例如,如果有一个8 MB的KeyValue,即使块大小是64kb,这个KeyValue将作为一个连续块读取。

  • KeyLength存储Key的长度,占4B;
  • ValueLength存储Value的长度,占4B;

Key存储具体的Cell数据

Key作用
Row Length存储rowkey的长度,占2B (Bytes.SIZEOF_INT)
Row 存储Rowkey实际内容,其大小为Row Length
Column Family Length存储列簇Column Family的长度,占1B (Bytes.SIZEOF_BYTE)
Column Family存储Column Family实际内容,大小为Column Family Length
Column Qualifier存储Column Qualifier对应的数据
Time Stamp存储时间戳Time Stamp,占8B (Bytes.SIZEOF_LONG)
Key Type存储Key类型Key Type,占1B ( Bytes.SIZEOF_BYTE),Type分为Put、Delete、DeleteColumn、DeleteFamilyVersion、DeleteFamily、Maximum、Minimum等类型,标记这个KeyValue的类型

由于Key中其它的字段占用大小已经知道,并且知道整个Key的大小,因此没有存储Column Qualifier的大小。

Value存储单元格Cell对应的实际的值Value

示例

对于Put: rowkey=row1, cf:attr1=value1操作,Key对应关系如下:

keyvalue
rowlength4
rowrow1
columnfamilylength2
columnfamilycf
columnqualifierattr1
timestamp
server time of Put
keytypePut


分享到:


相關文章: