一、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.查看带清理表结构

  1. hbase(main):001:0> desc 'wxy:test'
  2. Table wxy:test is ENABLED
  3. wxy:test
  4. COLUMN FAMILIES DESCRIPTION
  5. {NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS =
  6. > '2', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', BLOC
  7. KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
  8. {NAME => 'f1', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', COMPRESSIO
  9. N => 'NONE', VERSIONS => '5', TTL => 'FOREVER', MIN_VERSIONS => '0', KEEP_DELETED_CELLS => 'FALSE', BLOC
  10. KSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'}
  11. 2 row(s) in 0.9730 seconds

CF默认的TTL值是FOREVER,也就是永不过期。

2.修改TTL的值,CF的TTL的值以秒为单位

TTL=>的更新超时时间是指:该列最后更新的时间,到超时时间的限制,而不是第一次创建,到超时时间;

  1. hbase(main):003:0> disable 'wxy:test'
  2. 0 row(s) in 1.3500 seconds
  3. hbase(main):004:0> alter 'wxy:test', {NAME=>'f1', TTL => '1296000'}
  4. Updating all regions with the new schema...1/1 regions updated.Done.0 row(s) in 1.1780 seconds
  5. hbase(main):002:0> desc 'wxy:test'
  6. 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
  7. hbase(main):003:0> enable 'wxy:test'
  8. 0 row(s) in 0.2460 seconds

执行完后发现磁盘并没有一点减少,查资料发现,原因如下:
当一个明确的delete发生时,实际上,数据并没有被删除,只是增加了一个删除标记,在查询时,删除标记阻止记录返回。然后在major compaction的时候,实际的数据才会被删除,删除标记也会从StoreFile删除。如果数据由于TTL被删除,没有删除标记被创建,在压缩时,过期的数据会被过滤,不会被写回到压缩后的StoreFile文件中。

3.执行major compaction

  1. hbase(main):003:0> major_compact 'wxy:test'

执行完后15天前的数据应该被清理了,磁盘空间应该释放了,但实际上毫无变化
查资料发现这儿有个还需要改一个属性MIN_VERSIONS => ‘0’
但是查看了一下表结构,这个属性默认就是0,抱着试试的态度,又改了一次。然后重新major compaction

  1. 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#ttlhttps://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

    1. 以下引自:[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.
    1. 以下引自:[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.