Cassandra, Thriftを利用したAPIを確認する



Cassandraにデータアクセスする為に、Thriftを利用しています。
ただ、自分の物覚えが悪く、データ取得のイメージがしづらい為、何度かAPIを忘れてしまいました。
その為、記憶がすぐ蘇るように図を書いてみました。
(他に良い図の書き方があったら教えてください。)
 

利用しているAPI

CassandraのThrift clientには、いくつかの検索メソッドがあります。説明を読んだり、
コードを実行している分には、なんとなく理解した気になるのですが、どういう塊で
データを取得するんだっけ?という時によくイメージ出来なかったりします。
 
そこで、下記のメソッドを対象に、イメージを書いてみます。(表1. データ検索系のAPI
 
表1. データ検索系のAPI

No メソッド名 説明
1 get 特定キーからカラムまたはスーパーカラム1つを取り出す
2 get_slice スライスされたカラムまたはスーパーカラムの集合を返す
3 multiget 複数キーに対して並列に複数getをこなす
4 multiget_slice 複数キーに対して複数のget_sliceを並列にこなす

イメージを書くにあたって、サンプルデータを下記に示します。

表2. サンプルデータ

Keyspace ColumnFamily Key Column(Row) value
Keyspace1 Standard2 michibatajessica first Jessica
last Michibata
age 25
Keyspace1 Standard2 sasakinozomi first nozomi
last sasaki
age 22

上記のデータを元に、APIのアクセスのイメージを現してみます。
 
図1. 【Cassandraのthrift clientの検索API】イメージ図
 

 

参照API「get」

 
Cassandraからカラムデータを取得する時に、「get」を利用することができます。
org.apache.cassandra.thrift.ColumnPathクラスを利用して、「setColumn」メソッドで
抽出対象カラム名を指定することにより、データを取得することができます。
 

参照API「get_slice」

Cassandraから複数のカラムデータを取得する時に、「get_slice」を利用することが
できます。
抽出対象を指定する方法は、2つあります。

  1. org.apache.cassandra.thrift.SliceRangeクラスを利用して「Start」「End」の範囲指定をする。
  2. 取得したいカラム名をListにつめて指定する。

データの取得のイメージは、青い線になります。
 

参照API「multiget」

「複数キーに対して並列に複数getをこなす」と説明文を書きましたが、緑色の線がイメージになります。
複数のキーを指定するときに、やはりListにつめて指定します。
 

参照API「multiget_slice」

「複数キーに対して複数のget_sliceを並列にこなす」という処理になります。
データ取得のイメージは、肌色になります。
 

まとめ

1つ1つのデータアクセスを確認すると難しくないのですが、格納されているデータに関して
どうやって取得すれば良いんだっけ?と思ったときに混乱しそうだと思いました。

また、範囲指定などをする時に、org.apache.cassandra.thrift.SliceRangeクラスを
利用するのですが、その後、org.apache.cassandra.thrift.SlicePredicateクラスに
条件(SliceRange)をつめなおすので、またイメージしづらかったりします。

SliceRangeクラスのsetStartメソッド、setFinishメソッドに関しては、storage-conf.xml
設定されているCompareWithを元に範囲指定できるみたいです。

細かい利用の仕方やデータの格納に関しては、もう少しいろいろ試してみて
紹介してみたいとおもいます。
 
「SuperColumn」を利用した場合のデータの取得の仕方や、「get_range_slice」「get_range_slices」など
まだ利用したことがないAPIもあります。

本当は、プログラム作成対象のユースケースを元に、いろいろ実装を試せば良かったのですが
そもそもCassandraのDBアクセスにはどんなものがあるのかイメージできなかったので、いろいろ
サンプルプログラムを作ってみました。

もう少しなにができるのか、また、Cassandraのデータモデルを図示するにはどんな書き方が
できるのかいろいろ試してみたいとおもいます。