如何在hbase行和bigtable行上设置ttl

rkkpypqq  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(1034)

我试图评估是否有可能在hbase或bigtable中的单个行上设置ttl。
我知道cassandra允许在insert中使用ttl。我想知道在hbase和googlecloudbigtable中是否也可以做到这一点。

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

lnxxn5zx1#

bigtable中没有对细粒度ttl的本机支持。但是有两种常用的方法来模拟它们,有不同的权衡:
如果要设置一个新的空表,并计划在每次写入时都设置一个ttl,则可以将列族的max\u age设置为非常小的值,例如1s,并将每个新值的写入时间戳显式设置为希望其过期的时间。
赞成:这种方法使事情更容易理解,因为时间戳具有明显的语义,不需要咀嚼。
缺点:如果您忘记设置ttl而使用默认的服务器时间戳,那么该数据将立即被视为过期,并在下次压缩时被删除。
缺点:如果您尝试将此应用于一个预先存在的表,同样的情况也适用:任何使用真实时间戳的现有数据都将被删除。
缺点:对于同时过期的任何给定单元格,不可能有多个值。
如果您想要一个默认的ttl为x,然后可以被覆盖,那么在您的列族上设置为normal。然后,写操作可以通过将时间戳设置为(real\u timestamp-x+y)将ttl调整为y。
赞成:这种方法可以安全地应用于已有的表。
赞成者:如果你忘记设置ttl,就不会有陷阱。
缺点:时间戳根本无法解释,因为任何给定的单元格都可能有一个真实的时间戳,或者可能有一个模拟的ttl覆盖时间戳。
con:与上述内容相关的是,在使用默认ttl和重写ttl的值之间可能会出现意外的时间戳冲突,这些值是分开写入(y-x)的。
请记住,bigtable垃圾收集是异步的,因此值不会在ttl之后立即消失。如果不想读取ttl'd值,则需要发送一个适当的时间范围和读取请求。在第一种方法中,这可能比现在晚。在第二种情况下,它可能比(now-x)晚。
这两种方法还牺牲了将真实时间戳附加到值的所有有用属性,包括可调试性和易于版本控制。您可以通过自己将真正的时间戳写入一个单独的列来重新获得一些时间戳,但一般来说,这意味着当您也只保留最新的值时,这些时间戳工作得最好。

c90pui9n

c90pui9n2#

我本人没有使用/测试过以下内容,因为这是不需要的,但请看以下内容:
在单个突变级别(即创建一行)尝试使用:

Put.setTTL(long)

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

ColumnFamilyDescriptorBuilder.setTimeToLive(int)

根据我使用相同设置的其他hbase功能的经验,我可以想象您可以使用表创建时间为给定的列族设置某种全局/默认ttl,但如果需要,可以在单个put级别进行调整,如上图所示。
上面的代码是java的,但是您也可以在hbase shell中手动插入行或创建新表时执行。

相关问题