HBaseで同一カラムに同一タイムスタンプのデータを登録した場合の挙動

HBaseで同一カラムに同一タイムスタンプのデータをputすると別バージョンとして扱われるようなので、アプリケーションではタイムスタンプをキーに含めない方が良さそう。
9
Takuya UESHIN @ueshin

#HBase の動きがよくわからなくなってきた。。。同じカラムで同じタイムスタンプでも違うバージョンになるの?

2010-08-24 05:19:55
Takuya UESHIN @ueshin

RubyのShellからダブって見えるだけなのかな。集計値は大丈夫そう。 QT @ueshin: #HBase の動きがよくわからなくなってきた。。。同じカラムで同じタイムスタンプでも違うバージョンになるの?

2010-08-24 05:39:22
M.Mouri @m_mouri

@ueshin 詳しくはしらないけど、なるかも知れない。#HBaseでは追記しかしなくて、読み出しのときにソートして最新のタイムスタンプのカラムを取り出してたような。

2010-08-24 05:39:56
ひしだま @hishidama

@ueshin #hbase shellから同じカラムに同タイムスタンプで入れて、Javaのgetで全部取り出せるので、別バージョンとして扱われているみたいですね

2010-08-24 05:51:20
Takuya UESHIN @ueshin

なんと。 QT @hishidama: @ueshin #hbase shellから同じカラムに同タイムスタンプで入れて、Javaのgetで全部取り出せるので、別バージョンとして扱われているみたいですね

2010-08-24 06:00:42
ひしだま @hishidama

@ueshin えーと、GetにsetMaxVersions()を指定すると全バージョン取れます。デフォルトのGetでは同じタイムスタンプの中でも最後に書き込んだものが取れています。が、これが保証されているのかどうかは分かりません…

2010-08-24 06:09:27
Takuya UESHIN @ueshin

@hishidama デフォルトのGetでは、というのはsetMaxVersions()を指定しなかった場合ということですか?

2010-08-24 06:18:39
ひしだま @hishidama

@ueshin そうです。(最新の)1バージョンだけ取れる状態です。

2010-08-24 06:22:56
Takuya UESHIN @ueshin

@hishidama なるほど、setMaxVersions()を指定しなかったら、最新の1個が取得できて、指定したら同じタイムスタンプのものも複数取得できる感じですか。

2010-08-24 06:24:53
ひしだま @hishidama

@ueshin そういう感じですね。たぶんHBaseのDB内では全バージョン持っていて、Getに指定されたバージョン数だけクライアント側に返しているだけだと思います。

2010-08-24 06:27:12
Takuya UESHIN @ueshin

@hishidama ありがとうございます。バージョン=タイムスタンプで厳密に指定できると思い込んでいたので、ちょっとこちらの設計を変える必要がありそうですね。。。もう少し動作確認してみます。

2010-08-24 06:40:08
Takuya UESHIN @ueshin

どっちみち集計が重くてやり直しだったので頭を切り替える。というわけで今日はここまでにしよう。お休みの日とはいえ、明日(今日)は起きられるのか?

2010-08-24 06:44:34
ひしだま @hishidama

@ueshin Getでタイムスタンプを指定すれば、その中の最新データを取れそうな感じはします。ただ、列ファミリー毎に最大バージョン数が決まっているので、同じタイムスタンプが別バージョンになると、バージョン数の設計で考慮する必要がありそうですね。勉強になりました。

2010-08-24 06:50:53
Tatsuya Kawano @tatsuya6502

@ueshin @hishidama もしタイムスタンプをキーとして使いたいなら、rowIdのお尻に付けるのがおすすめです。そのときに、Long.MAX_VALUEから引いた値をつかうと、scanの際に最新から古いものへ順にreadできます。象本にサンプルが載ってます。

2010-08-24 11:48:23
ひしだま @hishidama

.@tatsuya6502 タイムスタンプを #hbase のキーに入れる象本のサンプルって、p.384ですね。やはりこれが定石になるんですかね。

2010-08-24 22:04:06
ひしだま @hishidama

どこかの導入事例で#HBase の採用理由のひとつに「バージョン管理が出来る」というのが入っていたような気がします。なのでタイムスタンプを使った履歴データもアプリケーションで使っていいかなーと思ったんですが。

2010-08-24 22:09:21
ひしだま @hishidama

でも、同じカラムを同一タイムスタンプで上書く場合はバージョンが別になるようなので、履歴を使いたい場合は、同一タイムスタンプでデータ更新はすべきではない、と認識しました。#hbase

2010-08-24 22:14:58
Tatsuya Kawano @tatsuya6502

@hishidama 実は Safari Books Online で英語版を購読しているだけなので訳本のページ番号はわからないのですが、はい、 RowKeyConverter#makeObservationRowKey() です。

2010-08-25 08:14:41
Takuya UESHIN @ueshin

先日の #HBase のバージョン(タイムスタンプ)問題、再現しない。。。同じタイムスタンプのものを Put すると上書きされるようだ。

2010-08-25 20:39:13
Takuya UESHIN @ueshin

でも確かに同じタイムスタンプのデータが存在する。。。なんじゃこりゃ。 #HBase

2010-08-25 20:46:26
Takuya UESHIN @ueshin

出るなら出る、出ないなら出ない、ハッキリしろー。

2010-08-25 20:52:44
Takuya UESHIN @ueshin

それっぽい議論発見。 まずは去年のやつ。 https://issues.apache.org/jira/browse/HBASE-997 によると同じタイムスタンプを指定した両データの Put の間にflushが入ると、2つのデータができちゃう?

2010-08-25 21:38:09
Takuya UESHIN @ueshin

それっぽい議論発見。 まずは去年のやつ。 http://bit.ly/diciuw によると同じタイムスタンプを指定した両データの Put の間にflushが入ると、2つのデータができちゃう? #HBase (タグ付け忘れた。

2010-08-25 21:39:35
Takuya UESHIN @ueshin

これも去年のか。 https://issues.apache.org/jira/browse/HBASE-1485 によると重複したバージョンを返しますよと。同じバージョンだった時に返す順番をどうします?と? #HBase

2010-08-25 21:41:50