akishin999の日記

調べた事などを書いて行きます。

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 に接続し、値を取得する所まで出来ました。
次回はデータの登録と削除などを行いたいと思います。