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

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

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

前回はCassandraのデータモデルについて説明しました。今回は実際にデータ設定とJavaコードからCassandraにアクセスする基本を見ていきます。コードはEclipseで書くことを前提に進めていきます。

Cassandraの設定で最低限必要な3つの項目

Cassandraの設定はすべてconf/storage-conf.xmlに記述されます。今回は,まずはじめてみるために必要最小限な項目の設定を行いましょう。

設定が必要なのは以下の項目になります。

  • ① キースペース,カラムファミリの設定
    • ColumnType属性
    • CompareWith属性
    • CompareSubcolumnsWith属性
  • ② コミットログとデータディレクトリを設定する
  • ③ ノードを設定する

キースペース,カラムファミリを設定する

何はともあれ,キースペースとカラムファミリを指定しないとデータを格納すらできません。設定は,たとえば以下のようになります。

<Keyspaces>
 <!-- キースペースは複数定義できる -->
 <!-- キースペースKeyspace1の定義 -->
 <Keyspace Name="Keyspace1">
   <!-- カラムファミリStandard1の定義 -->
   <ColumnFamily Name="Standard1" CompareWith="BytesType"/>

   <!-- カラムファミリSuper1の定義 -->
   <ColumnFamily Name="Super1" ColumnType="Super"
         CompareWith="BytesType" CompareSubcolumnsWith="BytesType" />

Name属性は見たとおりなので割愛します。ColumnFamilyには,Name属性のほかにいくつか知っておかないといけない設定項目があります。

ColumnFamilyで設定すべき属性は,おもに以下の3つです。

ColumnType属性

前回説明したとおり,ColumnFamilyにはカラムだけが含まれるケースと,スーパーカラムだけが含まれるケースの2パターンがあります。どちらのケースかは,このColumnType属性で区別します。

上記の例では,次のように分かれます。

  • "Standard1"という名前のColumnFamily
    →カラムだけが含まれるカラムファミリ
  • "Super1"という名前のColumnFamily
    →ColumnTypeに"Super"と指定があるので,スーパーカラムだけが含まれるカラムファミリ

ColumnType属性はStandardまたはSuperのどちらかを選択できます。ColumnType属性に何も記載がないとStandardになります。

表1 ColumnType属性の種別

ColumnType設定項目説明
Standardカラムファミリ内にカラムが含まれる
Superカラムファミリ内にスーパーカラムが含まれる

CompareWith属性

次に目につく設定がCompareWithです。これは検索時のカラムのソートのための設定項目です。検索実行時にこのCompareWithで指定されたクラスを使ってカラムがソートされ,結果が返されます。

CompareWith設定には,以下の表(CompareWithの設定種別)のようなオプションが標準であります。CompareWith属性に何も指定しないとBytesTypeが適用されます。

表2 CompareWithの設定種別

CompareWith設定項目説明
BytesTypebyte[]で比較する。値の検証はしない。
UTF8TypeUTF8でも文字列比較をする。
AsciiTypebyte[]での比較に加えてUS-ASCIIでのエンコードの検証をする。
LongType64ビット長のlong値で比較する。
LexicalUUIDType128ビット長UUIDのbyte[]値を比較する。
TimeUUIDType128ビット長UUIDのタイムスタンプを比較する。

具体例を見てみましょう。以下の例ではUTF-8でカラムをソートします。

<ColumnFamily Name="utf8Order" CompareWith="UTF8Type" />

イメージとしては以下のようになります。カラム名がUTF-8順にソートされます。

SuperColumn:utf8Order
keyColumn
hogenamevaluetimestamp
1112221273285360339
aaavalue1273285360339
nameshinpei1273285360339
こんにちはさようなら1273285360339

CompareSubcolumnsWith属性

CompareSubcolumnsWith属性は,スーパーカラムの場合(ColumnType="Super")に使用します。それ以外のケースでは使えません。

スーパーカラムの場合,

  • スーパーカラムのソート
    →CompareWith
  • スーパーカラム内のカラムのソート
    →CompareSubcolumnsWith

という形で使い分けます。指定できる項目はCompareWithと同様です。

具体例を見てみましょう。

<ColumnFamily Name="time_utf8Order"
     ColumnType="Super" CompareWith="LongType"
     CompareSubcolumnsWith="UTF8Type"/>

この例ではCompareWithに"LongType",CompareSubcolumnsWithに"UTF8Type"を指定しているので,スーパーカラムはLong値でソートされ,スーパーカラム内のカラムはUTF8でソートされます。

以下のようなイメージになります。

ColumnFamily:time_utf8Order
keySuperColumn
hogekeyColumn
1273284729294namevaluetimestamp
mogeaaa1273284729294
mugabbb1273284729294
1273284729347namevaluetimestamp
mogeccc1273284729347
mugaddd1273284729347

キースペース,カラムファミリの設定は以上です。

他にも,レプリケーション数やレプリケーションをどのように行うかなどの指定がありますが,今回は割愛します。

著者プロフィール

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

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

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

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

コメント

コメントの記入