【问题标题】:Is there a maximum version number in hbase?hbase中是否有最大版本号?
【发布时间】:2011-10-21 17:44:32
【问题描述】:

如果我想在表格中插入:

row | fam:qualifier | timestamp | value
1 | foo:bar | 12345 | 2
1 | foo:bar | 12346 | 3
1 | foo:bar | 12347 | 2
1 | foo:bar | 12348 | 1
.
.
. 
1 | foo:bar | 123410 | 2

我可以在 hbase shell 中指定从特定行获取的最大版本数,但是当我指定例如“100”时,它只返回 4 个版本... 有最大值吗?

【问题讨论】:

    标签: hbase


    【解决方案1】:

    它只返回 4 个版本,因为列族设置为最多存储 4 个版本。

    如果要存储更多版本,则需要更改 CF。使用 hbase shell:

    hbase> alter 'table_foo', {NAME => 'column_fam_foo', VERSIONS => 100}
    

    最大版本的默认值为 1*:

    http://hbase.apache.org/book/schema.versions.html

    *似乎最大版本的默认值在某个时候从 3 更改为 1。

    【讨论】:

      【解决方案2】:

      答案部分正确。不正确:hbase 存储了三个版本。证明见下文。 True: 可以设置 hbase 通过

      返回的最大版本数
      alter 'marketdata', NAME => 'field', VERSIONS => 100   
      

      但现在让我们假设,我没有更改版本变量。

      我的 hbase 中有十个条目,时间戳从 0 到 9。 最新的时间戳是:

      hbase(main):025:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask'}                                 
      COLUMN                             CELL                                                                                   
       field:ask                     timestamp=9,         value=0.9940174211042572                                                  
      1 row(s) in 0.0590 seconds
      
      hbase(main):026:0> 
      

      显示的时间戳 1 到 5 的值是:

      hbase(main):027:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask', TIMERANGE => [0,5], VERSIONS=>5}
      COLUMN                             CELL                                                                                   
       field:ask                     timestamp=4, value=0.530618878519702                                                   
       field:ask                     timestamp=3, value=0.051028316270589014                                                
       field:ask                     timestamp=2,     value=0.11949750640509116                                                 
      3 row(s) in 0.0130 seconds
      
      hbase(main):028:0>
      

      ...当我将结束时间戳设置为 10 时,它仍然只显示该时间戳之前的最后三个版本并抑制前一个版本:

      hbase(main):028:0> get 'marketdata', 'instrument1', {COLUMN => 'field:ask', TIMERANGE => [0,10], VERSIONS=>5}
      COLUMN                             CELL                                                                                   
       field:ask                     timestamp=9,     value=0.9940174211042572                                                  
       field:ask                     timestamp=8,     value=0.6941263513176372                                                  
       field:ask                     timestamp=7,     value=0.1814043435754933                                                  
      3 row(s) in 0.0400 seconds
      
      hbase(main):029:0> 
      

      【讨论】:

      • 等等,如果 hbase 只存储 3 个版本,你怎么能看到版本 4、3、2 和 9、8、7?也许外壳只返回 3,无论出于何种原因,但您似乎已经“证明”有更多版本。由于 hbase 删除版本的方式,真正的答案也更复杂:它不是真的。如果您明确删除数据,它将添加一个墓碑,并且您不会在墓碑之前看到任何数据。所有其他数据都将可用(并且所有数据都将被存储),直到下一次重大压缩将重写存储文件并仅保留正确数量的版本。
      • 嗨,大卫,您根据 codingFoo 编辑的回复投了反对票。
      • 这个答案还是有点误导。您缺少的是压缩问题。当 HBase 存储一个值时,它只是将其附加到文件中。它从不删除数据。为了实现删除,他们附加了一个墓碑,本质上说应该忽略一个值。现在,当压缩出现时,文件将被重写,旧版本或删除的版本都不会被重写到新文件中。因此,有一个时间窗口可以让您看到旧版本,但该时间窗口是有限的,您不应依赖旧版本。
      【解决方案3】:

      版本的概念在列族级别得到严格维护。它是一个可配置的参数。

                  columnFamily.setMaxVersions(required version);
      

      版本越多,从多个 HFile 中读取数据的机会也会增加。

      最好的方法是保持最低版本并将数据封装在一个 blob 中。

      【讨论】:

        猜你喜欢
        • 2012-12-31
        • 1970-01-01
        • 2023-01-07
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-03
        相关资源
        最近更新 更多