如何在Hbase行和Bigtable行上设置TTL

7

我想评估HBase或Bigtable是否可以在单个行上设置TTL。

我知道Cassandra允许在插入时使用TTL。 我想知道HBase和Google Cloud Bigtable是否也有相同的功能。

INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;
2个回答

5

Bigtable不支持细粒度TTL的本地支持。但是有两种常见的模拟方法,具有不同的权衡:

  • 如果您正在设置一个新的空表并计划使用每个写入设置TTL,您可以将列族的max_age设置为非常小的值,例如1秒,并明确设置每个新值的写入时间戳为其过期时间。
    • 优点:此方法使事情易于理解,因为时间戳具有明显的语义含义,无需进行任何操作。
    • 缺点:如果您忘记设置TTL并改用默认服务器时间戳,则该数据将立即被视为过期,并在下次压实时删除。
    • 缺点:如果您尝试将其应用于现有表格,则同样适用于任何使用真实时间戳的现有数据。
    • 缺点:不可能对于任何给定单元格具有多个同时到期的值。
  • 如果您希望默认TTL为X,然后可以被覆盖,请像通常一样在列族上设置此值。然后,写入可以通过将其时间戳设置为(real_timestamp - X + Y)来将其TTL调整为Y。
    • 优点:可以安全地将此方法应用于现有表格。
    • 优点:如果您忘记设置TTL,则没有任何陷阱。
    • 缺点:时间戳无法解释,因为任何给定单元格可能具有真实时间戳或模拟TTL覆盖时间戳。
    • 缺点:与上述相关的是,写入(Y-X)之间具有默认和覆盖TTL的值之间可能存在意外的时间戳冲突。

始终记住,Bigtable垃圾回收是异步的,因此值不会在其TTL之后立即消失。如果您不想读取TTL值,则需要在读取请求中发送适当的时间范围。在第一种方法中,这将是晚于现在的任何时间。在第二种方法中,它将是晚于(现在 - X)的任何时间。

这两种方法都牺牲了将真实时间戳附加到值的所有有用属性,包括调试性和易于版本控制。您可以通过自己编写真实时间戳来恢复其中一些,但通常情况下,这意味着仅保留最新值时效果最好。


0

我自己从未使用/测试过以下内容,因为从未需要,但请看以下内容:

在单个变异级别(即创建单个行)上尝试使用:

Put.setTTL(long)

要在给定表的列族级别上应用此操作,请在创建表时尝试以下操作:

ColumnFamilyDescriptorBuilder.setTimeToLive(int)

根据我在使用相同设置的其他HBase功能方面的经验,我想您可以使用表创建时间来设置某种全局/默认TTL以供给定列族使用,但如果需要,在个别Put级别上进行调整,如上所示。

以上是Java代码,但您也可以在插入行或手动创建新表时从HBase shell中执行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接