2011-10-21 22 views
5

私は、テーブルに挿入する場合:hbaseに最大バージョン番号がありますか?

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 

私はFOM特定の行を取得するには、バージョンの最大数をシェルのHBaseに指定することができますが、私は、例えば指定した場合に「100」それは私だけ4を返しますバージョン... 最大値はありますか?

答えて

11

列ファミリが最大4バージョンを格納するように設定されているため、4つのバージョンしか返されません。

さらに多くのバージョンを保存する場合は、CFを変更する必要があります。 HBaseのシェルを使用:最大バージョンの

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

デフォルトは1 *です:

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

は、*最高のバージョンのデフォルト値はいくつかの点で、1〜3から変更されたようです。

2

答えが一部です。そうではありません:hbaseは3つのバージョンを保存します。証明は以下を参照してください。 真:あなたは

alter 'marketdata', NAME => 'field', VERSIONS => 100 

を通じてのHBaseが返すバージョンの最大量を設定することができます。しかし、今のは想定してみましょうのために、私はバージョン変数を変更しませんでした。

私はほとんどの現在のタイムスタンプが0から9 にタイムスタンプを持つ私のHBaseで10件のエントリが、持っている:

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に設定すると、そのタイムスタンプより前の最後の3つのバージョンだけが表示され、前のタイムスタンプは表示されません。

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> 
+1

お待ちください。hbaseが3つのバージョンしか保存していない場合、バージョン4,3,2および9,8,7はどのように表示されますか?おそらく、シェルは何らかの理由で3を返しているに過ぎませんが、より多くのバージョンがあることを「証明」しているようです。本当の答えは、hbaseがバージョンを削除する方法のために、さらに複雑になります。実際はそうではありません。明示的にデータを削除すると、それは墓石を追加し、墓碑の前にデータは表示されません。ストアファイルを書き換え、正しい数のバージョンのみを保持する次の大きな圧縮まで、他のすべてのデータは使用可能になります(そしてすべてのデータは保存されます)。 – David

+0

こんにちはDavidさん、codingFooの編集されたレスポンスに基づいてダウンしました。 – user1052080

+2

この回答はまだ少し誤解を招いています。あなたが欠けているのは、圧縮問題です。 HBaseが値を格納するとき、HBaseはその値をファイルに追加するだけです。データを削除することはありません。削除を実装するには、基本的に値を無視する必要があることを示す墓石を追加します。現在、コンパクションが行われると、ファイルが書き換えられ、古いバージョンも削除されたバージョンも新しいファイルに書き換えられません。したがって、古いバージョンを見ることができる時間ウィンドウがありますが、その時間ウィンドウは限られていて、そこにある古いバージョンに頼るべきではありません。 – David

0

バージョンの概念は、列ファミリレベルで厳密に管理されています。設定可能なパラメータです。

  columnFamily.setMaxVersions(required version); 

複数のHFilesからデータを読み込む機会が増える一方で、より多くのバージョンが存在します。

最小のバージョンを維持し、データを1つの単一BLOBにカプセル化することが最善の方法です。

関連する問題