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
下面是比对情况,完全吻合: