CassandraとHectorを試してみる。(2)

Cassandra(カサンドラ)とHector(ヘクタ)をScalaで試してみておきたい。

(1) create/update/dropコマンド

先日、Cassandraコンソール(cassandra-cli)でget/set/delコマンドを確認したが、create/update/dropのコマンドもみておきたい。keyspaceはRDBのdatabase相当だ。keyspaceに対しては、create, update, dropの操作ができる。updateは、SQLではalternate相当だろうが、おそらく使うことはないだろう。helpでは以下のように記述されている。


create keyspace Add a keyspace to the cluster.
update keyspace Update the settings for a keyspace.
drop keyspace Remove a keyspace and its data.
column familyは、RDBのtable相当だ。column familyに対しては、create, update, drop, truncateの操作ができる。updateは、SQLではalternate相当。truncateはcolumn family内のデータのみ削除するのに対し、dropはデータと定義そのものも削除する。 truncateは、SQLではdelete相当だが、delはcolumnに対する操作とし、truncateを新たにcolumn familyに対する操作としたようだ。

create column family Add a column family to an existing keyspace.
update column family Update the settings for a column family.
drop column family Remove a column family and its data.
truncate Drop the data in a column family.

まず、keyspaceに対する操作を試してみる。cassandra, cassandra-cliをcmdから起動しておく。cassandra-cliでは引数で -hlocalhost -p9160 のようにホストとポートを指定できる。デフォルトのTest Clusterであること。keyspacesも確認しておこう。systemとsystem_tracesというkeyspacesがある。systemには、IndexInfo, NodeIdInfo, hints, schema_keyspacesのColumn Familyがある。system_tracesにはColumn Familyは1つもない。


> cassandra-cli -hlocalhost -p9160
Starting Cassandra Client
Connected to: "Test Cluster" on localhost/9160
Welcome to Cassandra CLI version 2.0.0

[default@unknown] describe cluster;
Cluster Information:
Name: Test Cluster
Snitch: org.apache.cassandra.locator.SimpleSnitch
Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
Schema versions:
59adb24e-f3cd-3e02-97f0-5b395827453f: [127.0.0.1]

[default@unknown] show keyspaces;
Keyspace: system:
Replication Strategy: org.apache.cassandra.locator.LocalStrategy
Durable Writes: true
Column Families:
ColumnFamily: IndexInfo
ColumnFamily: NodeIdInfo
ColumnFamily: hints
ColumnFamily: schema_keyspaces
Keyspace: system_traces:
Replication Strategy: org.apache.cassandra.locator.SimpleStrategy
Durable Writes: true
Column Families:
[default@unknown]

(2) createコマンドの確認

"demo"という名前のkeyspaceを追加して、簡単な操作をチェックしてみたい。


[default@unknown] create keyspace demo;
a66605c1-5ae9-36f7-b1d0-052778aa15e8 // keyspaceが生成できた
[default@unknown] describe demo;
Keyspace: demo:
Replication Strategy: org.apache.cassandra.locator.NetworkTopologyStrategy
Durable Writes: true
Column Families:

[default@unknown] use demo; // useで接続先を変えるとプロンプトも変わる
Authenticated to keyspace: demo

[default@demo] create column family cf1;
6f76b870-0ec3-31ee-ad5f-fa6e7322ac1a // column familyも作成できた

[default@demo] set cf1['row1']['col1'] = 'aaaa';
org.apache.cassandra.serializers.MarshalException: cannot parse 'col1' as hex bytes
// あれ、エラーでsetできない。
[default@demo] set cf1[01][02] = 03;
Value inserted. // デフォルトでは16進数しか扱えない
Elapsed time: 11 msec(s).
[default@demo] set cf1[FF][0001] = FFFF;
Value inserted. // やはり、16進数しかダメ。使えない。
Elapsed time: 9.96 msec(s).
[default@demo]

column familyを安易に生成しても文字列を受け付けてくれないようだ。00からFFの16進表現しか受け付けない。整数もダメたっだ。またcassandra-cliのコンソールは日本語入力もできない。cassandraの面倒なところだ。ネット情報で学習すると、create column familyでは明示的にUTF8Typeを指定する必要があるそうだ。

まず、columnには、標準(Standard)とスーパー(Super)のタイプ(column_type)があり、またソートの際に利用されるcomparatorのタイプには{ AsciiType, BytesType, LexicalUUIDType, LongType, TimeUUIDType, UTF8Type }があるということだ。

標準カラムは、column family[row][col]のようにアクセスするが、スーパーカラムは1階層深くなり、column family[row][super-col][col]のようにアクセスできる。それ以上の階層はない。column_typeが省略されると標準カラムとして扱われる。

comparatorタイプは、デフォルトがBytesTypeのようだ。我々はUTF8Typeが扱えないと困る。だからほぼすべてのcolumn familyには、comparator=UTF8Typeが必要となる。まずcomparatorをAsciiTypeにしてみる。


[default@demo] create column family dummy with comparator=AsciiType;
[default@demo] set dummy['aa']['bb']='cc';
Elapsed time: 154 msec(s).
[default@demo] get dummy['aa'];
=> (name=bb, value=cc, timestamp=1379995227572000)
Returned 1 results.
Elapsed time: 418 msec(s).
文字列で扱えるようになった。今後はAsciiTypeでなく、UTF8Typeを明示しよう。ちなみにLongTypeは、整数ということではなく、BytesTypeで大きなデータを扱えるもののようだ。普段は使わないだろう。先ほどのcolumn familyの「dummy」をdescribeしてみると、Cells sorted byの値に「AsciiType」が見える。しかしまだ、Key Validation Class、Default column value validatorにBytesTypeが残っている。ネット情報によると、default_validation_class=UTF8Type and key_validation_class=UTF8Type を合わせて指定する必要があるとのことだ。

[default@demo] describe dummy;
ColumnFamily: dummy
Key Validation Class: org.apache.cassandra.db.marshal.BytesType
Default column value validator: org.apache.cassandra.db.marshal.BytesType
Cells sorted by: org.apache.cassandra.db.marshal.AsciiType
GC grace seconds: 864000
Compaction min/max thresholds: 4/32
Read repair chance: 0.1
DC Local Read repair chance: 0.0
Populate IO Cache on flush: false
Replicate on write: true
Caching: KEYS_ONLY
Default time to live: 0
Bloom Filter FP chance: default
Index interval: 128
Speculative Retry: NONE
Built indexes: []
Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
Compression Options:
sstable_compression: org.apache.cassandra.io.compress.LZ4Compressor

[default@demo]
[default@demo] create column family dummy2 with comparator=UTF8Type and
default_validation_class=UTF8Type and key_validation_class=UTF8Type;

[default@demo] set dummy2['aa']['bb']='cc';
Value inserted.
Elapsed time: 64 msec(s).

[default@demo] get dummy2['aa'];
=> (name=bb, value=cc, timestamp=1379996125542000)
Returned 1 results.
Elapsed time: 9.2 msec(s).

[default@demo] describe dummy2;
ColumnFamily: dummy2
Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Default column value validator: org.apache.cassandra.db.marshal.UTF8Type
Cells sorted by: org.apache.cassandra.db.marshal.UTF8Type
GC grace seconds: 864000
Compaction min/max thresholds: 4/32
Read repair chance: 0.1
DC Local Read repair chance: 0.0
Populate IO Cache on flush: false
Replicate on write: true
Caching: KEYS_ONLY
Default time to live: 0
Bloom Filter FP chance: default
Index interval: 128
Speculative Retry: NONE
Built indexes: []
Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
Compression Options:
sstable_compression: org.apache.cassandra.io.compress.LZ4Compressor
[default@demo]

毎回create column familyごとに comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type の属性を記述するのは面倒だ。cliが使いづらい。system上でこのデフォルト値を変更できるかもしれないが、まだ知見がない。

(3) update/dropコマンドの確認

後は残ったコマンドを確認しておこう。updateでcolumn familyの定義情報が変更できるようだが、「comparators do not match or are not compatible.」のエラーが出るときがある。AsciiTypeをUTF8Typeに変更することはできるが、その逆はcomparators do not match or are not compatible.」となった。そして、truncateでcolumn familyのデータが削除され、dropで定義も削除される。


[default@demo] update column family dummy with comparator=UTF8Type
// compatibleな属性(column)であれば、updateできる。
[default@demo] truncate dummy;
dummy truncated. // truncateできた

[default@demo] describe dummy;
ColumnFamily: dummy
Key Validation Class: org.apache.cassandra.db.marshal.BytesType
Default column value validator: org.apache.cassandra.db.marshal.BytesType
Cells sorted by: org.apache.cassandra.db.marshal.UTF8Type
...
[default@demo] drop column family dummy;
aff7429f-73f0-33e5-be3f-9d5799155aa1 // dropできた

[default@demo] describe dummy;
Sorry, no Keyspace nor ColumnFamily was found with name: dummy
[default@demo]

同様にkeyspaceについても、dropできることを確認した。keyspaceに対するupdateも用意されてはいるが、どのような属性(column)に対して変更の必要があるのかはっきりせず。使うことはないだろう。

[default@demo] drop keyspace demo;
43bda891-4673-324b-aea6-7f54d4cd1405 // dropできた

[default@unknown] describe demo; // dropした時点でプロンプトがunknownに変わる

Keyspace with name 'demo' wasn't found, to lookup ColumnFamily
with that name, please, authorize to one of the keyspaces first.
[default@unknown]

今日はとりあえず、ここまで。ScalaからHectorを利用してアクセスするまでは後日調査したい。(つづく)