Cassandraで登録しているカラムデータの検索方法(Cassandra:inverted indexの翻訳)
以前、Cassandraに郵便番号を登録してみました。列指向データベースCassandraにPython + Thriftで住所データを登録する
登録したからには、郵便番号や住所を指定してデータの検索を
行いたかったのですが、やり方がわからず。。。
いろいろ調べていたら、こんな記事を見つけました。
Cassandra : inverted index
http://www.royans.net/arch/cassandra-inverted-index/
ざっくり翻訳してみると、こんな感じの内容だと思います。
私の知る限り、Cassandraは
・スケーラブル(scalable)
・分散(distributed)
・自己複製(self replicating)
・結果整合性(eventually consistent)
・javaで動作する
・単一障害点を持たない
・スキーマレスのkey-valueストア
という特性を持つ、唯一のNOSQLデータストアです。
Cassandraに存在しない機能の一つに、検索可能なカラム(インデックスカラム)があります。
インデックスカラムが存在しないことでこまることの具体的例を説明します。
まず、5つのカラムを持つ100行のデータがあるとします。
カラムの値が"Service=app2"の行を検索したいとき、すべての行をループして、
目的の1行を見つけなければいけません。
100行のデータストアに"Service=app2"のデータが1行だけだとすると、
目的のデータを見つけるために、大体50行のデータを確認する必要があります。

なぜ、カラムの値を検索する機能が存在しないのかは十分承知しています。
検索機能を提供するには、アプリケーションがデータを挿入するたびに、インデックスを作成しなくてはならず、
性能の低下を招くからです。
ここで、カラムの値を検索するための方法の例を提示します。
それは、検索したいデータをキーにし、値には検索したいデータが登録されている
元のキー情報を登録したインデックスを作成しておくことです。

"Service=app2"のデータの"status"を検索したい場合、まずやらなくてはならないことは、
キーに"Service=app2"という値を持つ行を検索し、行に保存しているキーのリストを取得することです。
次に、取得したキーのリストを使用して、必要な情報が保存されている行のデータを取得します。
値が異なる100行のテーブルの場合にも、2回の検索で必要なカラムを取得することができます。

もちろん、いいことばかりでなく悪い点もあります。
それは、データの登録を行うたびにインデックス用のデータも同時に登録する必要がある点です。
また、データの更新や削除を行った場合にも、インデックス用のデータを更新する必要があります。
最近リリースされたCassandra0.5.0を使用し、4コア・2GBのRAMを搭載したサーバーでベンチマークをとってみると、
1秒あたり約10000行のデータ登録が行えました。
1行平均5つのカラムを持つデータで、1秒あたり1.5Kのデータです。
(これは、インデックス用のデータ更新も含んでいます。)
より高いスループットを得るには、サーバーへの設定が必要です。
FacebookとDiggはそれぞれの手法でCassandraを広く使用しています。
さらにCassandraについて知りたい人の為に、ドキュメントへのリンクを張っておきます。
Digg: Looking to the future of Cassandra
Facebook: Structured storage system on a P2P Network
Jonathan Ellis’ cassandra reading list
An example of how “delicous” schema would look like in cassandra : asenchi
Cassandra : Articles and presentations
Getting started
WTF is a supercolumn
Cassandra internals
なるほど・・・
検索用のデータを別途定義してやればいいわけですね。
今度試してみます。
- 関連記事
-
- Cassandraに登録した住所を郵便番号で検索する
- 分散データベース管理システムCassandraにPython + Lazyboyでデータ登録
- Cassandraで登録しているカラムデータの検索方法(Cassandra:inverted indexの翻訳)
- 列指向データベースCassandraにPython + Thriftで住所データを登録する
- 列指向データベースCassandraにPythonで接続する
コメント