Куратор Apache не реализовал ошибки при попытке создания zNodes
Я пытаюсь использовать Apache Curator с докционированным экземпляром zookeeper и независимо от того, как я пытаюсь подключиться, я всегда заканчиваю
org.apache.zookeeper.KeeperException $UnimplementedException: KeeperErrorCode = Unimplemented for...
ошибка. Я попытался понять документацию, но я никуда не денусь. Я зашел в CLI zookeeper и обеспечил правильный номер порта:
[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
вот код, который я пытаюсь использовать:
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());
}
}
}
Насколько я могу судить по странице создания куратора, это должно сработать. Что мне не хватает?
edit1
просто понял, что я могу вытащить данные из ансамбля зоопарка:
System.out.println(new String(curatorFramework.getData().forPath("/larry-smells")));
но команда create все еще взрывается.
edit2
stacktrace ошибки:
org.apache.zookeeper.KeeperException $UnimplementedException: KeeperErrorCode = Unimplemented for/larry-odells/foop at 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) на org.apache.curator.RetryLoop.callWithRetry(RetryLoop.java:99) в org.apache.curator.framework.imps.CreateBuilderImpl.pathInForeground(CreateBuilderImpl.java:1020) в org.apache.curator.framework.imps.CreateBuilderImpl.protectedPathInForeground(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.framework.imps.CreateBuilderImpl $4.forPath(CreateBuilderImpl.java:309) на com.mycompany.app.App.main(App.java35)
Ответы
Ответ 1
Изменить: По-видимому, эта ошибка может возникнуть, если вы используете неправильную комбинацию куратора в сочетании с Zookeeper. Из curator.apache.org:
Куратор 2.x.x - совместим как с ZooKeeper 3.4.x, так и с ZooKeeper 3.5.x
Куратор 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 parants are created.
client.create().creatingParentsIfNeeded().forPath("/larry-smells/foop", "tuna?".getBytes());
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
Ответ 2
У меня была та же проблема.
Я попытался использовать inTransaction(), как описано здесь: http://www.programcreek.com/java-api-examples/index.php?api=org.apache.curator.framework.CuratorFramework в упражнении 6
и, похоже, работает.
client.inTransaction ().create().forPath("/larry-smells/foop", "tuna?".getBytes()).and ().commit ();
Ответ 3
Проблема вызвана несовместимостью.
Чтобы исправить это, вам нужно изменить версию, как описано здесь:
https://curator.apache.org/zk-compatibility.html
Если это не работает, просто найдите самую новую версию куратора, которая зависит от версии 3.4.x zookeeper (в настоящее время '2.12.0'
).
Ответ 4
Решение @Massimo Da Ros работает, но в новой версии куратор 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();