ということで,HBaseについて.
最近,Hadoop 内でも特に活発に開発されているHBaseについてです.これは,Google Bigtable の再実装ですね.HBase Architecture を読んでみたまとめを書いておきます.
Data Modelとして,基本的なデータの表現方法が記されています.まず,HBaseは,概念的にはデータベースで言うところの表形式のようなものを持っています.カラムは,<family>:<label>であらわされます.それぞれのレコードに当たるものは,<Row Key>で一意に決定されます.さて,<family>は,SQL のCREATE TABLEみたいなものを発行して決定されますが,はその時々で自由につけることができます.
上記URLのConceptual Viewにある表は,あるレコードに対してデータが概念的にどのように配置されるかを示しています.
概念的にと言ったのは,実際の物理的な格納のされ方とは別だからです.で,あるレコードを特定するRow Key="com.cnn.www"に対して,基本的なカラムである(これは多分ユーザからは制御できない)TimeStampがあります.つまり,あるレコードは,TimeStampというバージョンを持っているんですね.複数のTimeStampがあった場合,特にTimeStampを指定せずに,"com.cnn.www"レコードを引っ張ってくると,それぞれのカラムの最新の値をとってくるわけです
つまり,(contents:, anchor:, mime )=(t6の値, t9 の値, t6の値)が取得できるんですね.つまり,追記型のバージョン付きデータベースという感じなんだと思います.
そんで,物理的な格納方式は,C-storeのようなカラムベースで格納します.そうすることで,スパースなレコードに対して領域を取る必要がありません.その辺のことが,Physical Storage Viewにある表に書いてあります.
で,実際にどんな感じに格納されるかの話,レコードのキーがrow[0-3]の場合.
row=row0, column=anchor:bar, timestamp=1174184619081
row=row0, column=anchor:foo, timestamp=1174184620720
row=row0, column=anchor:foo, timestamp=1174184617161
row=row1, column=anchor:bar, timestamp=1174184619081
row=row1, column=anchor:foo, timestamp=1174184620721
row=row1, column=anchor:foo, timestamp=1174184617167
row=row2, column=anchor:bar, timestamp=1174184619081
row=row2, column=anchor:foo, timestamp=1174184620724
row=row2, column=anchor:foo, timestamp=1174184617167
row=row3, column=anchor:bar, timestamp=1174184619081
row=row3, column=anchor:foo, timestamp=1174184620724
row=row3, column=anchor:foo, timestamp=1174184617168
って感じ.anchor:fooは複数追記されているけど,それは,timestampが違うからですね.何も指定せずにanchorをrow1でゲットすれば,4行目に相当するデータが帰ってくるわけですね.ちょっと工夫すれば,高速に検索できそうです.