一、ttl介绍
1.Time To Live (TTL)
ColumnFamilies可以设置TTL长度(以秒为单位),HBase将在到期时间后自动删除行。这适用于行的所有版本,包括当前版本。
当Minor compaction操作时,仅删除包含过期行的存储文件。设置hbase.store.delete.expired.storefile为false禁用此功能。将最小版本数设置为0以外也会禁用此功能。
HBase还支持按每个单元格设置生存时间(TTL)。
Cell TTL处理和ColumnFamily TTL之间存在两个显着差异:
• Cell TTL以毫秒而不是秒为单位表示。
• Cell TTL的TTL不能超过ColumnFamily 的TTL。
二、Column Family的TTL使用
1.查看带清理表结构
hbase(main):001:0> desc 'wxy:test'
Table wxy:test is ENABLED
wxy:test
COLUMN FAMILIES DESCRIPTION
{NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS =
> '2', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
{NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSIO
N => 'NONE', VERSIONS => '5', TTL => 'FOREVER', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOC
KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
2 row(s) in 0.9730 seconds
2.修改TTL的值,CF的TTL的值以秒为单位
TTL=>的更新超时时间是指:该列最后更新的时间,到超时时间的限制,而不是第一次创建,到超时时间;
hbase(main):003:0> disable 'wxy:test'
0 row(s) in 1.3500 seconds
hbase(main):004:0> alter 'wxy:test', {NAME=>'f1', TTL => '1296000'}
Updating all regions with the new schema...1/1 regions updated.Done.0 row(s) in 1.1780 seconds
hbase(main):002:0> desc 'wxy:test'
Table wxy:test is DISABLED wxy:test COLUMN FAMILIES DESCRIPTION {NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '2', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} {NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSION => 'NONE', VERSIONS => '5', TTL => '1296000 SECONDS (15 days)', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} 2 row(s) in 0.0680 seconds
hbase(main):003:0> enable 'wxy:test'
0 row(s) in 0.2460 seconds
执行完后发现磁盘并没有一点减少,查资料发现,原因如下:
当一个明确的delete发生时,实际上,数据并没有被删除,只是增加了一个删除标记,在查询时,删除标记阻止记录返回。然后在major compaction的时候,实际的数据才会被删除,删除标记也会从StoreFile删除。如果数据由于TTL被删除,没有删除标记被创建,在压缩时,过期的数据会被过滤,不会被写回到压缩后的StoreFile文件中。
3.执行major compaction
hbase(main):003:0> major_compact 'wxy:test'
执行完后15天前的数据应该被清理了,磁盘空间应该释放了,但实际上毫无变化
查资料发现这儿有个还需要改一个属性MIN_VERSIONS => ‘0’
但是查看了一下表结构,这个属性默认就是0,抱着试试的态度,又改了一次。然后重新major compaction
hbase(main):004:0> alter 'wxy:test', {NAME=>'f1', MIN_VERSIONS => '0'}
执行完后,15天的数据被删除了,磁盘也释放了很多,查了一下,这儿应该是个小bug
注意:修改表结构之前,需要先disable 表,否则表中的记录被清空!HBase不disable直接去alter 表是可以的!
三、粒度(cell ttl)
早期版本控制粒度是column family; 新版本因为Cell可以支持tag了,所以可以在cell级别设置TTL了。(待考证)
( 参见http://hbase.apache.org/book.html#ttl 及https://issues.apache.org/jira/browse/HBASE-10560)
Cell的TTL与Column family的TTL区别:
- Column family的TTL以秒为单位,cell的TTL以毫秒为单位
如果有有cell级别的TTL,则cell的TTL override CF的TTL; 但是不能超出CF级别的TTL
以下引自:[http://hbase.apache.org/book.html#ttl](http://hbase.apache.org/book.html#ttl)
- Cell TTLs are expressed in units of milliseconds instead of seconds.
- A cell TTLs cannot extend the effective lifetime of a cell beyond a ColumnFamily level TTL setting.
以下引自:[https://issues.apache.org/jira/browse/HBASE-10560](https://issues.apache.org/jira/browse/HBASE-10560) <br />We can keep the existing column level definition and enforcement mechanism and extend it to look for a TTL cell tag during compaction. If one is found, it can override the CF setting. TTL overrides can be passed up to the server in an operation attribute.