web-dev-qa-db-ja.com

zNodeを作成しようとするときのApache Curatorの未実装エラー

私はDocker化されたzookeeperインスタンスでApache Curatorを使おうとしていますが、どのように接続しようとしても、常に

org.Apache.zookeeper.KeeperException $ UnimplementedException:KeeperErrorCode = Unimplemented for ...

エラー。ドキュメントを理解しようとしましたが、どこにも行きません。 Zookeeper CLIにログインして、ポート番号が正しいことを確認しました。

snerd@powerglove:~$ docker ps CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS   NAMES 31f1093495ba        compose_zookeeper   "/opt/zookeeper/bin/   3 weeks ago         Up About a minute   0.0.0.0:32770->2181/tcp,
0.0.0.0:32769->2888/tcp, 0.0.0.0:32768->3888/tcp   zookeeper

これが私が使用しようとしているコードです:

public class App {
    public static void main( String[] args ) {
        CuratorFramework client = CuratorFrameworkFactory.newClient("0.0.0.0:32770", new RetryUntilElapsed(3000, 1000));
        client.start();

            try {
                client.create().forPath("/larry-smells/foop", "tuna?".getBytes());
            } catch (Exception e) {
                System.out.println(e.toString());
            }

    }
}

Curator入門ページ からわかる限り、これはうまくいくはずです。何が欠けていますか?

edit1これで、飼育係の集団からデータを引き出すことができることがわかりました。

System.out.println(new String(curatorFramework.getData().forPath("/larry-smells"))); 

しかし、作成コマンドはまだ爆発しています。

edit2

エラーのスタックトレース:

org.Apache.zookeeper.KeeperException.create(KeeperException。org.Apache.zookeeper.KeeperException.create(KeeperException.Java:103)で/ larry-smells/foopのorg.Apache.zookeeper.KeeperException $ UnimplementedException:Unimplemented Java:51)org.Apache.zookeeper.ZooKeeper.create(ZooKeeper.Java:1297)at org.Apache.curator.framework.imps.CreateBuilderImpl $ 17.call(CreateBuilderImpl.Java:1040)at org.Apache.curator。 framework.imps.CreateBuilderImpl $ 17.call(CreateBuilderImpl.Java:1023)at org.Apache.curator.connection.StandardConnectionHandlingPolicy.callWithRetry(StandardConnectionHandlingPolicy.Java:67)at org.Apache.curator.RetryLoop.callWithRetry(RetryLoop.Java:99 )org.Apache.curator.framework.imps.CreateBuilderImpl.pathInForeground(CreateBuilderImpl.Java:1020)at org.Apache.curator.framework.imps.CreateBuilderImpl.protectedPathInForeground(CreateBuilderImpl.Java:501)at org.Apache.curator。フレームワーク.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.Java:491)atまたはg.Apache.curator.framework.imps.CreateBuilderImpl $ 4.forPath(CreateBuilderImpl.Java:367)at org.Apache.curator.framework.imps.CreateBuilderImpl $ 4.forPath(CreateBuilderImpl.Java:309)at com.mycompany.app。 App.main(App.Java:35)

19
David Holiday

編集:どうやらこのエラーは、Zookeeperと組み合わせてCuratorの間違った組み合わせを使用している場合に発生する可能性があります。 curator.Apache.org から:

Curator 2.x.x-ZooKeeper 3.4.xとZooKeeper 3.5.xの両方と互換性があります

Curator 3.x.x-ZooKeeper 3.5.xとのみ互換性があり、動的再構成などの新機能のサポートが含まれています。


スタックトレースではなく、エラーコードだけで問題を特定することは困難ですが、アプリケーションをより安定させるために私が提案するいくつかの改善点は次のとおりです。

public class App {
    public static void main( String[] args ) {
        CuratorFramework client = CuratorFrameworkFactory.newClient("0.0.0.0:32770", new RetryUntilElapsed(3000, 1000));
        client.start();

        try {
            //make sure you're connected to zookeeper.
            client.blockUntilConnected();

            //Make sure the parents are created.
            client.create().creatingParentsIfNeeded().forPath("/larry-smells/foop", "tuna?".getBytes());
        } catch (Exception e) {
            System.out.println(e.toString());
            }

    }
}
41
Petter

私も同様の例外に直面しました。互換性のある以下の依存関係を使用し、例外を解決するのに役立ちました。

    <dependency>
        <groupId>org.Apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.6</version>
    </dependency>

    <dependency>
        <groupId>org.Apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.0.1</version>
    </dependency>

    <dependency>
        <groupId>org.Apache.curator</groupId>
        <artifactId>curator-x-discovery</artifactId>
        <version>4.0.1</version>
    </dependency>

私も同じ問題を抱えていました。

ここで説明されているように、inTransaction()を使用しようとしました: http://www.programcreek.com/Java-api-examples/index.php?api=org.Apache.curator.framework.CuratorFramework on運動6と動作するようです。

client.inTransaction ().create().forPath("/larry-smells/foop", "tuna?".getBytes()).and ().commit ();
2
Massimo Da Ros

@Massimo Da Rosソリューションは機能しますが、新しいバージョンのCurator 4.0.0ではinTransactionは非推奨になり、以下のようにtransactionメソッドを使用することをお勧めします。

CuratorOp op = client.transactionOp().create()
            .withMode(CreateMode.PERSISTENT)
            .withACL(Ids.OPEN_ACL_UNSAFE)
            .forPath("/test", "Data".getBytes());
result = client.transaction().forOperations(op).get(0).toString();
0
Yu Jiaao

この問題は非互換性が原因で発生します。

これを修正するには、ここで説明されているようにバージョンを変更する必要があります。
https://curator.Apache.org/zk-compatibility.html

これが機能しない場合は、3.4.x zookeeperバージョンに依存する最新のキュレーターバージョンを探します(現在'2.12.0')。

0