들어가며

이 포스팅에서는 Hbase 로컬 설치 방법과, 로컬 웹 어플리케이션을 띄워서 로컬의 Hbase와 연동하는 방법에 대해 포스팅 할 예정입니다.

설치 환경은 다음과 같습니다.

  1. 맥 요세미티
  2. JDK 1.8
  3. Spring Boot
  4. Intellij

Homebrew install

Homebrew는 맥에서 사용하는 패키지 매니저입니다. 이를 사용하여 Hbase를 설치할 예정입니다. 여기 에서 사용법을 확인하실 수 있습니다만, 설치 방법을 간단하게 옮겨 두겠습니다.

터미널을 열고

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

이 명령어를 입력하시면 Homebrew가 설치됩니다.

install Hbase

Homebrew를 설치하였다면, Hbase를 설치할 차례입니다.

brew install hbase

명령어를 입력하면 Hbase를 설치할 수 있습니다.

setting

이후에는 Hbase 세팅을 진행해야 합니다.

  1. /usr/local/Cellar/hbase/{version}/libexec/conf 으로 이동합니다.
  2. hbase-site.xml을 vi 로 엽니다. Hbase 설정 기본 구성 파일입니다.
  3. 설정을 추가합니다.
<!-- add quorum to localhost-->
<property>
	<name>hbase.zookeeper.quorum</name>
	<value>localhost</value>
</property>
<!-- add znode parent config -->
<property>
	<name>zookeeper.znode.parent</name>
	<value>/hbase-unsecure</value>
</property>
  1. quorum은 Hbase의 클러스터 설정입니다. 이곳에 클러스터로 사용할 node의 주소를 입력하면 되는데요. 로컬에서 스탠드얼론으로 띄울 것이기 때문에, localhost 주소를 입력하겠습니다.
  2. zookeeper는 znode라는 데이터 저장 객체를 가지고 있습니다. 이 설정은 Hbase에서 사용할 Root Znode를 가리키는 설정입니다. hbase-unsecure 로 세팅해줍니다.

/etc/hosts 수정

/ets/hosts 파일에 다음과 같은 값을 추가합니다.

127.0.0.1 localhost

Spirng Boot 설치

JDK 와 Intellij는 깔려 있다고 가정하겠습니다. 메이븐 프로젝트를 하나 생성한 다음에, pom.xml 에 다음과 같은 설정을 추가합니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Application.java

그 후에 java 아래에 hbase 패키지를 생성하고, 그 아래에 Application.java를 생성하겠습니다. Application.java에서는 스프링 부트의 설정을 잡아주고, Hbase 커넥션을 빈으로 생성하는 역할을 합니다.

package hbase;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
 
import java.io.IOException;
 
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
 
	@Bean
	public Connection connect() throws IOException {
		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.property.clientPort", "2181");
		conf.set("hbase.zookeeper.quorum", "127.0.0.1");
		conf.set("zookeeper.znode.parent", "/hbase-unsecure");
		Connection conn = ConnectionFactory.createConnection(conf);
		return conn;
	}
}

main을 실행하면 임베디드 톰캣이 뜨면서 Hbase 아래에 있는 서비스와 컨트롤러를 컴포넌트 스캔으로 읽을 것입니다.

Connect 메서드는 Hbase 클라이언트에서 로컬 Hbase DB에 접근할 수 있게 Baen을 띄워 놓습니다.

사용 예제

앞에서 Hbase DB에 접근할 수 있게 커넥션을 Bean으로 설정하였습니다. 설정한 Bean을 사용하는 코드는 다음과 같습니다.

@Autowired
private Connection connection;
 
...
 
public void addUser(String user, String name, String email, String password) throws IOException {
		TableName tableName = TableName.valueOf(TABLE_NAME);
		// use table as needed, the table returned is lightweight
		Table table = connection.getTable(tableName);
		Put p = mkPut(new User(user, name, email, password));
		table.put(p);
		table.close();
	}

이와 같이 테이블 이름을 가지고 객체를 생성하여, connection.getTable을 호출하여 테이블 객체를 획득할 수 있습니다. 이 테이블 객체를 가지고 로컬 Hbase에 접근하여 데이터를 put, get 할 수 있습니다.