Hectorで、JavaからCassandraを操作する。

phpcassaで、PHPからCassandraを操作する。」に続いて、今度はJavaからCassandraを操作してみます。

JavaのCassandraライブラリHector

JavaのCassnadraライブラリもいくつかあるのですが、今回はHectorというライブラリを使ってみます。

スクリーンショット 2014-04-05 13.46.36

Hector – Java Client for Cassandra

これも、ThriftによるCassandraの操作をラップしたライブラリです。

ライブラリのソースコードは、GitHubで、MITライセンスとして公開されています。

hector-client/hector

HectorをMavenでプロジェクトに導入する。

さっそくプロジェクトに導入してみます。

Hectorは、Mavenで簡単に導入することができます。

<dependency>
	<groupId>me.prettyprint</groupId>
	<artifactId>hector-core</artifactId>
	<version>1.0-5</version>
</dependency>

これで終わりです。実際の使い方に移ります。

Hectorで、Cassandraに接続

早速、実際に接続するコードを記述します。

まずClusterオブジェクトを作成し、それからキースペースへの接続をおこないます。今回は、クラスタとして、以前にインストールしたMac OS XのローカルのCassandraの1台を想定しています。

分散データベースApache CassandraをMac OS Xにインストール

Cluster cluster = HFactory.getOrCreateCluster("first_cluster", "localhost:9160");
Keyspace keyspace = HFactory.createKeyspace("first_keyspace", cluster);

これで接続は完了です。

データを追加する。

データを追加してみます。

テータの追加にはMutatorクラスを使用します。MutatorクラスでaddInsertionメソッドを実行してから、executeで更新を反映します。

Mutator<String> mutator = HFactory.createMutator(keyspace, stringSerializer);
mutator.addInsertion("hoge", "first_table", HFactory.createStringColumn("value", "fuga"));
mutator.addInsertion("piyo", "first_table", HFactory.createStringColumn("value", "hage"));
mutator.execute();

PHPの時と違って、オブジェクトのシリアライザを指定する必要があるようです。良く使うので、static変数に保持してしまいます。

private static StringSerializer stringSerializer = StringSerializer.get();

データの追加処理を実行したら、CQLシェルで結果を確認してみます。

cqlsh:first_keyspace> select * from first_table;
 
 name | value
------+-------
 piyo |  hage
 hoge |  fuga
 
(2 rows)

確かに保存されています!

データを削除する。

今度は挿入したデータを削除してみます。

削除の場合もMutatorクラスを利用しますが、メソッドはdeleteメソッドを使用します。

Mutator<String> mutator = HFactory.createMutator(keyspace, stringSerializer);
mutator.delete("hoge", "first_table", "value", stringSerializer);
mutator.execute();

deleteの第一引数が削除対象のプライマリキーです。

cqlsh:first_keyspace> select * from first_table;
 
 name | value
------+-------
 piyo |  hage
 
(1 rows)

hogeキーのデータが削除されました!

データを更新する。

データの更新もしてみます。

Mutator<String> mutator = HFactory.createMutator(keyspace, stringSerializer);
mutator.addInsertion("piyo", "first_table", HFactory.createStringColumn("value", "hogera"));
mutator.execute();

データの更新も挿入と同様にMutatorクラスのaddInsertionメソッドでおこないます。

CassandraはKVSの一種なので、挿入と更新に区別がありません。だから、更新もaddInsertionメソッドでおこないます。CQLは、insertとupdateの両方が用意されていますが、あれはSQLに合わせて用意されているだけで、実体は同じものであるとのことです。

cqlsh:first_keyspace> select * from first_table;
 
 name | value
------+--------
 piyo | hogera
 
(1 rows)

更新ができました!

データを取得する。

取得が最後になってしまいましたが、最後にさきほど更新したpiyoキーのデータを、Hectorから取得してみます。

使用するのは、ColumnQueryクラスです。

ColumnQuery<String, String, String> columnQuery = HFactory.createColumnQuery(keyspace, stringSerializer, stringSerializer,
		stringSerializer);
columnQuery.setColumnFamily("first_table").setKey("piyo").setName("value");
QueryResult<HColumn<String, String>> result = columnQuery.execute();

ColumnQueryオブジェクトはチェーンメソッドでクエリの設定を記述できます。この処理で、カラムキーがpiyoのローの、valueカラムの値を取得します。

取得結果のQueryResutlオブジェクトを出力してみます。

HColumn(value=hogera)

保存されていた値が取得できています!

まとめ

今回は、Hectorを使ってJavaからCassandraを操作してみました。

これで、JavaからもCassandraを利用できるようになりました!

スケーラビリティと可用性の高さで使い道が色々考えられるので、これから実際にどうやって使えるかを考えようと思います。

About katty0324

Scroll To Top