본문 바로가기

OpenSource(Bigdata&distribution&Network)/Hbase, Phoenix

Hbase 설치.

Hadoop 설치후 파일몇개 올려보고 할게 없다.
Map Reduce테스트나 자바콘솔로 테스트하고 말곤 그닥 당장은 할게 없었다.

실제 Hadoop을 기반으로한 DB를 만들어서 뭔가를 해봐야한다는 생각에 이것저것 찾아본 결과. HBASE~ 찾았다.

Google 에서 쓴다고들하는데 그건 내가 알바아니고.
일단 사용해보고 이것저것 테스트좀 해보기위해서 설치부터 해봐야것다.

나의 성능좋은(?) 서버에 이전에 설치한 Hadoop 과 함께 HBASE를 올려보도록한다.

내가 보기엔 아래와 같은 상태같다. 아니면 댓글누군가 달겠지;;;

Hadoop의 HDFS에 HBase를 올린다라고 생각하면 되고. 단.
Hbase간의 분산시스템은 zookeeper가 해준다라고 생각하면 될것같다.

 

위에서 보면 알겠지만 서버로 구축한다면 6대다.
물론 local에 설치해도 된다만 저럴수도 있겠다 싶어서 저렇게 해보려한다.
zookeeper도 사실 서버를 나누고 싶었는데 이상하게 에러나는곳이 있어서 일단 그건 나중에... 안되면 안되는갑다 하고 넘어가련다...

아래 스펙의 Vmware 이미지를 3개를 또 준비한다. ( 원래는 cloudera HA 테스트를 해보려 했으나. 내가 cloud서비스를 할것도 아니고 .. 큰 관심도 없고 해서 테스트하려다가 말았다. 그때 준비한것을 사용하는중)

 

위처럼 3개를 구성해서 기존 Hadoop 에 올리면 아래처럼 6개의 이미지를 돌리게되는 상황.....

위는 설치하면 저렇게 버벅일것이다를 보여주는것뿐이고...
이제 본격적인 설치를 해보자.

 

1. vmware 구성
CPU : 2core
RAM : 2GB
HDD : 20GB * 2
로 구성된 리눅스 vmware image를 3개를 준비한다.

 

2. 아이피 할당.
기존 Hadoop ( HDFS )은 전에 설치한것이니 아이피만 확인.
hadoop (master) : 192.168.0.141
hadoop (slave1) : 192.168.0.142
hadoop (slave2) : 192.168.0.143

신규 이번 Hbase 를 위한 아이피.
아이피옆의 괄호는 hostname
hbase (master) : 192.168.0.144 (hbase1)
hbase (slave1) : 192.168.0.145 (hbase2)
hbase (slave2) : 192.168.0.146 (hbase3)

위의 그림에서 잠깐 나온 zookeeper 가 hbase를 분산해서 관리하게 해주는 시스템으로 보여진다.
이 예기인 즉슨 이놈이 각 서버를 통신을 한다는 예기다.
설치문서를 봐선 딱히 서버간의 ssh 설정을 하지는 않는다.
아마도 특정포트를 가지고 서로 통신하는가본데 설치의 용이함을 위해서 그냥 ssh 설정을 해도 되지 않을까?????

 

3. 소스 준비 (당연히 각 3대서버에
http://www.apache.org 에 다 있다. 없는게 없다.
내가 받은 버전은 아래와 같다.

hbase : http://apache.tt.co.kr/hbase/ => hbase-0.94.0.tar.gz
zookeeper : http://apache.tt.co.kr/zookeeper/ => zookeeper-3.3.5.tar.gz
java : http://java.oracle.com => 1.7 ( hadoop  설치할때 사용한 jdk )

 

4. zookeeper 설치.
oracle 11g 도 그렇고 이것도 그렇고 일단 기본적으로
DB라는것이 올라가기전에 클러스터구성을 먼저하고나서 그 위에 DB를 올린다.

소유자는 hadoop 계정으로 그냥 이어서 하도록하겠다. 하고싶은대로 아무거나 해도 된다.

 

ㄱ. zookeeper 압축을 풀고나서 /usr/local/zookeeper 로 옮긴다.

 

ㄴ. zookeeper안의 conf디렉토리에 zoo_sample.cfg 를 복사해서 같은위치 zoo.cfg로 둔다.
기본값에서 수정,추가 한것은 dataDir , server1 , server2 , server3 이다.
* 지금와서 안것인데 dataDir에는 딱히 대단한 데이터가 쌓이는것은 없었다. 단지 용량이 생각보다 큰 로그파일이 생기다 보니 필요에 따라서 디스크를 새로 할당해줘야할상황이 올것같다.
* 설치하고 띄울때 에러가나서 이것저것하면서 확인했는데 이상하게 주석이랑 같이 인식을 하는부분이 있어서 주석을 다 지워버렸다.
* start하는 소스를 보면 알겠지만 이상하게 변수를 주석있는 부분까지 자꾸 인식하여 승질나서 주석을 다 지워버렸다.
* 아래 server.1 같은것은 분산서버목록 2888,3888이것은 포트 대역이거나 포트일것이다.

 

[hadoop@hbase2 conf]$ cat zoo.cfg
tickTime=2000
initLimit=5
syncLimit=3
dataDir=/home/hadoop/zookeeper/data
clientPort=2181
server.1=hbase1:2888:3888
server.2=hbase2:2888:3888
server.3=hbase3:2888:3888

 

ㄷ. 위에 설정된 /home/hadoop/zookeeper/data 에 디렉토리를 만들어주고 myid 라는 파일명으로 파일하나를 생성한다.
생성후 파일안에 숫자를 넣어주는데 그 숫자는 위의 설정파일에 server.1 이라는 이름에 숫자 1 이것을 넣어준다.
* 숫자를 안쓰니까 java에러가 났다. 숫자느라고.

192.168.0.144(hbase1) 서버의 /home/hadoop/zookeeper/data/myid 파일안에 1이라고 해주고
192.168.0.145(hbase2) 서버의 /home/hadoop/zookeeper/data/myid 파일안에 2이라고 해주고
192.168.0.146(hbase3) 서버의 /home/hadoop/zookeeper/data/myid 파일안에 3이라고 해준다.

 

ㄹ. 시동
설정은 끝났으며 이제 구동한다.
* 물론 path를 잡아주엇기때문에 난 아래 박스처럼 시작한다. 경로는 귀찮아서 다 안쓴다.
/usr/local/zookeeper/bin/zkServer.sh start
* hadoop 처럼 난 master에서 구동하면 다 실행될줄 알았다. 그래서 왜이렇게 안뜨나 했는데 샹~ ( 각각서버에서 시작을 다 해줄것 )
로그파일또는 out파일을 보면서 에러를 잡으면서 하는데 자꾸 에러가나서 그냥 수동으로 띄웠더니 에러가 안남....

서버 1
[hadoop@hbase1 ~]$ zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED

서버 2
[hadoop@hbase2 ~]$ zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED

서버3
[hadoop@hbase3 ~]$ zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/conf/zoo.cfg
Starting zookeeper ... STARTED


아래 4622 번의 QuorumPeerMain 이 떠있으면 정상. ( 4622는 pid니까 신경끄시길 -_- )
[hadoop@hbase3 ~]$ jps
5199 Jps
4622 QuorumPeerMain
[hadoop@hbase3 ~]$

 

ㅁ. hbase 설치

별것없다 이것역시 압축풀고 옮겨준다.
나는 경로를 /usr/local/hbase 이렇게.

 

ㅂ. hbase 환경설정

1. hbase-env.sh 

사실 아래는 난 수정하지 않았다.
혹시나해서 export JAVA_HOME만 주석을 풀고 내 자바경로를 잡아준것이 다일뿐.
* 쉘파일을 뒤져보니 환경설정을 로드하고나서 hbase가 뜨는것을 확인했다. 그러므로 서버자체에
JAVA_HOME이 잘설정되어있으면 문제가 없다는뜻인것이다.

몇몇사이트를 뒤져보니 설정하게 되어있던데 그때는 로드가 안되었거나 또는 다른문제가 있었겠지...

파일 /usr/local/hbase/conf/hbase-env.sh 안에를 수정한다. ( 주석을 풀어주는면서 내용 수정한다. )

export JAVA_HOME="경로"
export HBASE_CLASSPATH="conf경로"
export HBASE_MANAGES_ZK=false

2. hbase-site.xml
실제로 내가 수정한 파일은 이것 하나라고 봐야맞다.
처음에는 비어있다(주석빼고) 

하나 하나 채워주기로 했다.
아래의 property 를 전부 추가했다.

<configuration>

<!-- hadoop 위치 설정 -->
<property>
        <name>hbase.rootdir</name>
        <value>hdfs://master1:9000/hbase</value>
</property>

<!-- hadoop 포트 설정. 정확한 용도 모른 -->
<property>
        <name>hbase.master</name>
        <value>hbase1:60000</value>
</property>

<!-- 분산으로 설정할꺼에여~~~~ 라고 알려줌 -->
<property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
</property>
<!-- 몇개가 분산으로 될꺼에요 라고 알려줌 -->

<property>
        <name>dfs.replication</name>
        <value>3</value>
</property>

<!-- 
zookeeper 설정 - 이것이 문제가 되었었다. 문서를 찾아보면 zookeeper는 서버를 따로 두고 해도 된다고 했었다 물론 공식문서말고... 헌데 다른서버에 두고 아래 value값을 그 호스트이름을 써주니까 start할때 저 서버에서 hbase를 찾는것을 확인했다.
없으니 당연히 에러 그래서 hbase와 같은곳에 뒀다. 
-->
<property>
        <name>hbase.zookeeper.quorum</name>
        <value>hbase1,hbase2,hbase3</value>
</property>

<!-- 포트 설정 1 -->
<property>
        <name>hbase.zookeeper.peerport</name>
        <value>2888</value>
</property>

<!-- 포트 설정 2 -->
<property>
        <name>hbase.zookeeper.leaderport</name>
        <value>3888</value>
</property>
</configuration>

 

ㅅ. 시작

/usr/local/hbase/bin/start-hbase.sh 시작
hbase2: starting zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-zookeeper-hbase2.out
hbase1: starting zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-zookeeper-hbase1.out
hbase3: starting zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-zookeeper-hbase3.out
starting master, logging to /usr/local/hbase/logs/hbase-hadoop-master-hbase1.out
hbase3: starting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-regionserver-hbase3.out
hbase2: starting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hadoop-regionserver-hbase2.out

* 시작했다 종료했다 반복하다 보니 자바에러가 났다.
* 물론 정상적으로 작동은 했다. 
* Address already in use 이런 오류가 튀어나오던데 예상컨데 zookeeper를 hbase가 컨트롤 해주는듯한것같기도 하고...
* 일단 정상

/usr/local/hbase/bin/stop-hbase.sh 종료 
stopping hbase.........
hbase2: no zookeeper to stop because kill -0 of pid 4768 failed with status 1
hbase3: no zookeeper to stop because kill -0 of pid 4701 failed with status 1
hbase1: no zookeeper to stop because kill -0 of pid 5520 failed with status 1

 

확인
서버 master
[hadoop@hbase1 ~]$ jps
5591 HMaster
6263 Jps
5318 QuorumPeerMain

서버 slave1
[hadoop@hbase2 data]$ jps
5722 Jps
5600 HRegionServer
4683 QuorumPeerMain
[hadoop@hbase2 data]$

 

ㅇ. 테스트

[hadoop@hbase1 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>

모 사이트 테스트 내용을 따라해봤다. ( http://confluence.openflamingo.org/pages/viewpage.action?pageId=754451 )

hbase(main):001:0> create 'testtbl' , {name=>'col1'},{name=>'col2'},{name=>'col3'}
NameError: undefined local variable or method `name' for #<Object:0x70faf7c7>

hbase(main):002:0> create 'testtbl', {NAME=>'COL1'},{NAME=>'COL2'},{NAME=>'COL3'}
0 row(s) in 1.7030 seconds

hbase(main):003:0> put 'testtbl','10001','COL1','10001',20090929
0 row(s) in 0.1530 seconds

hbase(main):004:0> put 'testtbl','10001','COL2','30',20090929
0 row(s) in 0.0290 seconds

hbase(main):005:0> put 'testtbl','10001','COL3','TESTMAN',20090929
0 row(s) in 0.0240 seconds

hbase(main):007:0> get 'testtbl' ,'10001'
COLUMN                           CELL                                                                                      
 COL1:                           timestamp=20090929, value=10001                                                           
 COL2:                           timestamp=20090929, value=30                                                              
 COL3:                           timestamp=20090929, value=TESTMAN                                                         
3 row(s) in 0.0290 seconds

hbase(main):008:0> list
TABLE                                                                                                                      
testtbl                                                                                                                    
1 row(s) in 0.0370 seconds

hbase(main):009:0>

 

ㅈ. 끝.
DB구성은 완료되었고. HDFS위에 HBASE를 올렸다.
그러면 그게 보이나????
HADOOP에서 제공하는 관리자 화면으로 보면 hbase가 보인다.

위에 보이나? hbase와 테스트시 만든 testtbl이 보인다.
이파일을 HADOOP이 관리를 하게 되나보다.

이제 DB도 구성되었고 본격적으로 개발을 하나 하도록한다.
개발 오랜만에해서 -_-; 잘될라나...