hbase의 shell는 ruby를 사용한다.
./bin/hbase shell을 실행한 shell이 hbase-0.94.6/lib/ruby/shell.rb 소스로 연결되어 있었다. 참고로 0.94.6 hbase 에서는 jruby-complete-1.6.5.jar 를 사용하고 있다.
$ vi bin/hbase
# figure out which class to run
if [ "$COMMAND" = "shell" ] ; then
# eg export JRUBY_HOME=/usr/local/share/jruby
if [ "$JRUBY_HOME" != "" ] ; then
CLASSPATH="$JRUBY_HOME/lib/jruby.jar:$CLASSPATH"
HBASE_OPTS="$HBASE_OPTS -Djruby.home=$JRUBY_HOME -Djruby.lib=$JRUBY_HOME/lib"
fi
CLASS="org.jruby.Main -X+O ${JRUBY_OPTS} ${HBASE_HOME}/bin/hirb.rb"
hirb.rb 소스를 보니. irb라는 대화형 루비 Shell이라는 모듈을 import해서 쓰고 있다.
/lib/ruby 디렉토리 및 /src/main/ruby/lib밑의 ruby 모듈을 읽어 ruby 스크립트를 실행시킨다.
따라서. /lib/ruby/shell/commands/ 밑의 다양한 ruby 스크트를 일고 shell command가 가능하도록 되어 있다.
스크립트를 rb 파일을 읽고 쓰는 구조라 확장할 수 있을 것 같다는 생각이 들어 구글검색하니.. '확장 가능'하다.
아래 링크의 예처럼 customized 된 ruby script를 load하여 쓸 수 있다.
http://www.srikanthps.com/2011/07/power-of-ruby-and-hbase-shell.html
* NoMethodError 발생
hbase 실행시 만약 아래와 같은 Error가 발생할때는 JRUBY_HOME 을 살펴봐야한다. hbase 의 설정인 JRUBY_HOME path때문에 이슈가 발생된 것이기 때문에 Path를 없애고 실행시켜보면 된다.
NoMethodError: undefined method `getTerminal' for Java::Jline::Terminal:Module
refresh_width