HBase的keyvalue内部结构

1、创建一个表table1:

hbase> create 'table1','family1','column1'

查看hbase目录,已生成table1目录;

2、创建一个表table2:

hbase> create 'table2','family2','column2'

查看hbase目录,已生成table2目录;

3、插入一条记录:

hbase> put 'table1','rowkey1','family1:column1','value1'

此时,hbase目录没有任何变化,因为数据保存在内存中,还没有写入。

4、关闭hbase,内存中数据会flush到硬盘上。

bin/stop-hbase.sh

查看table1目录下,生成了一个目录family1,可以看到hbase的存储首先是按列族分开存储的;

family1目录下,生成了一个二进制数据文件。

内容大致为以下各个部分:

DATABLK*

rowkey1.family1column1<8字节时间戳>0x04value1

MAJOR_COMPACTION_KEY

MAX_SEQ_ID_KEY

hfile.AVG_KEY_LEN

hfile.AVG_VALUE_LEN

hfile.COMPARATOR

org.apache.hadoop.hbase.KeyValue$KeyComparaor

hfile.LASTKEY

row1key1.family1column1

IDXBLK

rowkey1.family1column1

TRABLK

 

可看出与HFile V1版本较吻合:

 

数据的KEY-VALUE部分,通过网上资料得知,结构如下:

名称             字节数                  说明
--------------------------------------------------------------------
keyLength             4                     表示Key所占的总字节数
valueLength           4                     表示Value所占的总字节数

rowKeyLength          2                     表示rowKey所占的字节数
rowKey                rowKeyLength          rowKey
columnFamilyLength    1                     表示列族名称所占的字节数
columnFamily          columnFamilyLength    列族名称
columnName            columnNameLength      列名
timestamp             8                     时间戳
type                  1                     Key类型,比如是新增(Put),还是删除(Delete)

value                 valueLength           列值
--------------------------------------------------------------------
                      表2.1

 

下面是比对情况,完全吻合:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章