【问题标题】:How to set TTL on Hbase Row and Bigtable Row如何在 Hbase Row 和 Bigtable Row 上设置 TTL
【发布时间】:2019-04-03 03:30:17
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    Bigtable 中没有对细粒度 TTL 的原生支持。但是有两种常用的方法来模拟它们,但权衡不同:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      Put.setTTL(long)
      

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

      ColumnFamilyDescriptorBuilder.setTimeToLive(int)
      

      根据我对具有相同设置的其他 HBase 功能的经验,我想您可以使用表创建时间为给定的列族设置某种全局/默认 TTL,然后在个人处进行调整根据需要放置级别,如上所示。

      以上内容使用 Java,但您也可以在 HBase shell 中执行此操作,在手动插入行或创建新表时。

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 1970-01-01
        • 2016-08-29
        • 2023-03-24
        • 2021-07-18
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2020-06-24
        相关资源
        最近更新 更多