HBase存储格式与文件系统

HBase数据库为Hadoop提供了类似Goolge BigTable的存储能力。作为BigTable的开源实现,HBase在文件系统、MapReduce和协同服务方面与Google有所不同,却又非常相似。这篇文章将主要谈HBase在底层存储机制,特别是存储格式和文件系统方面的实现方式。

作为分布式的存储系统,HBase基于Memtable/SSTable进行存储设计。整个存储系统分为Memtable和SSTable两部分;其中,Memtable(MemStore)负责内存,HFile(SSTable)负责磁盘。

HBase中的数据文件存储在Hadoop HDFS文件系统,一般分为两种文件类型:HFile和HLog File。HFile是二进制格式的文件,HBase中的Key-Value数据的存储通过HFile格式进行;HLog则是WAL(Write Ahead Log)的存储格式,即Hadoop的Sequence File。

HFile

HFile文件长度不定,只有Trailer和FileInfo两块长度固定。正如图中所示的,Trailer的指针指向其他数据块的起始点。File Info负责记录文件的Meta信息,例如:LAST_KEY,COMPARATOR,AVG_KEY_LEN,AVG_VALUE_LEN等。每个Data块和Meta块的起始点则分别由Data Index和Meta Index负责记录。

HBase的存储格式示例图

Data Block是HBase I/O的基本单元,通过Block Cache机制提升效率。每个Data块的大小可以在创建一个Table的时候通过参数指定,大的Block有利于顺序Scan,小的Block利于随机查询。每个Data块除了开头的Magic以外就是各个Key-Value对拼接而成, Magic内容就是一些随机数字,目的是防止数据损坏。

HFile中的Key-Value结构

HFile中的每个Key-Value对就是一个简单的byte数组。但这个byte数组包含了很多项信息,并含有固定的结构。

开始是两个长度固定的数值,分别表示Key的长度和Value的长度。紧接着是Key,开始是固定长度的数值,表示RowKey的长度,紧接着是RowKey,然后是固定长度的数值,表示Family的长度,然后是Family,接着是Qualifier,然后是两个固定长度的数值,表示Time Stamp和Key Type(Put/Delete)。Value部分则相对简单,是纯粹的二进制数据。

HLogFile

再来看HLogFile。之前我们讲到HLog是WAL(Write Ahead Log)的存储格式,即Hadoop的Sequence File。

HLogFile文件结构示例图

HLog文件的结构就是一个普通的Hadoop Sequence File。Sequence File的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是“写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。HLog Sequece File的Value是HBase的Key-Value对象,即对应HFile中的Key-Value。

HBase发源于Google BigTable,在底层存储机制层面,虽然与BigTable有所不同,但其文件系统和存储格式的核心依然基于Hadoop HDFS文件系统。

In Big Data会在以后的文章中详谈HBase在MapReduce和系统协同方面的内容,请继续关注。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/6f200286e887f0acf4526df9a08eda7c.html