2

少しばかげた Hbase の質問がありますが、長い間立ち往生していました。Hbase シェルにログインすると、次のコマンドが発行されました。

[jack@HOST117-20 bin]$ ./hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 0.94.0, r1332822, Tue May  1 21:43:54 UTC 2012

hbase(main):001:0>scon mytable

コマンドを削除できないことがわかりました。たとえば、間違ったコマンド「scon」を入力すると、バックスペースまたは削除ボタンを使用してコマンドを削除できず、もう一度入力する必要があります。前もって感謝します

4

3 に答える 3

2

同じ問題に遭遇し、次のコマンド ラインを入力すると、標準の irb でも問題が再現できることがわかりました (このコマンド ラインは、/usr/lib/hbase/bin/hbase を読んで見つけました)。

$ java -cp \
    ~/.m2/repository/org/jruby/jruby-complete/1.6.5/jruby-complete-1.6.5.jar \
    org.jruby.Main /usr/bin/irb

したがって、根本原因は HBase シェルではなく JRuby にあり、さらに調査した結果、JRuby 1.6.5 で使用されている JLine に根本原因があることが判明しました。

まず、 ~/.jlinebindings.properties ファイルを作成し、そこに「Rubout:backward-delete-char」を配置し、バックスペース キーが「カーソルの後ろの 1 文字を削除」することを期待しましたが、機能しませんでした。さらに悪いことに、.jlinebindings.properties ファイルの存在により、他のキー バインド (矢印キーのバインドなど) がクリアされたので、.jlinebindings.properties を削除しました。~/.jline.rc と ~/.inputrc にキーバインディングの設定を追加してみましたが、どちらもうまくいきませんでした。

さらに調査するために JLine2 ソース コードを調べたところ、JLine2 の最新バージョンは .jlinebindings.properties ファイルをサポートしていないことがわかりました。ただし、.jline.rc はサポートされています。ということで、最新のJLIne2ソースコードをコンパイルし、.jline.rcファイルにキーバインディングを入れ、JLine2ライブラリ(target/jline-2.10-SNAPSHOT.jar)をクラスパスの最初の要素に指定したのですが、うまくいきませんでした。新しく構築された JLine2 ライブラリでは、JRuby 1.6.5 が IncompatibleClassChangeError をスローしました。これは、JLine2 がその API を変更し、後方互換性が壊れていることを意味します。

次に、JRuby のソース コードをチェックアウトし、次のようにコンパイルしました。

# JRuby compilation requires ant
$ yum install ant

# Without this, compilation fails.
$ yum install ant-apache-regexp

$ git clone https://github.com/jruby/jruby.git

# Check the latest version
$ git tag

$ git checkout 1.7.1
$ mvn install

新しい JRuby バイナリを使用して、コマンド ラインを再度呼び出しました。

$ java -cp \
    ~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar \
    org.jruby.Main /usr/bin/irb

しかし、SyntaxError が発生しました。

SyntaxError: file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/lc/ja/encoding_aliases.rb:7: syntax error, unexpected kEND

end
  ^
         eval at org/jruby/RubyKernel.java:1066
    real_load at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:134
         load at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:110
   initialize at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/locale.rb:32
  init_config at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/init.rb:114
        setup at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb/init.rb:16
        start at jar:file:/home/admin/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar!/META-INF/jruby.home/lib/ruby/1.9/irb.rb:53
       (root) at /usr/bin/irb:13

encoding_aliases.rb に何か問題があるに違いありません (または、新しい JRuby が後方互換性を損なういくつかの変更を加えた) が、私はそれを調査する気にならなかったので、回避策として LANG=C を追加しました。

$ LANG=C java -cp \
    ~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar \
    org.jruby.Main /usr/bin/irb

これで irb が正常に起動し、バックスペースが期待どおりに動作することを確認できました。maven/jruby-core/pom.xml によると、JRuby 1.7.1 が参照する JLIne のバージョンは 2.7 です。

最後のステップとして、次のようにして、HBase シェルに新しい JRuby を使用させようとしました。

$ cd /usr/lib/hbase/lib
$ mv jruby-complete-1.6.5.jar{,.backup}
$ cp ~/.m2/repository/org/jruby/jruby-complete/1.7.1/jruby-complete-1.7.1.jar .
$ hbase shell

しかし、HBase シェルは起動しませんでした。代わりに、以下のエラー メッセージが出力されました。

include_class is deprecated. Use java_import.
include_class is deprecated. Use java_import.
include_class is deprecated. Use java_import.
12/12/28 18:03:12 WARN conf.Configuration: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
NoMethodError: undefined method `getTerminal' for Java::Jline::Terminal:Module
  refresh_width at /usr/lib/hbase/bin/../bin/../lib/ruby/shell/formatter.rb:34
     initialize at /usr/lib/hbase/bin/../bin/../lib/ruby/shell/formatter.rb:47
         (root) at /usr/lib/hbase/bin/../bin/hirb.rb:108

これらのエラー メッセージは、/usr/lib/hbase/lib の下にある jruby-complete-*.jar を置き換えても問題が解決しないことを示しています。

そのため、私はあきらめて、この問題に対する簡単な回避策はないと結論付けました。私の最終的な結論は、HBase の専門家が HBase シェルの実装を新しい JRuby で更新するのを待つ必要があるということです。

于 2012-12-30T10:33:43.963 に答える
0

私は試験と同じ問題を抱えていました。Win 7ボックスでxtermモードでSecureCRTを使用して、CentOS 6.3 LinuxサーバーにSSHで接続します。

hbase などをインストールしたところ、バックスペース キーと削除キーの両方が右方向に削除されていることがわかりました。@Jack 、バックスペースは壊れていないと思います。通常の動作(左方向に削除する)ではなく、別の削除キーとして機能しているだけです。

解決策を見つけました: Ctrl + Backspace を使用して左削除します。それは私にとって魅力のように機能します。したがって、過去 2 年間に解決策を見つけられなかった場合は、これを試してみてください ;)

ところで、この回避策を見つけましたが、なぜそれが起こっているのかまだわかりません。この問題の原因 (irb のバグか、SecureCRT の設定ミスか?) をご存知の方がいらっしゃいましたら、教えてください。ありがとう!

于 2014-05-08T09:47:17.757 に答える