HBase는 Hadoop처럼 Windows에서는 동작할 수 없다 때문에 Cygwin을 사용해야만 하는데.. 여기서 희안한 문제가 발생하곤 한다. 오늘은 HBase를 설치하고 shell을 실행시키려 하는데 동작이 되지 않는 것이다. 아.. 정말 레퍼런스도 적고 힘겹고마..
이리저리 찾아보니 갑자기 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. 패치의 내용처럼 아래 부분에 코드를 추가한다. 삭제되는 부분은 없고 굵은 글씨로 된 부분을 추가만 해주면 된다.
3. 그리고 패치에는 포함되어 있지 않는데 파일을 여는 부분을 수정해 준다.
이슈 내용을 읽어보면 파일을 여는 부분에서 문제가 발생하는 것 같다. File.open() 시 정상적인 /dev/null 파일이 열리지 않고 nil(null)이 반환되고, 아래에서 호출되는 f.close()에서 NilClass는 해당 메소드가 없어서 예외가 발생한 것이다. 패치를 보면 Windows에서 Cygwin을 사용하면 /dev/null 대신 NUL을 사용해야 하는듯..
$ 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
...
$ hbase shell
HBase Shell; enter 'help
Type "exit
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
# 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")
# 오픈하는 파일을 아래와 같이 수정..
f = File.open(DEV_NULL, "w")
이슈 내용을 읽어보면 파일을 여는 부분에서 문제가 발생하는 것 같다. File.open() 시 정상적인 /dev/null 파일이 열리지 않고 nil(null)이 반환되고, 아래에서 호출되는 f.close()에서 NilClass는 해당 메소드가 없어서 예외가 발생한 것이다. 패치를 보면 Windows에서 Cygwin을 사용하면 /dev/null 대신 NUL을 사용해야 하는듯..







덧글