2016-03-01 15 views
11

Sto tentando di utilizzare Apache Curatore con un'istanza guardiano dockerized e non importa come tento di collegarmi finisco sempre con un errore diApache Curatore non implementate errori nel tentativo di creare zNodes

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

. Ho provato a dare un senso alla documentazione, ma non sto arrivando da nessuna parte. Ho annotato nel CLI guardiano e ha assicurato il numero di porta è corretto così:

[email protected]:~$ 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 

Ecco il codice che sto cercando di utilizzare:

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

    } 
} 

Per quanto posso dire dalla Curator getting started page, questo dovrebbe funzionare. Cosa mi manca?

edit1 appena capito che io sono in grado di tirare i dati fuori del complesso guardiano dello zoo così:

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

ma il comando è ancora creare saltare in aria.

edit2

StackTrace dell'errore:

org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /larry-smells/foop at org.apache.zookeeper.KeeperException.create(KeeperException.java:103) at org.apache.zookeeper.KeeperException.create(KeeperException.java:51) at 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) at 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.framework.imps.CreateBuilderImpl.forPath(CreateBuilderImpl.java:491) at org.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)

risposta

27

Edit: A quanto pare questo errore può verificarsi se si utilizza la combinazione sbagliata di Curatore in combinazione con Zookeeper. Da curator.apache.org:

Curator 2.x.x - compatible with both ZooKeeper 3.4.x and ZooKeeper 3.5.x

Curator 3.x.x - compatible only with ZooKeeper 3.5.x and includes support for new features such as dynamic reconfiguration, etc.


E 'difficile individuare il problema solo con codice di errore e non una traccia dello stack, ma alcune migliorie vorrei suggerire per rendere il vostro aplication più stabile è:

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 parants are created. 
      client.create().creatingParentsIfNeeded().forPath("/larry-smells/foop", "tuna?".getBytes()); 
     } catch (Exception e) { 
      System.out.println(e.toString()); 
      } 

    } 
} 
+0

fatto modifica suggerita e ottenuto lo stesso risultato. Ho anche aggiunto la traccia dello stack al testo della domanda. –

+0

doots - scopre che sono un dink. il problema è stato chiaramente indicato in un avviso nella parte inferiore della home page del curatore riguardante l'utilizzo della sola versione 2 con le versioni di <3.5.x. Fondamentalmente non sono riuscito a RTFM. Se lo metti sotto forma di risposta, lo accetterò così almeno avrai qualche credito per il tuo problema :-) –

0

Il problema è causato dall'incompatibilità.

Per risolvere questo problema, è necessario modificare la versione come è spiegato qui:
https://curator.apache.org/zk-compatibility.html

Se questo non funziona, basta guardare per la versione più recente curatore, che dipende da una versione 3.4.x Zookeeper (attualmente '2.12.0').

0

@Massimo Da Ros opere soluzione, ma nella versione nuova Curatore 4.0.0 inTransaction è obsoleta, è recommented uso transaction metodo come di seguito:

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