web-dev-qa-db-fra.com

Apache Curator Erreurs non implémentées lors de la tentative de création de zNodes

J'essaie d'utiliser Apache Curator avec une instance dockerized zookeeper et quelle que soit la façon dont j'essaie de me connecter, je finis toujours avec un 

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

erreur. J'ai essayé de comprendre la documentation, mais je ne vais nulle part. Je me suis connecté à la CLI de zookeeper et je me suis assuré que le numéro de port est correct: 

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

voici le code que j'essaie d'utiliser: 

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());
            }

    }
}

Autant que je sache, sur la page de démarrage du Curator , cela devrait fonctionner. Qu'est-ce que je rate? 

edit1 vient de comprendre que je suis capable d'extraire des données de l'ensemble du gardien de zoo de la manière suivante:

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

mais la commande create continue à exploser.

edit2  

stacktrace de l'erreur: 

org.Apache.zookeeper.KeeperException $ UnimplementedException: KeeperErrorCode = Unimplemented pour/larry-odells/foop à org.Apache.zookeeper.KeeperException.create (KeeperException.Java:103]. .] à org.Apache.zookeeper.KeeperException.create (KeeperException.Java:51) à org.Apache.zookeeper.ZooKeeper.create (ZooKeeper.Java:1297) à org.Apache.curator.framework.imps.CreateBuilderImpl $ 17.call (CreateBuilderImpl.Java:1040) à org.Apache.curator.framework.imps.CreateBuilderImpl $ 17.call (CreateBuilderImpl .Java: 1023) À Org.Apache.curator.connection.StandardConnectionHandlingPolicy.callWithRetry (StandardConnectionHandlingPolicy.Java:67) À l'org.Apache.curator.RetryLoop.callWithRetry (. RetryLoop.Java:99) à Org.Apache.curator.framework.imps.CreateBuilderImpl.pathInForeground (CreateBuilderImpl.Java:1020) À Org.Apache.curator.framework .imps.CreateBuilderImpl.prot ectedPathInForeground (CreateBuilderImpl.Java:501) à org.Apache.curator.framework.imps.CreateBuilderImpl.forPath (CreateBuilderImpl.Java:491) à . org.Apache.curator.framework.imps.CreateBuilderImpl $ 4.forPath (CreateBuilderImpl.Java:367) à org.Apache.curator.frame.imps.CreateBuilderImpl $ 4.forPath (CreateBuilderImpl.Java : 309) À l'adresse com.mycompany.app.App.main (App.Java:35)

14
David Holiday

Edit: Apparemment, cette erreur peut se produire si vous utilisez la mauvaise combinaison de Curator en combinaison avec Zookeeper. De curator.Apache.org :

Curator 2.x.x - compatible avec ZooKeeper 3.4.x et ZooKeeper 3.5.x

Curator 3.x.x - compatible uniquement avec ZooKeeper 3.5.x et inclut la prise en charge de nouvelles fonctionnalités telles que la reconfiguration dynamique, etc.


Il est difficile de cerner votre problème uniquement avec ce code d'erreur et non avec une trace de pile, mais certaines améliorations que je suggérerais pour rendre votre application plus stable sont les suivantes:

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());
            }

    }
}
36
Petter

J'ai eu le même problème.

J'ai essayé d'utiliser inTransaction () comme expliqué ici: http://www.programcreek.com/Java-api-examples/index.php?api=org.Apache.curator.framework.CuratorFramework on exercice 6 et semble fonctionner.

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

J'ai également fait face à une exception similaire, j'ai utilisé les dépendances ci-dessous qui sont compatibles et m'aident à résoudre l'exception.

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

La solution @ Massimo Da Ros fonctionne, mais dans la nouvelle version de Curator 4.0.0, inTransaction est obsolète. Il est recommandé d'utiliser la méthode transaction comme ci-dessous:

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

Le problème est dû à une incompatibilité. 

Pour résoudre ce problème, vous devez changer la version comme expliqué ici:
https://curator.Apache.org/zk-compatibility.html

Si cela ne fonctionne pas, cherchez simplement la dernière version de conservateur, qui dépend d’une version 3.4.x de zookeeper (actuellement '2.12.0').

0