Symfoware

Symfowareについての考察blog

Debian + VoldemortにWindows + Pythonで接続する

Debianで動かしているVoldemortに、Windows + Pythonで接続してみようと思います。

Voldemortを解凍したフォルダ
%Voldemort%/clients/python
ここにサンプルがありましたので、これを参考にプログラムを書いてみます。



PythonからProtocol Buffersを使用する



Voldemortの通信は、Protocol Buffersを使用しているようです。
まずは、Protocol Buffersのインストールを行います。


Protocol Buffersのページ
Protocol Buffers

ダウンロードページ
http://code.google.com/p/protobuf/downloads/list
ここから、
protoc-2.3.0-win32.zip
protobuf-2.3.0.zip
の二つをダウンロードします。



protoc-2.3.0-win32.zipを解凍すると、protoc.exeが入っていると思います。
protobuf-2.3.0.zipを解凍したフォルダの中に、javaやpythonといったフォルダが
作成されると思います。
同じ階層にsrcというフォルダが出来ますので、この中に先ほどのprotoc.exeを
コピーしておきます。


コマンドプロンプトを開き、protobuf-2.3.0.zipを解凍したフォルダのpythonに移動。
以下のコマンドを実行すると、protobufがインストールできます。


C:\protobuf-2.3.0\python>python setup.py install




これで、PythonでProtocol Buffersが使用できるようになりました。





store.xml



Debianで動いているVoldemortの設定ファイルを書き換えます。

%Voldemort%/config/single_node_cluster/config/stores.xml
このファイルを、以下のように設定しました。



<stores>
    <store>
        <name>test</name>
        <persistence>bdb</persistence>
        <routing>client</routing>
        <replication-factor>1</replication-factor>
        <required-reads>1</required-reads>
        <required-writes>1</required-writes>
        <key-serializer>
            <type>string</type>
        </key-serializer>
        <value-serializer>
            <type>string</type>
        </value-serializer>
    </store>
</stores>



ファイルを変更したら、Voldemortを再起動します。




サンプルプログラム




Voldemortを解凍したフォルダ
%Voldemort%/clients/python
ここにある


voldemort.py
voldemort_client_pb2.py



この2つのファイルを、これから作成するサンプルプログラムの
ソースと同じ場所にコピーしておきます。


原因不明ですが、voldemort.pyのエラーチェック部分でこんな
エラーが発生します。


C:\src\python\voldemort>python test.py
Traceback (most recent call last):
File "test.py", line 12, in <module>
    s = StoreClient('test', [('192.168.1.250', 6666)])
File "C:\src\python\voldemort\voldemort.py", line 100, in __init__
    self.nodes = self._bootstrap_metadata(bootstrap_urls)
File "C:\src\python\voldemort\voldemort.py", line 188, in _bootstrap_metad
ata
    cluster_xmls = self._get_with_connection(connection, 'metadata', 'cluster.xm
l', should_route = False)
File "C:\src\python\voldemort\voldemort.py", line 274, in _get_with_connec
tion
    self._check_error(resp)
File "C:\src\python\voldemort\voldemort.py", line 206, in _check_error
    if resp._has_error:
AttributeError: 'GetResponse' object has no attribute '_has_error'




コピーしたvoldemort.pyの206行目付近をコメントして逃げました。


    ## check if the server response has an error, if so throw an exception
    def _check_error(self, resp):
        #エラーが発生するのでコメントアウト
        """
        if resp._has_error:
            raise VoldemortException(resp.error.error_message, resp.error.error_code)
        """
        pass






作成したサンプルはこちらになります。


■test.py


# -*- coding:utf-8 -*-

import logging
import time
from voldemort import StoreClient

if __name__ == '__main__':
    
    logging.basicConfig(level=logging.INFO,)
    
    #StoreClientを生成
    s = StoreClient('test', [('192.168.1.250', 6666)])
    
    #データの登録
    s.put("key", u"日本語通るかな?".encode("utf-8"))
    
    #登録したデータを検索
    # [(値, versionオブジェクト)]
    #形式で検索結果が帰ってくる
    r = s.get("key")
    
    value = s.get("key")[0][0]
    version = s.get("key")[0][1]
    
    print '[[value]]'
    print unicode(value, "utf-8")
    
    print ''
    print '[[version]]'
    print version






実行してみると・・・


C:\src\python\voldemort>python test.py
[[value]]
日本語通るかな?

[[version]]
entries {
  node_id: 0
  version: 1
}
timestamp: 1271321195277




ちゃんと登録できました。



関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2010/04/24(土) 12:09:30|
  2. Voldemort
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<VoldemortにJavaから登録したThrift形式のデータをPythonで取得する | ホーム | Voldemortのデータにオブジェクトを登録する方法(thrift使用)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/387-2048837a
この記事にトラックバックする(FC2ブログユーザー)