列指向データベースCassandraにPythonで接続する
Cassandraをインストールしてから日が開いてしまいましたが・・・分散データベース管理システムCassandraをDebianで動作させる
Thriftのことを調べたおかげで、多少理解できた気がします。
PythonからThriftのライブラリ経由で接続し、データを操作してみます。
起動時にOutOfMemoryError
以前試したときのバージョンは0.4.2でしたが現時点で0.5.0に
バージョンがあがっていました。
せっかくなので、バージョンアップして起動しようとすると・・・
# Listening for transport dt_socket at address: 8888
INFO - Sampling index for /var/lib/cassandra/data/Keyspace1/Standard1-1-Data.db
INFO - Sampling index for /var/lib/cassandra/data/Keyspace1/Standard1-2-Data.db
INFO - Sampling index for /var/lib/cassandra/data/Keyspace1/Standard1-3-Data.db
INFO - Sampling index for /var/lib/cassandra/data/system/LocationInfo-1-Data.db
INFO - Sampling index for /var/lib/cassandra/data/system/LocationInfo-2-Data.db
INFO - Sampling index for /var/lib/cassandra/data/system/LocationInfo-3-Data.db
INFO - Replaying /var/lib/cassandra/commitlog/CommitLog-1258206491405.log, /var/lib/cassandra/commitlog/CommitLog-1264690826144.log, /var/lib/cassandra/commitlog/CommitLog-1264690889578.log
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid19548.hprof ...
Heap dump file created [3132904 bytes in 0.117 secs]
ERROR - Exception encountered during startup.
java.lang.OutOfMemoryError: Java heap space
at org.apache.cassandra.db.CommitLog.recover(CommitLog.java:318)
at org.apache.cassandra.db.RecoveryManager.doRecovery(RecoveryManager.java:65)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:90)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:166)
Exception encountered during startup.
java.lang.OutOfMemoryError: Java heap space
at org.apache.cassandra.db.CommitLog.recover(CommitLog.java:318)
at org.apache.cassandra.db.RecoveryManager.doRecovery(RecoveryManager.java:65)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:90)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:166)
コミットログを復旧しようとしたとき、テスト用の仮想OSで動かしていたので
メモリが不足し、エラーになってしまう模様。
/var/lib/cassandra/commitlog/以下のファイルを消すと、何とか起動してくれました。
※いい解決法じゃないですね・・・
Cassandraの外部接続許可とポート番号
Cassandraの起動ファイルに「8888」というポート番号が記載されていたので、
てっきり8888ポートでサービスが起動しているものと思い、クライアントからの
接続を試していました。
そのとき、サーバーにこんなエラーログが出力され、接続できません。
Debugger failed to attach: handshake failed - received > < - excepted >JDWP-Handshake<
[jira] Resolved: (CASSANDRA-63) Java Client for Cassandra
ここを参考に、
・そもそも接続するポート番号は、9160
・Cassandraの設定ファイルを変更しておく必要がある。
ということがわかりました。
conf/strage-conf.xml
この設定ファイルを開き、
<ThriftAddress>localhost</ThriftAddress>
localhost指定を
<ThriftAddress>0.0.0.0</ThriftAddress>
全てのIPから受け付けるように変更しておきます。
Python用の雛形作成
cassandra/interfaceにcassandra.thriftという定義体があります。
これからPython用の雛形を出力します。
# thrift --gen py cassandra.thrift
出力した雛形を使用して、プログラムを作成しました。
・・・といっても、
http://wiki.apache.org/cassandra/ClientExamples
ここのソースそのままですが。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
sys.path.append('./gen-py')
from thrift import Thrift
from thrift.transport import TTransport
from thrift.transport import TSocket
from thrift.protocol.TBinaryProtocol import TBinaryProtocolAccelerated
from cassandra import Cassandra
from cassandra.ttypes import *
import time, pprint
def main():
socket = TSocket.TSocket("192.168.1.245", 9160)
transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
client = Cassandra.Client(protocol)
pp = pprint.PrettyPrinter(indent = 2)
keyspace = "Keyspace1"
column_path = ColumnPath(column_family="Standard1",column="email")
key = "1"
value = "[email protected]"
timestamp = time.time()
try:
transport.open()
""" Insert the data into Keyspace 1 """
client.insert(keyspace, key, column_path, value, timestamp, ConsistencyLevel.ZERO);
"""" Query for data """
column_parent = ColumnParent(column_family="Standard1")
slice_range = SliceRange(start="", finish="")
predicate = SlicePredicate(slice_range=slice_range)
result = client.get_slice(keyspace, key, column_parent, predicate, ConsistencyLevel.ONE);
pp.pprint(result)
except Thrift.TException, tx:
print 'Thrift: %s' % tx.message
finally:
transport.close()
if __name__ == '__main__':
main()
実行してみると、ちゃんと狙った出力が得られているようです。
c:\>python client.py
[ ColumnOrSuperColumn(column=Column(timestamp=1264935683, name='email', value='s
[email protected]'), super_column=None)]
まとめ
サーバーのインストール
分散データベース管理システムCassandraをDebianで動作させる
WindowsでThrift + Pythonを使用する準備
ThriftをWindowsのPythonで使用する(Pythonエクステンションのビルド)
thriftファイルから雛形の出力と、プログラム
ThriftをPythonで使用する
Cassandraに外部から接続するため、storage-conf.xmlの編集
こんな手順になります。
コメント