Symfoware

Symfowareについての考察blog

Debianで動作しているVoldemortをWindows + Javaで操作する

DebianにVoldemortをインストールして、動作を確認しました。
Debianにkey-value storage systemの「Voldemort」をインストールする


今度は、別端末のWindows + Javaで接続し、データの操作を行ってみます。

これが苦難の道のりになろうとは・・・



サンプルプログラム



Voldemortのモジュールの中にサンプルプログラムがあります。
%Voldemort%/example/java/voldemort/examples/ClientExample.java
これを参考にサンプルプログラムを作成しました。

ソースはこんな感じです。

■Sample.java


package com.fc2.blog68.symfoware.voldemort;

import voldemort.client.ClientConfig;
import voldemort.client.SocketStoreClientFactory;
import voldemort.client.StoreClient;
import voldemort.client.StoreClientFactory;

public class Sample {
    public static void main(String[] args) {
        
        String[] bootstrapUrls = new String[]{"tcp://192.168.1.250:6666"};
        
        ClientConfig cc = new ClientConfig();
        cc.setBootstrapUrls(bootstrapUrls);
        
        StoreClientFactory factory = new SocketStoreClientFactory(cc);
        StoreClient<String, String> client = factory.getStoreClient("test");
        
        client.put("key", "日本語だぜ");
        
        System.out.println(client.getValue("key"));

    }
}






実行に必要な最低限のjarファイルは4つ。

以下の3つのjarは、%Voldemort%/libにあります。

google-collect-1.0.jar
jdom-1.1.jar
log4j-1.2.15.jar



以下のjarは、%Voldemort%/dist

voldemort-0.80.1.jar



これらをビルドパスに含めておきます。





エラーその1



実行してみると、こんなエラーが出るかと思います。


Exception in thread "main" java.lang.IllegalArgumentException: java.lang.ClassNotFoundException: voldemort.store.views.UpperCaseView
    at voldemort.utils.ReflectUtils.loadClass(ReflectUtils.java:59)
    at voldemort.xml.StoreDefinitionsMapper.loadTransformation(StoreDefinitionsMapper.java:250)
    at voldemort.xml.StoreDefinitionsMapper.readView(StoreDefinitionsMapper.java:229)
    at voldemort.xml.StoreDefinitionsMapper.readStoreList(StoreDefinitionsMapper.java:125)
    at voldemort.client.AbstractStoreClientFactory.getRawStore(AbstractStoreClientFactory.java:134)
    at voldemort.client.DefaultStoreClient.bootStrap(DefaultStoreClient.java:80)
    at voldemort.client.DefaultStoreClient.<init>(DefaultStoreClient.java:74)
    at voldemort.client.AbstractStoreClientFactory.getStoreClient(AbstractStoreClientFactory.java:124)
    at voldemort.client.AbstractStoreClientFactory.getStoreClient(AbstractStoreClientFactory.java:118)
    at com.fc2.blog68.symfoware.voldemort.Sample.main(Sample.java:16)
Caused by: java.lang.ClassNotFoundException: voldemort.store.views.UpperCaseView
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at voldemort.utils.ReflectUtils.loadClass(ReflectUtils.java:57)
    ... 9 more




同じ内容で困っている人を見つけました。
http://code.google.com/p/project-voldemort/issues/detail?id=231


このエラーの解決方法は2つあります。

1つめの方法は、
voldemort.store.views.UpperCaseView
このクラスは、テスト用のjarファイルに含まれています。

そのため、
%Voldemort%/dist/voldemort-test-0.80.1.jar
このjarファイルをビルドパスに含めればエラーは発生しません。


2つめの方法ですが、このエラーが発生する根本的な原因は
Voldemortの起動時、

# bin/voldemort-server.sh config/single_node_cluster



このように、config/single_node_clusterの設定ファイルを指定して起動しています。




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>
    <view>
        <name>test-view</name>
        <view-of>test</view-of>
        <view-class>
            voldemort.store.views.UpperCaseView
        </view-class>
        <value-serializer>
            <type>string</type>
        </value-serializer>
    </view>
</stores>



まだ機能の詳細は調べていませんが、「view」という機能を使用する箇所で、
クラス名の指定を行っており、これが悪さをしているようです。

そこで、以下のように「view」のタグをごっそり削ってしまえば
エラーは発生しなくなります。


<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>







エラーその2



エラーその1の原因を取り去ると、今度はこんなエラーに遭遇しました。


Exception in thread "main" voldemort.store.InsufficientOperationalNodesException: 1 reads required, but 0 succeeded.
    at voldemort.store.routed.RoutedStore.get(RoutedStore.java:562)
    at voldemort.store.routed.RoutedStore.getVersions(RoutedStore.java:869)
    at voldemort.store.routed.RoutedStore.getVersions(RoutedStore.java:1)
    at voldemort.store.DelegatingStore.getVersions(DelegatingStore.java:85)
    at voldemort.store.serialized.SerializingStore.getVersions(SerializingStore.java:114)
    at voldemort.store.DelegatingStore.getVersions(DelegatingStore.java:85)
    at voldemort.client.DefaultStoreClient.getVersions(DefaultStoreClient.java:134)
    at voldemort.client.DefaultStoreClient.put(DefaultStoreClient.java:180)
    at com.fc2.blog68.symfoware.voldemort.Sample.main(Sample.java:18)
Caused by: voldemort.store.UnreachableStoreException: Failure while checking out socket for localhost:6666(vp1):
    at voldemort.store.socket.SocketPool.checkout(SocketPool.java:92)
    at voldemort.store.socket.SocketStore.getVersions(SocketStore.java:178)
    at voldemort.store.socket.SocketStore.getVersions(SocketStore.java:1)
    at voldemort.store.DelegatingStore.getVersions(DelegatingStore.java:85)
    at voldemort.store.routed.RoutedStore$2.execute(RoutedStore.java:86)
    at voldemort.store.routed.RoutedStore$GetCallable.call(RoutedStore.java:900)
    at voldemort.store.routed.RoutedStore$GetCallable.call(RoutedStore.java:1)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at voldemort.store.socket.SocketResourceFactory.create(SocketResourceFactory.java:84)
    at voldemort.store.socket.SocketResourceFactory.create(SocketResourceFactory.java:1)
    at voldemort.utils.pool.KeyedResourcePool.attemptGrow(KeyedResourcePool.java:153)
    at voldemort.utils.pool.KeyedResourcePool.checkoutOrCreateResource(KeyedResourcePool.java:133)
    at voldemort.utils.pool.KeyedResourcePool.checkout(KeyedResourcePool.java:106)
    at voldemort.store.socket.SocketPool.checkout(SocketPool.java:87)
    ... 11 more





このエラーの原因は、クラスターの設定を行っているファイルにあります。


config/single_node_cluster/config/cluster.xml



上記のファイルを開くと、hostの指定が「localhost」になっているかと思います。


<cluster>
        <name>mycluster</name>
        <server>
                <id>0</id>
                <host>localhost</host>
                <http-port>8081</http-port>
                <socket-port>6666</socket-port>
                <partitions>0, 1</partitions>
        </server>
</cluster>




以下のように、localhostの部分をサーバーのIPアドレスに変更してやります。


<cluster>
        <name>mycluster</name>
        <server>
                <id>0</id>
                <host>192.168.1.250</host>
                <http-port>8081</http-port>
                <socket-port>6666</socket-port>
                <partitions>0, 1</partitions>
        </server>
</cluster>








エラーその3



実行には関係ないのですが、せっかくなのでlog4jのエラーもつぶしておきます。


log4j:WARN No appenders could be found for logger (voldemort.client.DefaultStoreClient).
log4j:WARN Please initialize the log4j system properly.



上記のようなlog4jのエラーが表示されているかと思います。

これを解消するには、
%Voldemort%/dist/resourcesにある「log4j.properties」をコピーし、
classファイルがある階層に保存してやります。

サンプルソースをビルドすると、こんな階層でclassファイルが生成されます。

%classes%/com/fc2/blog68/symfoware/voldemort/Sample.class




%classes%と同じ階層にlog4j.propertiesを保存してやります。


%classes%/log4j.properties



これで、log4jのエラーが表示されなくなると思います。




実行結果



Debian上のVoldemortを起動させておいて、サンプルプログラムを実行すると


[2010-04-18 19:07:10,305 voldemort.client.DefaultStoreClient] INFO bootstrapping metadata.
日本語だぜ



ちゃんとデータの登録と検索が行えました。


・・・長かった。



関連記事

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

  1. 2010/04/21(水) 12:11:15|
  2. Voldemort
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Voldemortのデータにオブジェクトを登録する方法(java-serialization使用) | ホーム | key-value storage system「Voldemort」の特徴>>

コメント

コメントの投稿


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

トラックバック

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