Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[HBase] Windows에서 hbase shell 실행 시 NoMethodError 발생 버그 Computer & Program

HBase는 Hadoop처럼 Windows에서는 동작할 수 없다 때문에 Cygwin을 사용해야만 하는데.. 여기서 희안한 문제가 발생하곤 한다. 오늘은 HBase를 설치하고 shell을 실행시키려 하는데 동작이 되지 않는 것이다. 아.. 정말 레퍼런스도 적고 힘겹고마..

$ start-hbase.sh
...

$ hbase shell
HBase Shell; enter 'help' for list of supported commands.
Type "exit" to leave the HBase Shell
Version 0.90.2, r1085860, Sun Mar 27 13:52:43 PDT 2011

NoMethodError: undefined method `close' for nil:NilClass
  initialize at C:/cygwin/HBASE-~1.2/bin/../lib/ruby/irb/hirb.rb:38
              start at C:\cygwin\HBASE-~1.2/bin/hirb.rb:171
            (root) at C:\cygwin\HBASE-~1.2/bin/hirb.rb:183


이리저리 찾아보니 갑자기 ruby 코드가 나오고.. 이상하다.. HBase는 Java로 만들어 진거로 알고 있는데.. 계속 읽어 보다 보다 보다 간신히 내용을 알아봤다. HBase 내부에 ruby와 같은 코드도 일부 포함되어 있으며, 위의 로그 내용을 보니 hirb.rb 코드가 이상하다는 것이다. 문제는 HBASE-3781에 제기됐고, 0.92 버전에서 수정됐다. 하지만 아직 stable 버전은 0.90.2 버전이 최신이다. 다행히도 패치가 포함되어 있고, ruby 코드라서 적용하면 컴파일 없이 0.90.2 버전에서도 문제 해결!!



1. [HBASE_HOME]/lib/ruby/irb/hirb.rb 파일을 열자..
2. 패치의 내용처럼 아래 부분에 코드를 추가한다. 삭제되는 부분은 없고 굵은 글씨로 된 부분을 추가만 해주면 된다.

# See the License for the specific language governing permissions and
# limitations under the License.
#
require 'rbconfig'

module IRB
WINDOZE = Config::CONFIG['host_os'] =~ /mswin|mingw/
  #Map the '/dev/null' according to the runing platform
  #Under Windows platform the 'dev/null' is not fully compliant with unix, and the 'NUL' object need to be use instead.
  if WINDOZE
  then
     DEV_NULL = "NUL"
  else
     #Unix like
     DEV_NULL = "/dev/null"
  end

  # Subclass of IRB so can intercept methods
  class HIRB < Irb
    def initialize

3. 그리고 패치에는 포함되어 있지 않는데 파일을 여는 부분을 수정해 준다.
f = File.open("/dev/null", "w")
    # 오픈하는 파일을 아래와 같이 수정..
f = File.open(DEV_NULL, "w")



이슈 내용을 읽어보면 파일을 여는 부분에서 문제가 발생하는 것 같다. File.open() 시 정상적인 /dev/null 파일이 열리지 않고 nil(null)이 반환되고, 아래에서 호출되는 f.close()에서 NilClass는 해당 메소드가 없어서 예외가 발생한 것이다. 패치를 보면 Windows에서 Cygwin을 사용하면 /dev/null 대신 NUL을 사용해야 하는듯..

덧글

댓글 입력 영역

Google AdSense (text/image)