Java から Cassandra を使ってみる その1
前回 Windows 上に Cassandra をセットアップしたので、今回は Java から使用してみました。
準備
Java の場合は、配布されているアーカイブ(apache-cassandra-0.6.1-bin/lib 以下)に接続用のライブラリが付属しています。
まずは Java から Cassandra に接続・使用する準備として、CLASSPATH 上に以下の JAR ファイルを追加する必要があります。
- apache-cassandra-0.6.1.jar
- libthrift-r917130.jar
- log4j-1.2.14.jar
- slf4j-api-1.5.8.jar
- slf4j-log4j12-1.5.8.jar
Eclipse の場合、以下のように、プロジェクトの参照設定に追加します。
使ってみる
準備ができたら下記のようなクラスを作成し、接続と情報の取得を行ってみます。
package example.cassandra; import java.util.Map; import org.apache.cassandra.thrift.Cassandra; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; public class CassandraExample { public static void main(String[] args) { try { // Thrift を使用して Cassandra に接続 TTransport port = new TSocket("localhost", 9160); TProtocol protocol = new TBinaryProtocol(port); Cassandra.Client client = new Cassandra.Client(protocol); port.open(); // クラスタ名の表示 System.out.printf("Cluster name : [%s]\n", client.describe_cluster_name()); // バージョンの表示 System.out.printf("Version : [%s]\n", client.describe_version()); // 接続中クラスタの全キースペースを取得 for (String keyspace : client.describe_keyspaces()) { // キースペース名の表示 System.out.printf("Keyspace : [%s]\n", keyspace); // キースペース内の全 Column Family の取得 for (Map.Entry<String, Map<String, String>> entry : client.describe_keyspace(keyspace).entrySet()) { System.out.printf("\tColumn Family : [%s]\n", entry.getKey()); for (Map.Entry<String, String> innerEntry : entry.getValue().entrySet()) { System.out.printf("\t\t[%s]:[%s]\n", innerEntry.getKey(), innerEntry.getValue()); } } } port.close(); } catch(Exception e){ e.printStackTrace(); } } }
上記を実行すると以下のように接続中の Cassandra の情報が取得できるはずです。
Cluster name : [Test Cluster] Version : [2.1.0] Keyspace : [Keyspace1] Column Family : [Super1] [CompareSubcolumnsWith]:[org.apache.cassandra.db.marshal.BytesType] [CompareWith]:[org.apache.cassandra.db.marshal.BytesType] [Desc]:[Keyspace1.Super1 Column Family Type: Super Columns Sorted By: org.apache.cassandra.db.marshal.BytesType@442c76 ] [Type]:[Super] ・ ・ ・
ちなみに、上記で取得している情報は、前回使用したコマンドラインクライアント上で、「show cluster name」、「show api version」、「show keyspaces」、「describe keyspace
それでは次に、前回 README.txt のサンプルを実行して設定した値を取得してみます。
以下のようなコードで Cassandra に保存した値を取得する事ができます。
package example.cassandra; import java.util.Date; import org.apache.cassandra.thrift.Cassandra; import org.apache.cassandra.thrift.Column; import org.apache.cassandra.thrift.ColumnPath; import org.apache.cassandra.thrift.ConsistencyLevel; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; public class CassandraReadExample { public static void main(String[] args) { try { // Thrift を使用して Cassandra に接続 TTransport port = new TSocket("localhost", 9160); TProtocol protocol = new TBinaryProtocol(port); Cassandra.Client client = new Cassandra.Client(protocol); port.open(); // デフォルトで用意されている Keyspace と Column Family を使用する String keySpace = "Keyspace1"; String columnFamily = "Standard1"; // REAME.txt のサンプルで登録した key と column を取得する String key = "jsmith"; String columnName = "first"; // ColumnPath の作成 ColumnPath columnPath = new ColumnPath(columnFamily); columnPath.setColumn(columnName.getBytes("UTF8")); // 値の取得 Column column = client.get(keySpace, key, columnPath, ConsistencyLevel.ONE).getColumn(); System.out.printf("カラム名:[%s] 値:[%s] タイムスタンプ:[%s]", new String(column.name, "UTF8"), new String(column.value, "UTF8"), new Date(column.timestamp)); port.close(); } catch(Exception e){ e.printStackTrace(); } } }
実行すると以下のように ['jsmith']['first'] に設定した 'John' という値が取れるはずです。
カラム名:[first] 値:[John] タイムスタンプ:[Sat May 01 00:43:44 JST 2010]
以上で Java から Cassandra に接続し、値を取得する所まで出来ました。
次回はデータの登録と削除などを行いたいと思います。
Packt Publishing