ITPub博客

首页 > 数据库 > NoSQL > 关于HBase的日志文件和HFile

关于HBase的日志文件和HFile

原创 NoSQL 作者:orchidllh 时间:2013-11-27 14:11:42 0 删除 编辑

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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-02-21

  • 博文量
    180
  • 访问量
    848143