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

时间:2018-10-30 06:15:58

标签: google-cloud-platform hbase ttl bigtable google-cloud-bigtable

我正在尝试评估是否可以在HBase或Bigtable中的单个行上设置TTL。

我知道Cassandra允许在插入时使用TTL。我想看看在HBase和Google Cloud Bigtable中是否可以做到这一点。

INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;

2 个答案:

答案 0 :(得分:3)

Bigtable中没有对TTL细粒度的本地支持。但是,有两种通用的模拟它们的方法,但需要权衡取舍:

  • 如果您要设置新的空表,并计划通过每次写入来设置TTL,则可以将列族的max_age设置为很小的值,假设为1s,并为每个新值显式设置写入时间戳记为您希望它过期的时间。
    • Pro:这种方法使事情变得易于理解,因为时间戳具有明显的语义含义,不需要任何改动。
    • 缺点:如果您忘记设置TTL而是使用默认的服务器时间戳,则该数据将立即视为过期,并在下一次压缩时将被丢弃。
    • 缺点:如果您尝试将其应用于预先存在的表,则也是如此:使用实时时间戳记的所有现有数据都将被删除。
    • 缺点:任何给定单元格都不可能有多个值同时到期。
  • 如果您希望可以覆盖X的默认TTL,请照常在列系列中进行设置。然后,写入者可以通过将其时间戳记设置为(real_timestamp-X + Y)将其TTL调整为Y。
    • 专业人士:此方法可以安全地应用于预先存在的表。
    • 专业人士:如果您忘记设置TTL,就没有陷阱。
    • 缺点:时间戳记根本无法解释,因为任何给定的单元格都可能具有真实时间戳记,或者可能具有模拟的TTL替代时间戳记。
    • 缺点:与上述情况相关,默认值与重写的TTL(Y-X)分开写入的值之间可能发生意外的时间戳冲突。

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

这两种方法都牺牲了将实时时间戳附加到值上的所有有用属性,包括可调试性和易于版本控制。您可以通过自己将实时时间戳记写到单独的列中来重新获得一些信息,但是总的来说,这意味着当您还仅保留最新值时,它们会发挥最佳作用。

答案 1 :(得分:0)

我本人从未使用过/测试过以下内容,这是从未需要的,但请查看以下内容:

在单个突变级别(即创建单行),请尝试使用:

Put.setTTL(long)

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

ColumnFamilyDescriptorBuilder.setTimeToLive(int)

根据我在相同设置下对其他HBase功能的经验,我可以想象您可以使用表创建时间为给定的列族设置某种全局/默认TTL,然后根据实际情况对其进行调整如上所示,放置水平仪。

以上是Java语言,但是在插入行或手动创建新表时,您也可以从HBase Shell中进行操作。