読者です 読者をやめる 読者になる 読者になる

trunk版のCassandraと戯れる

Cassandra Python

trunk版のCassandra(Cassandra 0.7)で遊んでみた。

  • 設定ファイルがYAMLに変わるのは誰得?って印象があったが案外違和感がない。普段LAMP系のソフトウェアを扱っている人間にはYAMLの方が自然に感じる。
  • 動的にKeyspaceやColumnFamilyを追加できる機能はgood。
  • APIが変わりすぎてないか…

Vector clockサポートが入るといった大きな変更があるから仕方がないのかもしれないし、APIのInterfaceは0.6系のものより洗練されていると感じたが、Pythonで言うとlazyboyとかpycassaいったCassandraラッパーライブラリは全く動かなくなるのではないか。

まだbetaすら出ていない段階だから何とも言えないが、これがCassandra Projectの流儀だとすると、いろいろ慎重にならざるをえない。

KeyspaceやColumn Familyの動的追加のテストに書いてみたコード。

# -*- coding: utf-8 -*-
import time

from thrift.transport import TTransport
from thrift.transport import TSocket
from thrift.protocol import TBinaryProtocol

from cassandra import Cassandra
from cassandra.ttypes import (
    Column,
    ColumnParent,
    ColumnPath,
    ConsistencyLevel,
    NotFoundException,
    Clock,
    KsDef,
    CfDef,
    )

KEY_SPACE = 'MyKeyspace'

# Cassanraに接続
socket    = TSocket.TSocket('127.0.0.1', 9160)
transport = TTransport.TBufferedTransport(socket)
protocol  = TBinaryProtocol.TBinaryProtocolAccelerated(transport)

client = Cassandra.Client(protocol)
transport.open()

# Keyspaceを追加する
ks_def = KsDef(KEY_SPACE, 'org.apache.cassandra.locator.RackUnawareStrategy', 1, cf_defs=[])
client.system_add_keyspace(ks_def)

# 使用するKeyspaceを設定
client.set_keyspace(KEY_SPACE)

# Column Familyを追加
client.system_add_column_family(CfDef(KEY_SPACE, 'Dog'))

# Column Family "Dog" の Column "nickname" に書き込み
column_parent = ColumnParent('Dog')
column = Column('nickname', 'perezvon', Clock(int(time.time() * 1e6)))
client.insert(key='dog-1', column_parent=column_parent, column=column, consistency_level=ConsistencyLevel.ONE)

# Column Family "Dog" の Column "nickname" を取得
column_path = ColumnPath('Dog', column='nickname')
result = client.get('dog-1', column_path=column_path, consistency_level=ConsistencyLevel.ONE)
print result