免責事項:回答は2015年のものであることに注意してください。おそらくもはや関連性はありませんが、歴史的な目的に役立ち、同様の「現代の」ケースに光を当てる可能性があります。
短い
Cloudera はzookeeper 3.4.5-cdh5.4.0
いくつかの場所で壊れています。サービスは機能していますが、CLI は停止しています。ロールバック以外の回避策はありません。
長いです
これに報奨金を割り当ててください;-)。私もこの鉱山を踏んだことがありますが、その理由を見つけるのに十分なほど怒っていました。
Zookeeper はJLine
の間にチェックしZooKeeperMain.run()
ます。クラスの数をロードする try-catch ブロックがあります。クラスのロード中に例外が発生すると、ブロック全体が失敗し、JLine サポートが無効になっていると報告されます。
しかし、これが次の場合に発生する理由は次のCDH 5.4.0
とおりです。
現在のオープンソースZookeeper-3.4.6
は に対して動作しjline-0.9.94
ます。そのような問題はありません。
ClouderaではCDH 5.4
、次のパッチが適用されています。
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");
< クラス コンプリータC =
---
> クラス consoleC = Class.forName("jline.ConsoleReader");
> クラス コンプリーターC =
316,317c316,317
< メソッド addCompletor = consoleC.getMethod("addCompletor",
< Class.forName("jline.Completor"));
---
> メソッド addCompletor = consoleC.getMethod("addCompleter",
> Class.forName("jline.console.completer.Completer"));
CDH 5.4 はjline-2.11.jar
ZooKeeper に使用され、jline.ConsoleReader
クラスはありません (2.11
それからjline.console.ConsoleReader
)。
Jline 0.9.94
順番にありませんjline.console.completer.Completer
。
そのため、既存の JLine とは互換性がありません。どのCloudera CDH 5.4
ユーザーもzookeeper-client
自分のクラスターで実行できますが、機能しないことがわかります。
オープンソースは、そのような がないものにzookeeper-3.4.6
依存します。なぜエンジニアがそのような地雷を作ったのかわかりません。jline-0.9.94
patches
Cloudera
でそれを修正するきれいな方法がわかりません3.4.5-cdh5.4.0
。3.4.5-cdh5.3.3
CLI が必要で、実稼働クラスターがある依存関係にとどまりました。
jline-0.9.94.jar
私には両方とも、jline.2.11.jar
飼育係のクラスパスで問題が解決するように思えました。しかし、Cloudera が CDH 5.4.0 の ZK で別の「修正」を行ったことを発見したところ、org.apache.zookeeper.JLineZNodeCompletor
クラスの名前が に変更されましたorg.apache.zookeeper.JLineZNodeCompleter
。
しかし、ここにコードがありますZooKeeperMain.java
Class<?> completorC = Class.forName("org.apache.zookeeper.JLineZNodeCompletor");
もちろん、CDH 5.4.0 の適切な方法で ZK CLI を起動することは実質的に不可能です。ひどい仕事。:-(