2012-09-07 299 views
1

我有一個愚蠢的Hbase問題,但困擾了我很久。 當我登錄HBase的外殼發出以下命令:Hbase shell命令

[[email protected] 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」,那麼我不能使用Backspace鍵或Delete鍵刪除該命令,我不得不重新打字。 在此先感謝

+0

我從來沒有過這個問題,但我只玩過0.90。你在使用什麼操作系統? – David

+0

嗨大衛,我的操作系統是centos 6.1 – Jack

+0

是的,很奇怪,我懷疑可能缺少插件 – Jack

回答

1

我遇到了同樣的問題,發現問題可以通過鍵入以下命令行(即通過讀取/ usr/lib/hbase/bin/hbase )。

因此,根本原因存在不HBase的外殼,但在JRuby和進一步的調查,發現該根源在通過的JRuby 1.6.5使用的JLine存在。

首先,我創建了〜/ .jlinebindings.properties文件,並在其中放入了「Rubout:backward-delete-char」,希望退格鍵可以「刪除光標後面的一個字符」,但它不起作用。更糟的是,.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,我可以確認backspace按預期工作。 maven/jruby-core/pom.xml表示JRuby 1.7.1引用的JLIne版本是2.7。

作爲最後一步,我嘗試讓HBase shell通過執行以下操作使用新的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 shell沒有啓動。相反,下面的錯誤消息被髮出。

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 

這些錯誤信息表明,更換JRuby的完成 - 。*在/ usr/lib目錄/ HBase的/ lib目錄不能解決問題罐子。

所以,我放棄了,並得出結論說沒有簡單的解決方法來解決這個問題。我的最後結論是,我們必須等待HBase專家用新的JRuby更新HBase shell實現。

0

我有考試同樣的問題。我在Win 7盒子中以xterm模式使用SecureCRT來SSH到CentOS 6.3 Linux服務器。

我安裝了hbase和東西,然後我發現我的退格鍵和刪除鍵都向右刪除。所以,@Jack,我猜你的退格沒有被打破,只是它作爲另一個刪除鍵,而不是它的正常行爲(這是刪除向左)。

我找到了一個解決方案:使用Ctrl + Backspace左鍵刪除。它對我來說就像一個魅力。所以如果你在過去的2年中沒有找到解決方法,你應該試試這個;)

順便說一句,雖然我發現這個解決方法,但我仍然不知道它爲什麼會發生。如果有人知道這個問題的原因(IRB的錯誤或SecureCRT的錯誤設置?),請告訴我。謝謝!

1

您可能在windows上使用secureCRT。我在這個配置中遇到了同樣的問題。我切換到PuTTY並且問題消失了。如果你仍然想使用SecureCRT,我找到了一個解決方法 - 進入會話配置並在模擬部分使用Terminal「Linux」,現在在HBase Shell中,可以使用Ctrl-backspace來執行「backspace」作業。