【问题标题】:zookeeper client does not provide CLI with "jline support is disabled" messagezookeeper 客户端不向 CLI 提供“禁用 jline 支持”消息
【发布时间】:2015-07-14 15:38:03
【问题描述】:

我刚刚提出CDH 5.4 并安装了zookeeper。我之前多次成功使用过zkCli。这次命令行启动在进入提示符之前停止

Welcome to ZooKeeper!
JLine support is disabled
2015-05-04 18:18:33,936 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@975] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2015-05-04 18:18:33,952 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@852] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2015-05-04 18:18:33,985 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x34d12349d0a15cf, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

我知道通常的打印输出是 JLine 支持已启用

这就是卡住的原因吗?我没有看到任何方法可以更改 Cloudera 管理器配置页面。

【问题讨论】:

标签: java hadoop cloudera apache-zookeeper jline


【解决方案1】:

免责声明:请注意答案来自 2015 年。它可能不再相关,但可能具有历史意义,并对类似的“现代”案例有所了解。

简短

Cloudera 在多个地方破坏了zookeeper 3.4.5-cdh5.4.0。服务正在运行,但 CLI 已死。除了回滚之外没有其他解决方法。

长

为此分配赏金;-)。我也踩到过这个地雷,气到找到原因:

Zookeeper 在ZooKeeperMain.run() 期间检查JLine。有加载类数量的 try-catch 块。类加载期间的任何异常都会导致整个块失败,并且报告 JLine 支持被禁用。

但这就是CDH 5.4.0 发生这种情况的原因:

  1. 当前的开源 Zookeeper-3.4.6 与 jline-0.9.94 对抗。没有这个问题。

  2. 在CDH 5.4Cloudera 中应用了以下补丁:

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 类 consoleC = Class.forName("jline.ConsoleReader"); > 类完成者C = 316,317c316,317 方法 addCompletor = consoleC.getMethod("addCompleter", > Class.forName("jline.console.completer.Completer"));
  1. CDH 5.4 对 ZooKeeper 使用 jline-2.11.jar,它没有 jline.ConsoleReader 类(从 2.11 是 jline.console.ConsoleReader)。

  2. 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 并拥有生产集群。

  1. 在我看来,zookeeper 的类路径中的jline-0.9.94.jar 和jline.2.11.jar 都可以解决问题。但是刚刚发现 Cloudera 在 ZK 中为 CDH 5.4.0 做了另一个“修复”,他们将 org.apache.zookeeper.JLineZNodeCompletor 类重命名为 org.apache.zookeeper.JLineZNodeCompleter。

但这是来自ZooKeeperMain.java的代码

Class<?> completorC =                    Class.forName("org.apache.zookeeper.JLineZNodeCompletor");

当然这意味着实际上不可能以正确的方式在 CDH 5.4.0 中启动 ZK CLI。糟糕的工作。 :-(

【讨论】:

  • 参加聚会有点晚了,没有使用 cloudera,但在运行独立的 zookeeper shell 以连接到 zookeeper 集群时也遇到了这个问题。将 hadoop libs 文件夹中的 jline jar 添加到 zookeeper/libs/ 并且 cli 再次工作。
【解决方案2】:

你可以去 usr/lib/hbase/bin/hbase 并传递这个代码:

# Add libs to CLASSPATH

    for f in $HBASE_HOME/lib/*.jar; do
      CLASSPATH=${CLASSPATH}:$f;
    if [ "$COMMAND" = "zkcli" ] ; then
      CLASSPATH=`echo $CLASSPATH | sed 's/jruby-cloudera-1\.0\.0\.jar//g'`
      CLASS="org.apache.hadoop.hbase.zookeeper.ZooKeeperMainServer" ;
    Fi
    done

它对我有用:)

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 2015-01-12
    • 2016-12-02
    • 1970-01-01
    • 2017-01-18
    • 2017-01-08
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多