hbase写hlog为什么比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 = 230924
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答