hbase写日志为什么比写hfile快

如题所述

在HBase的根目录下面,有两个跟日志相关的目录,.logs和.oldlogs。.logs保存的是所有Regionserver上当前在写入的HLog,可以看到每个RegionServer对应一个文件,所以HLog是对应RegionServer的。
HLog默认情况下每个小时会滚动,这是通过参数hbase.regionserver.logroll.period控制的,这个参数的默认值是1小时。
此外,hbase.regionserver.hlog.blocksize和fs_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 :序列号,在恢复的时候,会判断这个id和HFile中序列ID的大小,小于HFile序列ID(MAX_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
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答