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

Ara*_*ura 7 hbase bigtable ttl google-cloud-platform google-cloud-bigtable

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

我知道 Cassandra 允许在插入时使用 TTL。我想知道 HBase 和 Google Cloud Bigtable 中是否可以实现同样的功能。

INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;
Run Code Online (Sandbox Code Playgroud)

Dou*_*ean 5

Bigtable 中没有对细粒度 TTL 的本机支持。但有两种常见的方法来模拟它们,并进行不同的权衡:

  • 如果您要设置一个新的空表并计划为每次写入设置 TTL ,则可以将列族上的 max_age 设置为非常小的值,例如 1 秒,并显式地将每个新值的写入时间戳设置为您希望它过期。
    • 优点:这种方法使事情变得容易理解,因为时间戳具有明显的语义含义并且不需要修改。
    • 缺点:如果您忘记设置 TTL 并使用默认服务器时间戳,该数据将立即被视为过期,并将在下一次压缩时被删除。
    • 缺点:如果您尝试将其应用于预先存在的表,同样的情况也成立:任何使用真实时间戳的现有数据都将被删除。
    • 缺点:任何给定单元格不可能有多个同时过期的值。
  • 如果您希望默认的 TTL X 可以被覆盖,请像平常一样在列族上设置它。然后,写入可以通过将时间戳设置为 (real_timestamp - X + Y) 将其 TTL 调整为 Y。
    • 优点:这种方法可以安全地应用于预先存在的表。
    • 优点:如果您忘记设置 TTL,也不会出现任何陷阱。
    • 缺点:时间戳根本无法被解释,因为任何给定的单元格可能具有真实的时间戳,或者可能具有模拟的 TTL 覆盖时间戳。
    • 缺点:与上述相关,默认值和被覆盖的 TTL(YX)分开写入的值之间可能会出现意外的时间戳冲突。

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

这两种方法还牺牲了将真实时间戳附加到值的所有有用属性,包括可调试性和简单的版本控制。您可以通过自己将真实时间戳写入单独的列来重新获得其中的一些内容,但总的来说,这意味着当您也只保留最新值时,这些效果最好。


VS_*_*_FF 0

我自己没有使用/测试过以下内容,因为从来不需要,但请看一下以下内容:

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

Put.setTTL(long)
Run Code Online (Sandbox Code Playgroud)

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

ColumnFamilyDescriptorBuilder.setTimeToLive(int)
Run Code Online (Sandbox Code Playgroud)

根据我对具有相同设置的其他 HBase 功能的经验,我想您可以使用表创建时间为给定列族设置某种全局/默认 TTL,但如果需要的,如上图。

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