hbase:每个单元只有第一个版本

lymgl2op  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(393)

我想知道如何配置hbase来存储每个单元的第一个版本?假设以下表:

row_key          cf1:c1           timestamp
----------------------------------------
1                  x                 t1

放置后 ("1","cf1:c2",t2)ColumnDescriptor.DEFAULT_VERSIONS = 2 上述表格变为:

row_key          cf1:c1           timestamp
----------------------------------------
1                  x                 t1
1                  x                 t2

哪里 t2>t1 .
我的问题是如何改变这种情况,使cell的第一个版本成为唯一可以存储和检索的版本。我的意思是在提供的示例中,唯一的版本是 't1' 一个!因此,我想以一种忽略重复项插入的方式更改hbase。
我知道将htable的版本设置为1并基于 Long.MAX_VALUE - System.currentTimeMillis() 会解决我的问题,但我不知道这是不是最好的解决方案?!将tstamp更改为 Long.MAX_VALUE - System.currentTimeMillis() ? 它有任何性能问题吗?

anauzrmj

anauzrmj1#

我可以想到两种策略:

1. 一个版本+反向时间戳

设置 VERSIONS 表和放置基于 Long.MAX_VALUE - System.currentTimeMillis() 一般情况下可以工作,没有任何重大性能问题。
写入时:
当同一单元的多个版本写入hbase时,在任何时间点,都将写入所有版本(对性能没有任何影响)。压缩后,只有时间戳最高的细胞才能存活。
在这个方案中,时间戳最高的单元是由客户端编写的时间戳值最低的单元 System.currentTimeMillis() . 应该注意的是,这可能不是第一个尝试写入单元的计算机,因为hbase客户端可能不同步。
读取时:
当发现同一单元格的多个版本时,将在那时进行修剪。这可以在任何时候发生,因为您的写入可以在任何时候发生,甚至在压缩之后。这对性能影响很小。

2. 支票支付

要通过原子性获得真正的排序,这意味着只有到达区域服务器的第一次写入才会成功,您可以使用 checkAndPut 操作:
从文档中:

public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put) throws IOException

自动检查行/族/限定符值是否与预期值匹配。如果有,就加上看跌期权。如果传递的值为null,则检查是否缺少列(即:不存在)所以通过设置valuenull你的Put只有当单元格不存在时才会成功。如果卖出成功,则返回值为真。这提供了真正的原子性,但以写性能为代价。 写入时: 设置了行锁和Get在检查存在之前在内部发出。一旦确认不存在,即发行看跌期权。您可以想象,这对每一次写操作都有相当大的性能影响,因为现在每一次写操作还涉及一个读操作和一个锁。 在压缩过程中,不需要发生任何事情,因为只有一次put才能到达hbase。它始终是到达区域服务器的第一个put。 需要注意的是,没有办法批量处理这类产品checkAndPut使用的操作checkAndMutate` ,因为每个put都需要自己的检查。这意味着每个put都需要是一个单独的请求,这意味着您在批量编写时也要支付延迟成本。
读取时:
只有一个版本可以进入hbase,所以这里没有影响。

选择策略:

如果真正的顺序真的很重要,或者您可能需要在写入hbase之后或之前读取每一行(例如,以确定您的写入是否成功),那么最好使用策略2,否则,在所有其他情况下,我建议使用策略1,因为它的写入性能要好得多。在这种情况下,只要确保你的客户是正确的时间同步。

dgenwo3n

dgenwo3n2#

您可以插入 PutLong.MAX_VALUE - timestamp 并将表配置为仅存储1个版本(最大版本=>1)。这样,扫描只返回第一个(最早的)put,因为所有后续put的时间戳值都较小。

相关问题