Cassandraのはじめ方─手を動かしてNoSQLを体感しよう

第4回 JavaでCassandraにアクセスする

この記事を読むのに必要な時間:およそ 6.5 分

コミットログとデータディレクトリを設定する

次はコミットログとデータディレクトリの設定を行います。

Cassandraは,書き込み時には操作をすべてコミットログに追加で書き込んでいき,その実体(Memtableといいます)はメモリ上にカラムファミリごとに展開していく仕組みになっています。Memtableはサイズの閾値等をもっており,その閾値に達するとディスクに書き出します。この操作のことを「フラッシュ」といい,ディスクに書き出す構造のことを「SSTable」といいます。SSTableは一度書き出されるとその内容は不変で,実際の物理データとしては以下の3つがセットで書き出されます。

  • インデックス
  • ブルームフィルタ
  • データファイル

インデックスとブルームフィルタは読み込みを高速化するための仕組みです(本連載で今後分量の都合がつけば詳しくご説明します⁠⁠。

このような内部構造をもっているため,Cassandraではコミットログの書き込むディレクトリと実際のデータを各ディレクトリを明確に分離しておくのが望ましいです。

コミットログはCommitLogDirectoryで設定します。一方,SSTableを永続化する実データ部分はDataFileDirectoryで設定します。DataFileDirectoryは複数設定することが可能です。

設定例としては以下のようになります。

<CommitLogDirectory>C:\cassandra\commitlog</CommitLogDirectory>
<DataFileDirectories>
    <DataFileDirectory>C:\cassandra\data</DataFileDirectory>
</DataFileDirectories>

ノードを設定する

最後はノードの設定です。

Cassandraはマスターノードを持たないアーキテクチャのため,特定のノードをマスター指定したりする必要がありません。そのため,ノードの設定は非常に簡潔になっています。

単一ノードで動かしたい場合,Seed設定で以下のようにローカルホストを指定します。非常にシンプルですね。

  <Seeds>
      <Seed>127.0.0.1</Seed>
  </Seeds>

デフォルトの設定では,このようにローカルホストだけをノードとして追加しています。

簡単ですが,以上で必要な設定はすべて終了です。

storage-conf.xmlの全体像はどうなっているか

では,storage-conf.xmlがどのようになっているか見てみましょう。今回は分量の都合で割愛した部分もありますので,その部分は省略しました。

<Storage>
  <ClusterName>Test Cluster</ClusterName>
  ...
  <!-- キースペースの指定 -->
  <Keyspaces>
    <Keyspace Name="Keyspace1">
      <!-- カラムファミリの指定 -->
      <ColumnFamily Name="Standard1" CompareWith="BytesType"/>
      <ColumnFamily Name="Super1" ColumnType="Super" CompareWith="BytesType" CompareSubcolumnsWith="BytesType" />
      <ColumnFamily Name="utf8Order" CompareWith="UTF8Type" />
      <ColumnFamily Name="time_utf8Order" ColumnType="Super" CompareWith="LongType" CompareSubcolumnsWith="UTF8Type"/>

      ...

    </Keyspace>
  </Keyspaces>

  ...

  <!-- コミットログとデータディレクトリ指定 -->
  <CommitLogDirectory>C:\cassandra\cassandra-0.6.1\var\commitlog</CommitLogDirectory>
  <DataFileDirectories>
      <DataFileDirectory>C:\cassandra\cassandra-0.6.1\var\data</DataFileDirectory>
  </DataFileDirectories>


  <!-- ノード設定。開発用なので1ノード。 -->
  <Seeds>
      <Seed>127.0.0.1</Seed>
  </Seeds>

  ...

</Storage>

ここまでで,Cassandraの基本的な設定について説明しました。いますぐにすべてを覚えなくても大丈夫です。今後コードを書いていく中で徐々に覚えていくことができるでしょう。

開発環境を構築しよう

本連載では,開発環境としてEclipseを想定しています。まず開発環境を構築してみましょう。

以下のような手順でEclipse上にJavaプロジェクトを作成しておきます。

  • ①Eclipseを起動してJavaプロジェクトを作成します。
       プロジェクト名は「cassandra-examples」とします(名前はなんでも結構です⁠⁠。
  • ②前回動かしたCassandraのlibディレクトリ(%CASSANDRA_HOME%\lib)からjarをすべてコピーして,cassandra-examples/libに置きます。
  • ③コピーしてきたjarすべてにクラスパスを通しておきます。

Cassandraへアクセスするための基本を知ろう

では,このプロジェクトでサンプルコードを書いてみましょう。CassandraへはThriftでのRPCを介して接続する必要があります。まずは接続のためのインスタンスであるTSocketとTProtocolの実装クラスを生成します。

ソケットを事前に開けておく必要があるので,CassandraにRPCする前にTSocket.open()を呼び出しておいてください。

最後に,CassandraにアクセスするクライアントコードであるCassandra.Clientインスタンスを生成します。その際にTProtocolインスタンスを渡す必要があるので注意してください。

以下は,localhostで9160番ポートで起動しているCassandraに接続しにいく実装コードです。

    TSocket transport = new TSocket("localhost", 9160);
    TProtocol protocol = new TBinaryProtocol(transport);
    try {
        transport.open();
    } catch (TTransportException e) {
        //適宜,適切な例外を投げるなどしてください。
    }
    Cassandra.Client client = new Cassandra.Client(protocol);

これで呼び出し部分は完成です。

次は終了部分です。Thriftのために使ったソケットはフラッシュして中身をクリアした後,クローズします。

    try {
        transport.flush();
    } catch (TTransportException e) {
        //適宜,適切な例外を投げるなどしてください。
    } finally {
        transport.close();
    }

著者プロフィール

大谷晋平(おおたにしんぺい)

オープンソースプログラマ。WebフレームワークT2の開発をしながらHadoop/NoSQLミドルウェアにも手を出す。最近ではもっぱらHadoop,Cassandra,Avro,kumofsなどに興味津々。

blog:http://d.hatena.ne.jp/shot6/

Twitter:http://twitter.com/shot6/