Disclaimer: please note answer is from 2015. It is probably not relevant anymore but may serve historical purpose and have some light on similar 'modern' cases.
SHORT
Cloudera has broken zookeeper 3.4.5-cdh5.4.0
in several places. Service is working but CLI is dead. No workaround other than roll back.
LONG
Assign a bounty on this ;-). I have stepped on this mine too and was angry enough to find the reason:
Zookeeper checks JLine
during ZooKeeperMain.run()
. There is try-catch block which loads number of classes. Any exception during class loading fails whole block and JLine support is reported to be disabled.
But here is why this happens with CDH 5.4.0
:
Current opensource Zookeeper-3.4.6
works against jline-0.9.94
. Has no such issue.
In CDH 5.4
Cloudera has applied the following patch:
roman@node4:$ diff zookeeper-3.4.5-cdh5.3.3/src/java/main/org/apache/zookeeper/ZooKeeperMain.java zookeeper-3.4.5-cdh5.4.0/src/java/main/org/apache/zookeeper/ZooKeeperMain.java
305,306c305,306
< Class consoleC = Class.forName("jline.ConsoleReader");
< Class completorC =
---
> Class consoleC = Class.forName("jline.ConsoleReader");
> Class completorC =
316,317c316,317
< Method addCompletor = consoleC.getMethod("addCompletor",
< Class.forName("jline.Completor"));
---
> Method addCompletor = consoleC.getMethod("addCompleter",
> Class.forName("jline.console.completer.Completer"));
CDH 5.4 uses jline-2.11.jar
for ZooKeeper and it has no jline.ConsoleReader
class (from 2.11
it is jline.console.ConsoleReader
).
Jline 0.9.94
in turn has no jline.console.completer.Completer
.
So there is incompatibility with any existing JLine. Any Cloudera CDH 5.4
user can run zookeeper-client
on his/her cluster and find it does not work.
Open source zookeeper-3.4.6
depends on jline-0.9.94
which has no such patches
. Don't know why Cloudera
engineers have done such a mine.
I see no clean way to fix it with 3.4.5-cdh5.4.0
. I stayed with 3.4.5-cdh5.3.3
dependency where I need CLI and have production clusters.
- It seemed to me both
jline-0.9.94.jar
and jline.2.11.jar
in classpath for zookeeper will fix the problem. But just have found Cloudera made another 'fix' in ZK for CDH 5.4.0, they have renamed org.apache.zookeeper.JLineZNodeCompletor
class to org.apache.zookeeper.JLineZNodeCompleter
.
But here is the code from ZooKeeperMain.java
Class<?> completorC = Class.forName("org.apache.zookeeper.JLineZNodeCompletor");
And of course it meaan practically it is not possible to start ZK CLI in CDH 5.4.0 proper way. Awful work. :-(