我想知道如何配置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()
? 它有任何性能问题吗?
2条答案
按热度按时间anauzrmj1#
我可以想到两种策略:
1. 一个版本+反向时间戳
设置
VERSIONS
表和放置基于Long.MAX_VALUE - System.currentTimeMillis()
一般情况下可以工作,没有任何重大性能问题。写入时:
当同一单元的多个版本写入hbase时,在任何时间点,都将写入所有版本(对性能没有任何影响)。压缩后,只有时间戳最高的细胞才能存活。
在这个方案中,时间戳最高的单元是由客户端编写的时间戳值最低的单元
System.currentTimeMillis()
. 应该注意的是,这可能不是第一个尝试写入单元的计算机,因为hbase客户端可能不同步。读取时:
当发现同一单元格的多个版本时,将在那时进行修剪。这可以在任何时候发生,因为您的写入可以在任何时候发生,甚至在压缩之后。这对性能影响很小。
2. 支票支付
要通过原子性获得真正的排序,这意味着只有到达区域服务器的第一次写入才会成功,您可以使用
checkAndPut
操作:从文档中:
自动检查行/族/限定符值是否与预期值匹配。如果有,就加上看跌期权。如果传递的值为null,则检查是否缺少列(即:不存在)
所以通过设置
value至
null你的
Put只有当单元格不存在时才会成功。如果卖出成功,则返回值为真。这提供了真正的原子性,但以写性能为代价。 写入时: 设置了行锁和
Get在检查存在之前在内部发出。一旦确认不存在,即发行看跌期权。您可以想象,这对每一次写操作都有相当大的性能影响,因为现在每一次写操作还涉及一个读操作和一个锁。 在压缩过程中,不需要发生任何事情,因为只有一次put才能到达hbase。它始终是到达区域服务器的第一个put。 需要注意的是,没有办法批量处理这类产品
checkAndPut使用的操作
checkAndMutate` ,因为每个put都需要自己的检查。这意味着每个put都需要是一个单独的请求,这意味着您在批量编写时也要支付延迟成本。读取时:
只有一个版本可以进入hbase,所以这里没有影响。
选择策略:
如果真正的顺序真的很重要,或者您可能需要在写入hbase之后或之前读取每一行(例如,以确定您的写入是否成功),那么最好使用策略2,否则,在所有其他情况下,我建议使用策略1,因为它的写入性能要好得多。在这种情况下,只要确保你的客户是正确的时间同步。
dgenwo3n2#
您可以插入
Put
与Long.MAX_VALUE - timestamp
并将表配置为仅存储1个版本(最大版本=>1)。这样,扫描只返回第一个(最早的)put,因为所有后续put的时间戳值都较小。