[hbase] hbase & ruby

nosql 2013. 4. 8. 13:42



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



Posted by '김용환'
,