SymfowareSymfowareSymfowareについての考察blogVoldemortをjmxでリモート監視するCassandraをインストールして動かしたとき、Jconsoleを使用して監視してみました。Cassandraの状態をJconsoleを使用して監視するVoldemortにも同様のことが出来そうなので、調べてみました。設定ファイルの編集デフォルトでは、外部からjmxの機能に接続できませんでした。使用する監視と管理ここを参考に、Voldemortの起動スクリプトを編集します。-Dcom.sun.management.jmxremote"fiこんな記載があると思います。これを、以下のように編集します。※ポート番号は適当です。接続する文字列は、Cassandraのときと同じく、service:jmx:rmi:///jndi/rmi://[サーバーのIP]:8080/jmxrmiでOKです。接続してみると、こんな感じでメモリーやCPUの状況、ロードされているクラスなどが確認できます。コンピュータ編集VoldemortにPythonから登録したThrift形式のデータをJavaで取得するJavaからThriftでシリアライズしたデータをVoldemortに登録。Pythonで登録されたデータを読み込むことに成功しました。VoldemortにJavaから登録したThrift形式のデータをPythonで取得する今度は、PythonからThriftでシリアライズしたデータをVoldemortに登録。Javaで登録されたデータを読み込んでみます。PythonのソースPythonのソースコードはこんな感じになりました。buf.getvalue())実行して、データを登録しておきます。JavaのソースJavaのソースはこんな感じ。metadata.Pythonから登録したデータです日本語1日本語2日本語3狙い通り。コンピュータ編集VoldemortにJavaから登録したThrift形式のデータをPythonで取得するJavaからThriftを使用してオブジェクトをシリアライズ。シリアライズしたデータを登録してみました。Voldemortのデータにオブジェクトを登録する方法(thrift使用)この登録したデータをPythonで取得してみます。データ登録の仕組みJavaからThriftを使用してオブジェクトをシリアライズ。シリアライズしたデータを登録という流れを図にしてみました。このように、Voldemort側では渡されたデータをそのまま登録しており、シリアライズはクライアント側で行われます。そのため、Pythonでデータを読み取るときには、プログラム内でシリアライズされたデータを解いてやればよいことになります。Pythonの雛形準備Javaからデータを登録するときに使用したthriftファイルから、python用の雛形を生成してやります。voldemort.thriftこれで、gen-pyというディレクトリが出来ると思いますので、これから作成するプログラムと同じ階層にコピーしておきます。BuffersのPythonモジュールのインストールと、voldemort.pyvoldemort_client_pb2.pyのコピーを行っておきます。ソースはこんな感じになりました。'utf-8')TTransport.TMemoryBufferにVoldemortで取得したデータをぶち込み、ThriftData().read()でオブジェクトに反映させます。日本語の詳細を設定してみます。その1その2その3上手く読み込めました。Pythonで接続してみようと思います。Voldemortを解凍したフォルダ%Voldemort%/clients/pythonここにサンプルがありましたので、これを参考にプログラムを書いてみます。Buffersを使用しているようです。Buffersのインストールを行います。Buffersダウンロードページhttp://code.google.com/p/protobuf/downloads/listここから、protoc-2.3.0-win32.zipprotobuf-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がインストールできます。Buffersが使用できるようになりました。store.xmlDebianで動いている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.pyvoldemort_client_pb2.pyこの2つのファイルを、これから作成するサンプルプログラムのソースと同じ場所にコピーしておきます。原因不明ですが、voldemort.pyのエラーチェック部分でこんなエラーが発生します。'_has_error'コピーしたvoldemort.pyの206行目付近をコメントして逃げました。resp.error.error_code)"""pass作成したサンプルはこちらになります。1271321195277ちゃんと登録できました。コンピュータ編集Voldemortのデータにオブジェクトを登録する方法(thrift使用)Java標準のシリアライズ機能を使用してオブジェクトを変換。Voldemortのデータとして登録することに成功しました。Voldemortのデータにオブジェクトを登録する方法(java-serialization使用)ドキュメントを見てみると、以下のデータ型が使用可能のようです。Javaで操作するVoldemortのデータにオブジェクトを登録する方法(java-serialization使用)thriftを使用してみます。各種言語に適したソースコードに変換してくれるツールです。以前、Debianにインストールしたときの記事はこちら。Thriftをインストールするなお、Thriftは雛形からjavaのソースに変換するだけなので、Voldemortが動作しているサーバーにインストールする必要はありません。Thriftの定義体とjavaソースの生成サンプルとして、こんな定義体を考えました。list_sample,}titleとdetailsの2つの文字列型とlist_sampleという文字列のリスト型を保持するThriftDataという構造体を定義します。javaのソースを得るには、以下のコマンドを実行します。voldemort.thriftすると、gen-javaというディレクトリが生成されます。こんな感じで、ソースが出来ます。gen-java/com/fc2/blog68/symfoware/voldemort/ThriftData.javaThriftにより生成されたソースです。fields}}このソースを開発環境にコピーしておきます。作成したThriftDataをserializerとして指定します。%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>thrift</type><schema-info>java=com.fc2.blog68.symfoware.voldemort.ThriftData,protocol=binary</schema-info></value-serializer></store></stores>value-serializerのtypeに「thrift」schema-infoに「java=com.fc2.blog68.symfoware.voldemort.ThriftData,protocol=binary」と、作成したクラス名を指定します。Voldemortが指定したcom.fc2.blog68.symfoware.voldemort.ThriftDataのクラスをロードしている必要があるのかな?と思っていましたが、単純にクラス名を管理しているだけのようで、クラスファイルのコピーは不要でした。編集が終わったら、Voldemortを再起動します。開発環境にビルドパスを追加Voldemort側の設定は終わりましたので、今度は開発環境の設定です。serializerにthriftを使用するため、jarファイルをビルドパスに追加します。追加するjarファイルは以下の3つ。libthrift-0.2.0.jarslf4j-api-1.5.6.jarslf4j-log4j12-1.5.6.jarこれらのjarは、Voldemort/libにあるはずです。最終的に、使用するjarファイルは以下の7つになります。voldemort-0.80.1.jargoogle-collect-1.0.jarjdom-1.1.jarlog4j-1.2.15.jarlibthrift-0.2.0.jarslf4j-api-1.5.6.jarslf4j-log4j12-1.5.6.jarサンプルプログラムサンプルを作成し、動かしてみました。"日本語の詳細を設定してみます。日本語の詳細を設定してみます。その1その2その3狙い通りの動作になっています。次のページプロフィールAuthor:symfoblog形式だと探しにくいので、まとめサイト作成中です。