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