Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

환경 구성

Hbase는 HDFS기반으로 작동한다. 따라서 반드시 Hadoop 환경을 구성해야 한다. hadoop을 설치문서를 따라서 설치하자. 현재 Hadoop 환경은 다음과 같다. VirtualBox로 구성했다. 문서는 Hadoop 구성을 끝냈다고 가정하고 진행한다.

 Hadoop 환경
  • hadoop01, hadoop02, hadoop03 3개의 노드로 구성한다.
  • hadoop01은 Masternode, hadoop02/03은 Datanode다.
/etc/hosts 내용이다. 3개 노드 모두 동일하다.
$ cat /etc/hosts
127.0.0.1	localhost

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.56.100 hadoop01
192.168.56.101 hadoop02
192.168.56.102 hadoop03

다운로드 및 환경 설정

hbase의 실행 계정은 yundream 일반 계정으로 한다. 설치 디렉토리는 /home/yundream/hbase로 결정했다. apache.org에서 hbase stable 버전을 다운로드 한다. 압축을 풀고 /home/yundream/hbase로 이름을 바꾼다. 3개 노드 모두에 설치해야 한다.
$ echo $HOME
/home/yundream
$ wget http://apache.mirror.cdnetworks.com/hbase/stable/hbase-1.2.5-bin.tar.gz
$ mv hbase-1.2.5 hbase 

환경 변수 JAVA_HOME을 설정한다. $HOME/.bash_rc 혹은 /etc/environment에 설정하면 된다. hbase는 ssh 로그인으로 각 노드에 들어가서 hbase를 설치하는데, 이때 JAVA_HOME 환경 변수를 읽는다. 왠일인지 .bash_rc의 환경변수는 로딩되지 않는 경우가 있으니, 그냥 모두다에 설정한다.
$ cat ~/.bashrc
export HBASE_HOME=/home/yundream/hbase
export PATH=$PATH:$HBASE_HOME/bin
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/
export HBASE_PID_DIR=/home/yundream/hbase/pid

$ cat /etc/environment
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/
HBASE_PID_DIR=/home/yundream/hbase/pid
hbase는 프로세스가 시작할 때, 자신의 PID 정보를 파일로 저장한다. 관리자가 hbase를 멈출 경우 PID 파일에 있는 정보를 읽어서 kill 시그널을 전송한다. 이 파일은 설정이 없을 경우 /tmp 디렉토리 밑에 만들어진다. /home/yundream/hbase/pid 밑에 쌓기로 했다. 파일이름은 hbase-yundream-master.pid 이런 형태다.

hbase-site.xml

hbase-site.xml 설정파일은 $HBASE_HOME/conf에 있다. 아래와 같이 수정했다.
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>hbase.rootdir</name>
		<value>hdfs://hadoop01:54310/hbase</value>
	</property>

	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>

	<property>
		<name>hbase.zookeeper.quorum</name>
		<value>hadoop01,hadoop02,hadoop03</value>
	</property>

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

	<property>
		<name>hbase.zookeeper.property.clientPort</name>
		<value>2181</value> 
	</property> 
</configuration>
  • hbase.rootdir : 여기에 설정된 디렉토리에 데이터베이스 파일을 관리한다. hdfs masternode의 URL을 입력하면 된다. hadoop 명령으로 URL을 확인 할 수 있다.
    $ hadoop fs -df -h
    Filesystem               Size   Used  Available  Use%
    hdfs://hadoop01:54310  10.6 G  184 K      5.1 G    0%
  • hbase.cluster.distributed : Fully distributed 모드로 구축하기 위해서 true를 설정했다.
  • hbase.zookeeper.quorum : zookeeper quorum 설정을 한다.
  • dfs.replication : 복제 갯수를 설정한다. 기본은 3 이다.
  • hbase .zookeeper.property.clientPort : zookeeper 클라이언트 포트. 기본은 2181이다.
이 설정을 모든 노드에 복사한다.

habase-env.sh

$HBASE_HOME/conf에 있다. HBASE_MANAGES_ZK 와 HBASE_PID_DIR 를 설정했다.
export HBASE_MANAGES_ZK=false
export HBASE_PID_DIR=/home/yundream
  • HBASE_MANAGES_ZK : true로 설정하면, hbase가 직접 zookeeper 인스턴스를 관리한다. 이미 zookeeper를 (메뉴얼하게)운용하고 있기 때문에 false로 설정했다.
  • HBASE_PID_DIR : 왠지 중복 느낌이 난다.
모든 노드에 이 설정을 복사한다.

regionservers

Region은 HBase 에서의 기본단위로, 이것을 이용해서 수평 확장을 한다. 테이블들은 각 Region에 분산되서 저장이 된다. 처음에는 하나의 Region만 있지만, row가 추가되서 충분히 커지면, 다른 region server 들로 분산된다.
hadoop01
hadoop02
hadoop03

safemode leave

hdfs의 safemode를 떠난다. 처음에 이거 때문에 좀 헤맸다.
# hadoop dfsadmin -safemode leave

hbase master 실행

hbase를 실행하자.
$ start-hbase.sh 
현재 상태를 보자. hadoop01 즉 마스터노드의 상태다.
$ jps 
31713 NodeManager
31425 SecondaryNameNode
32146 HMaster
32306 HRegionServer
31579 ResourceManager
1773 Jps
31087 NameNode
hadoop02, hadoop03 노드의 상태다.
$ jsp
9697 Jps
8786 DataNode
9103 HRegionServer

HBase 기능 확인

hbase shell을 이용해서 잘 작동하는지 확인해 보자.
$ hbase shell
hbase(main):001:0> list
TABLE
0 row(s) in 0.3120 seconds
=> []

hbase(main):002:0> status
1 active master, 0 backup masters, 3 servers, 0 dead, 0.6667 average load

테이블이 잘 만들어지는지 테스트해보자. create 문법이다.
create '<table name','<column family>'
테이블 이름은 emps이고 "personal data"와 "professional data" 두 개의 컬럼패밀리를 만들어봤다.
hbase(main):003:0> create 'emps', 'personal data', 'professional data'
0 row(s) in 1.3470 seconds

=> Hbase::Table - emps
hbase(main):004:0> list
TABLE 
emps
1 row(s) in 0.0190 seconds

=> ["emps"]
hbase shell을 이용해서 데이터 입/출력 테스트를 진행했다. put메서드를 이용해서 데이터를 입력했다. put 명령의 형식은 아래와 같다.
put ’<table name>’,’row1’,’<colfamily:colname>’,’<value>’
몇개 데이터를 입력했다.
hbase(main):010:0> put 'emps', '1', 'personal data:name', 'yundream'
0 row(s) in 0.1430 seconds
hbase(main):011:0> put 'emps', '1', 'personal data:city', 'seoul'
0 row(s) in 0.0160 seconds
hbase(main):015:0> put 'emps', '1', 'professional data:designation', 'manager'
0 row(s) in 0.0230 seconds
hbase(main):016:0> put 'emps', '1', 'professional data:salary', '50000'
0 row(s) in 0.0140 seconds
scan을 이용해서 데이터를 읽었다.
hbase(main):018:0> scan 'emps'
ROW                              COLUMN+CELL
 1                               column=personal data:city, timestamp=1493549649430, value=seoul
 1                               column=personal data:name, timestamp=1493549630369, value=yundream
 1                               column=professional data:designation, timestamp=1493558408019, value=manager 
 1                               column=professional data:salary, timestamp=1493558423673, value=50000
1 row(s) in 0.0390 seconds
get을 이용해서 특정 row를 읽을 수 있다.
hbase(main):019:0> get 'emps', '1'
COLUMN                           CELL
 personal data:city              timestamp=1493549649430, value=seoul
 personal data:name              timestamp=1493549630369, value=yundream
 professional data:designation   timestamp=1493558408019, value=manager
 professional data:salary        timestamp=1493558423673, value=50000
4 row(s) in 0.0260 seconds

참고