Java/CassandraのHello World!

よ う や く で き た

バージョンが変わる度に書き方が変わるようだ。ネット、特に日本語の情報は大体ver0.6とか0.7とかで古い情報で、最新版だと「コンパイルすら通らない」。
wikiの方も使わせる気無いんじゃないかと思えるくらい判りにくいんで、まるで宝探しの気分だった(苦笑)。

一応最終的に1.1.6(1.1.5)で動かす方法を見つけたので、忘れないうちにメモっておく。

cassandraのインストール

http://cassandra.apache.org/
からバージョン1.1.6をダウンロード。

適当なフォルダに解凍して、%cassandra_home%をインストールフォルダに設定し、(インストールフォルダ)\conf\cassandra.yamlを編集。

/var/lib/cassandra/ → (インストールフォルダ)\
に置換(3カ所)すればOK。編集しなくてもc:\var\lib\cassandraフォルダが作られるのだけど、格好悪いので

で、(インストールフォルダ)\bin\cassandra.batを実行して起動しておく。

続いて、キースペース: Keyspace1、カラムファミリー: Standart1を作成しておく(適当なweb解説記事参照)。

eclipseプロジェクトの作成

mavenで適当にプロジェクトを作成(Hello worldあたり)する。

pom.xmlを次のように書き換える

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>info.gameplus.sample</groupId>
	<artifactId>cassandra-sample</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>cassandra-sample</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<repositories>
		<repository>
			<id>riptano</id>
			<url>http://mvn.riptano.com/content/repositories/public/</url>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.cassandra</groupId>
			<artifactId>cassandra-all</artifactId>
			<version>1.1.5</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.6.0</version>
		</dependency>
	</dependencies>
</project>

cassandra-allのバージョンが1.1.6で動くかどうかは試していない。
maven使わないのなら、直にeclipseプロジェクトにlibフォルダ内容をぶち込んでビルドパスに通せばいいのだろうけど(笑)

>|>mvn eclipse:eclipse

で色々ダウンロードしつつ、eclipse用のプロジェクトを作成する

Javaのソースを作る

eclipse上でプロジェクトをインポートした後、
App.Javaを以下のように変更

package info.gameplus.sample;

import java.util.List;
import java.io.UnsupportedEncodingException;

import java.nio.ByteBuffer;
import java.util.Random;
import org.apache.cassandra.thrift.AuthenticationException;
import org.apache.cassandra.thrift.AuthorizationException;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnOrSuperColumn;
import org.apache.cassandra.thrift.ColumnParent;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.KeyRange;
import org.apache.cassandra.thrift.KeySlice;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.SlicePredicate;
import org.apache.cassandra.thrift.SliceRange;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;

public class App {

        public static void main(String[] args) throws TTransportException, UnsupportedEncodingException, InvalidRequestException, NotFoundException, UnavailableException, TimedOutException, TException, AuthenticationException, AuthorizationException {

                TTransport tr = new TFramedTransport(new TSocket("localhost", 9160));
                TProtocol proto = new TBinaryProtocol(tr);

                Cassandra.Client client = new Cassandra.Client(proto);
                tr.open();
                String keyspace = "Keyspace1";
                client.set_keyspace(keyspace);
                //record id
                String key_user_id = "1";
                String columnFamily = "Standard1";
                // insert data
                long timestamp = System.currentTimeMillis();
                Random r = new Random(timestamp);
                Column nameColumn = new Column(ByteBuffer.wrap("name".getBytes()));
                nameColumn.setValue(Long.toHexString(r.nextLong()).getBytes());
                nameColumn.setTimestamp(timestamp);

                Column ageColumn = new Column(ByteBuffer.wrap("age".getBytes()));
                ageColumn.setValue(Long.toHexString(r.nextLong()).getBytes());
                ageColumn.setTimestamp(timestamp);

                ColumnParent columnParent = new ColumnParent(columnFamily);
                client.insert(ByteBuffer.wrap(key_user_id.getBytes()), columnParent,nameColumn,ConsistencyLevel.ALL) ;
                client.insert(ByteBuffer.wrap(key_user_id.getBytes()), columnParent,ageColumn,ConsistencyLevel.ALL);

                //Gets column by key
                SlicePredicate predicate = new SlicePredicate();
                predicate.setSlice_range(new SliceRange(ByteBuffer.wrap(new byte[0]), ByteBuffer.wrap(new byte[0]), false, 100));
                List<ColumnOrSuperColumn> columnsByKey = client.get_slice(ByteBuffer.wrap(key_user_id.getBytes()), columnParent, predicate, ConsistencyLevel.ALL);
                System.out.println(columnsByKey);

                
                //Get all keys
                KeyRange keyRange = new KeyRange(100);
                keyRange.setStart_key(new byte[0]);
                keyRange.setEnd_key(new byte[0]);
                List<KeySlice> keySlices = client.get_range_slices(columnParent, predicate, keyRange, ConsistencyLevel.ONE);
                System.out.println(keySlices.size());
                System.out.println(keySlices);
                for (KeySlice ks : keySlices) {
                        System.out.println(new String(ks.getKey()));
                }
                tr.close();
        }
}

出典: Cassandra wiki (http://wiki.apache.org/cassandra/ClientExamples [2012/11/01 0:10現在])