列指向データベース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の編集

こんな手順になります。



関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ