S-JIS[2010-05-10] 変更履歴

cassandra CLI

cassandra CLI(command line client)は、Apache Cassandraにアクセスする対話型ツール。
(OracleのSQL*Plus、JavaDBのij、HBaseのHBase Shellのようなもの)

非常に単純な機能しか無いので、ちょっとしたデータ確認やちょっとしたデータ更新にしか使えないかも。

cassandra CLIはJavaで書かれている。実行されるクラスはorg.apache.cassandra.cli.CliClient。


cassandra CLIの起動

Windowsからは、CLIのバッチファイルを実行して起動する。

%CASSANDRA_HOME%\bin\cassandra-cli.bat

起動時に接続先のIPアドレス・ポート番号を指定する事も出来る。(起動後にconnectが不要になる)

%CASSANDRA_HOME%\bin\cassandra-cli.bat --host localhost --port 9160

cassandra CLIのコマンド

CLIからhelpコマンド(あるいは「?」)を打ち込むとcassandra CLIのコマンド一覧が表示される。

cassandra> help
cassandra> ?

helpとexit・connect以外のコマンドは、Cassandraに接続していないと使えない。

分類 コマンド名 引数 概要 RDBのSQL相当
CLI exit
quit
  cassandra CLIを終了する。  
サーバー connect ホスト名/ポート Cassandraに接続する。  
show config file   サーバーのstorage-conf.xmlの内容を表示する。  
show api version   サーバーAPIのバージョンを表示する。  
show cluster name   クラスター名を表示する。  
show keyspaces   クラスター内のキースペース一覧を表示する。  
describe keyspace キースペース名 キースペースの定義を表示する。  
データアクセス get テーブル.キー.カラム名 テーブルのデータを表示する。 select
set テーブル.キー.カラム名 = 値 テーブルにデータを入れる。 insert
update
del テーブル.キー.カラム名 テーブルのデータを削除する。 delete
count テーブル.キー レコードに入っているカラム数を表示する。  

CLIには(というかCassandraのクライアント側から)キースペースカラムファミリーを作成したり追加・削除したりする機能は無い。
変更したい場合はstorage-conf.xmlKeyspaceを修正し、Cassandraを再起動する必要がある。


connect

Cassandraに接続するコマンド。

cassandra> connect localhost/9160
Connected to: "Test Cluster" on localhost/9160

接続に成功すると、クラスター名が表示される。


show cluster name

接続中のクラスター名を表示するコマンド。
→Thrift APIのdescribe_cluster_name()

cassandra> show cluster name
Test Cluster

show keyspaces

クラスター内のキースペースの一覧を表示するコマンド。
→Thrift APIのdescribe_keyspaces()

cassandra> show keyspaces
Keyspace1
system

describe keyspace

キースペースの定義(カラムファミリーの一覧)を表示するコマンド。
→Thrift APIのdescribe_keyspace()

cassandra> describe keyspace Keyspace1
Keyspace1.Super1
Column Family Type: Super
Columns Sorted By: org.apache.cassandra.db.marshal.BytesType@11adeb7

Column Family Type: Super
Column Sorted By: org.apache.cassandra.db.marshal.BytesType
flush period: null minutes
------
Keyspace1.Standard2
Column Family Type: Standard
Columns Sorted By: org.apache.cassandra.db.marshal.UTF8Type@113e8f3

Column Family Type: Standard
Column Sorted By: org.apache.cassandra.db.marshal.UTF8Type
flush period: null minutes
------
Keyspace1.Super2
Column Family Type: Super
Columns Sorted By: org.apache.cassandra.db.marshal.UTF8Type@22e177

Column Family Type: Super
Column Sorted By: org.apache.cassandra.db.marshal.UTF8Type
flush period: null minutes
------
Keyspace1.Standard1
Column Family Type: Standard
Columns Sorted By: org.apache.cassandra.db.marshal.BytesType@6765

Column Family Type: Standard
Column Sorted By: org.apache.cassandra.db.marshal.BytesType
flush period: null minutes
------
Keyspace1.StandardByUUID1
Column Family Type: Standard
Columns Sorted By: org.apache.cassandra.db.marshal.TimeUUIDType@842e74

Column Family Type: Standard
Column Sorted By: org.apache.cassandra.db.marshal.TimeUUIDType
flush period: null minutes
------

存在しないキースペースを指定すると例外が発生する。
(この場合、Cassandraのサーバー側のコンソールにも例外のスタックトレースが表示される)

cassandra> describe keyspace Keyspace2
Exception Internal error processing describe_keyspace

describeの直後のキーワード「keyspace」を省略すると、エラーメッセージは出るが、一覧自体は表示される。
(Cassandra0.6より未来のバージョンで別のキーワードが追加されるのを見越しているのかも)

cassandra> describe Keyspace1
line 1:9 missing K_TABLE at 'Keyspace1'

get

テーブル(カラムファミリーカラム)からデータを取得して表示するコマンド。
→Thrift APIのget()

キーのみ指定
cassandra> get Keyspace1.Standard2['jsmith']
=> (column=last, value=Smith, timestamp=1273401786421000)
=> (column=first, value=John, timestamp=1273401776968000)
=> (column=age, value=42, timestamp=1273401792781000)
Returned 3 results.
キースペース名.カラムファミリー名.[キー値]
という形式で指定すると、
レコードにセットされている全データが表示される。
cassandra> get Keyspace1.Super1['jsmith']
=> (super_column=6e616d65,
     (column=6669727374, value=John, timestamp=1273401380984000)
     (column=6c617374, value=Smith, timestamp=1273401712765000))
=> (super_column=61747472,
     (column=616765, value=42, timestamp=1273401719343000))
Returned 2 results.
スーパーカラムの場合、スーパーカラム名やカラム名は
文字コード(十六進数)で表示される。
(UTF-8のバイト配列になって登録されている為)
カラムを指定
(通常のカラム)
cassandra> get Keyspace1.Standard2['jsmith']['age']
=> (column=age, value=42, timestamp=1273401792781000)
スーパーカラムの無いカラムファミリーの場合
キースペース名.カラムファミリー名.[キー値][カラム名]
という形式で指定すると、
そのカラムのデータが表示される。
カラムを指定
(スーパーカラム)
cassandra> get Keyspace1.Super1['jsmith']['attr']['age']
=> (column=616765, value=42, timestamp=1273401719343000)
スーパーカラムが指定されているカラムファミリーの場合
キースペース名.カラムファミリー名.[キー値][スーパーカラム名][カラム名]
という形式で指定すると、
そのカラムのデータが表示される。
スーパーカラムを指定
cassandra> get Keyspace1.Super1['jsmith']['name']
=> (column=6c617374, value=Smith, timestamp=1273401712765000)
=> (column=6669727374, value=John, timestamp=1273401380984000)
Returned 2 results.
スーパーカラムが指定されているカラムファミリーの場合
キースペース名.カラムファミリー名.[キー値][スーパーカラム名]
という形式で指定すると、
そのスーパーカラム内の全データが表示される。

存在しないカラムを指定すると、例外が発生する。

cassandra> get Keyspace1.Standard2['jsmith']['age2']
Exception null

キーを指定せずに全データを(あるいは全キーを)表示する方法は無さげ。


set

テーブル(カラムファミリーカラム)にデータをセットするコマンド。
→Thrift APIのinsert()

カラムを指定
(通常のカラム)
cassandra> set Keyspace1.Standard2['jsmith']['first'] = 'John'
Value inserted.
cassandra> set Keyspace1.Standard2['jsmith']['last'] = 'Smith'
Value inserted.
cassandra> set Keyspace1.Standard2['jsmith']['age'] = '42'
Value inserted.
スーパーカラムの無いカラムファミリーの場合
キースペース名.カラムファミリー名.[キー値][カラム名]
という形式で指定すると、そのカラムにデータがセットされる。
カラムを指定
(スーパーカラム)
cassandra> set Keyspace1.Super1['jsmith']['name']['first'] = 'John'
Value inserted.
cassandra> set Keyspace1.Super1['jsmith']['name']['last'] = 'Smith'
Value inserted.
cassandra> set Keyspace1.Super1['jsmith']['attr']['age'] = '42'
Value inserted.
スーパーカラムが指定されているカラムファミリーの場合
キースペース名.カラムファミリー名.[キー値][スーパーカラム名][カラム名]
という形式で指定すると、そのカラムにデータがセットされる。

CLIのsetコマンドによって値を登録した場合、タイムスタンプにはマイクロ秒(10-6秒)単位でその時点の日時が記録される。
ただしJavaの「System.currentTimeMillis() * 1000」によって設定されるので、ミリ秒(10-3秒)未満の部分は常に0になる。

マイクロ秒になっているのは、他の言語との互換性の為らしい。
データモデルの説明では「アプリ内で統一が取れていれば何でもいい」と書かれているが、CLIがマイクロ秒単位でセットするので、他のアプリでもマイクロ秒で扱っておく方が無難だろう。


del

テーブル(カラムファミリーカラム)からデータを削除するコマンド。
→Thrift APIのremove()

キーのみ指定
cassandra> del Keyspace1.Standard2['jsmith']
row removed.
キーだけを指定した場合、そのレコードが削除される。
カラムを指定
(通常のカラム)
cassandra> del Keyspace1.Standard2['jsmith']['age']
column removed.
カラムを指定すると、そのカラムのデータのみがクリアされる。
カラムを指定
(スーパーカラム)
cassandra> del Keyspace1.Super1['jsmith']['attr']['age']
column removed.

削除は何回行ってもエラーにならない。
(あるいは存在しないキー・カラムを削除してもエラーにならない)


count

レコードに入っているデータ(カラム)の個数を表示するコマンド。
(RDBの集約関数countと異なり、テーブル内のレコード数を返すものではない)
→Thrift APIのget_count()

キーのみ指定
cassandra> count Keyspace1.Standard2['jsmith']
3 columns
cassandra> count Keyspace1.Super1['jsmith']
2 columns
キーだけを指定した場合、そのレコード内のカラム数が表示される。
スーパーカラムを指定しているカラムファミリーの場合、
スーパーカラムの個数が表示される。
スーパーカラムを指定
cassandra> count Keyspace1.Super1['jsmith']['name']
2 columns
スーパーカラムが指定されているカラムファミリーの場合
キースペース名.カラムファミリー名.[キー値][スーパーカラム名]
という形式で指定すると、そのスーパーカラム内のカラム数が表示される。

カラムまで指定することも出来るが、(カラムが存在していても無くても)常に1が返るだけなので、あまり意味が無い(苦笑)


Cassandraへ戻る / Java目次へ行く / 技術メモへ戻る
メールの送信先:ひしだま