關於HBase的日誌檔案和HFile

orchidllh發表於2013-11-27

HBase的根目錄下面,有兩個跟日誌相關的目錄,.logs.oldlogs.logs儲存的是所有Regionserver上當前在寫入的HLog,可以看到每個RegionServer對應一個檔案,所以HLog是對應RegionServer的。

HLog預設情況下每個小時會滾動,這是通過引數hbase.regionserver.logroll.period控制的,這個引數的預設值是1小時。

此外,hbase.regionserver.hlog.blocksizefs_local.block.size控制當HLog的大小超過32M的時候,會滾動。

Hbase.regionserver.logroll.multiplier,預設值是95%,表示日誌達到95%的時候,也會進行滾動。

日誌檔案的滾動操作,就是檢查HFile中的序列號,確認日誌中所有的序列號都小於HFile的序列號,確保所有的日誌內容都已經固化到HFile中,確認後將當前的日誌挪到.oldlog目錄下。

 

這裡有個問題還有些疑惑,書裡寫的是檢查寫入儲存檔案中最大的序列號是多少,小於這個序列號的所有修改都已經固化了,只要確保日誌中的最大序列號比這個序列號小,就可以確認這個日誌已經固化,可以挪到.oldlog下。

但是memstore重新整理到HFile是對HStore的,對錶的,可能有的表更新比較多,重新整理的快,已經固化到HFile,但有的表修改少,還沒有重新整理到HFile,這和序列號的順序應該是沒有必然的關係的,後續應該可以做個測試來驗證一下。

 

當前日誌的檔案,在寫滿一個塊之前,都顯示的是0位元組,但實際上可能已經有資料,只是顯示的問題而已。

現在插入幾條記錄,做些修改的操作,檢視日誌的內容:


hbase(main):001:0> put't_lisa','lisa5','cf_1:w1','10d2'

0 row(s) in 0.4590 seconds

 

hbase(main):002:0> put't_lisa','lisa6','cf_1:w1','1032'

0 row(s) in 0.0050 seconds

 

hbase(main):003:0> put't_lisa','lisa7','cf_1:w1','10z2'

0 row(s) in 0.0040 seconds

 

hbase(main):004:0> put't_lisa','lisa8','cf_1:w1','10e2'

0 row(s) in 0.0040 seconds

 

hbase(main):002:0> delete 't_lisa','lisa5','cf_1'

0 row(s) in 0.4270 seconds

 

檢視日誌檔案,雖然大小為0,但是實際上寫操作是先寫了WAL,才寫memstore的,這裡只是檔案大小顯示的問題。

每個regionserver最初都會有一個HLog,不管是不是有更新操作。

[root@a01 hbase]# hadoop fs -ls /hbase_root/.logs

檢視日誌檔案的內容,-p表示檢視對應的value


[root@a01 hbase]# bin/hbase hlog /hbase_root/.logs/*,60020,1385442023669/*%2C60020%2C1385442023669.1385449225598 -p

Sequence 2316016 from region fa8f6eb2a0bcb54e443f9bfc2693768d in table t_lisa

  Action:

    row: lisa5

    column: cf_1:w1

    at time: Tue Nov 26 15:17:04 CST 2013

    value: 10d2

Sequence 2316017 from region fa8f6eb2a0bcb54e443f9bfc2693768d in table t_lisa

  Action:

    row: lisa6

    column: cf_1:w1

    at time: Tue Nov 26 15:17:04 CST 2013

    value: 1032

Sequence 2316018 from region fa8f6eb2a0bcb54e443f9bfc2693768d in table t_lisa

  Action:

    row: lisa7

    column: cf_1:w1

    at time: Tue Nov 26 15:17:04 CST 2013

    value: 10z2

Sequence 2316019 from region fa8f6eb2a0bcb54e443f9bfc2693768d in table t_lisa

  Action:

    row: lisa8

    column: cf_1:w1

    at time: Tue Nov 26 15:17:04 CST 2013

    value: 10e2

Sequence 2316020 from region fa8f6eb2a0bcb54e443f9bfc2693768d in table t_lisa

  Action:

    row: lisa5

    column: cf_1:

    at time: Tue Nov 26 15:31:49 CST 2013

value: 

 

擷取其中的一小段進行分析:

Sequence 2316016 from region fa8f6eb2a0bcb54e443f9bfc2693768d in table t_lisa

  Action:

    row: lisa5

    column: cf_1:w1

    at time: Tue Nov 26 15:17:04 CST 2013

    value: 10d2

Sequence 2316016 :序列號,在恢復的時候,會判斷這個idHFile中序列ID的大小,小於HFile序列IDMAX_SEQ_ID_KEY)的操作不用再重做,因為已經固化到資料檔案中了。

region fa8f6eb2a0bcb54e443f9bfc2693768d:region name中按照前面部分的MD5雜湊值

table t_lisa: 表名

row: lisa5:行鍵

column: cf_1:w1:列族和列識別符號

value: 10d2:值

Delete 和 insert操作的日誌並沒有明顯寫明action

 

 

檢視HFile的資訊,這裡可以看到HFile中的kv資料、壓縮、起始rowkey等非常詳細的資訊:

[root@a01 ~]# cd /home/hbase

[root@a01 hbase]# bin/hbase org.apache.hadoop.hbase.io.hfile.HFile -f /hbase_root/t_lisa1/787ce41dabb55075935e7060583ae6af/cf_1/e541b8a04f224e869166ee43783bd8d0 -v -m -p


K: lisa1/cf_1:a/1384389531130/Put/vlen=1/ts=0 V: 1


K: lisa1/cf_1:b/1384390435899/Put/vlen=1/ts=0 V: 6

K: lisa1/cf_1:b/1384389531157/Put/vlen=1/ts=0 V: 5

K: lisa1/cf_1:b1/1384390714903/Put/vlen=2/ts=0 V: 61

    firstKey=lisa1/cf_1:a/1384389531130/Put,


    lastKey=lisa1/cf_1:b1/1384390714903/Put,

    MAX_SEQ_ID_KEY = 2309244


 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/51862/viewspace-1061242/,如需轉載,請註明出處,否則將追究法律責任。

相關文章