HBase

Q·2022년 11월 29일

Hadoop 완벽 가이드

목록 보기
13/13

13장 HBase

1. HBasics

  • HBase는 HDFS에 구현한 분산 컬럼 기반(distributed column-oriented) 데이터베이스.
  • 클러스터 관리는 주키퍼를 이용한다.
  • 대규모 데이터셋을 실시간으로 랜덤 엑서스가 필요할 때 사용할 수 있는 하둡 응용프로그램.
  • 대표적인 사례: 웹테이블(Webtable)
    • 수집된 웹페이지와 웹페이지URL을 키로 하는 속성 테이블(언어와 MIME타입같은)
    • Row 개수만 10억 개가 넘을 정도로 크다.
    • 웹테이블 상에서 batch로 파싱 및 분석용 맵리듀스 잡이 계속 실행되어 통계정보가 만들어진다.
    • 검증된 MIME타입과 해석된 텍스트 내용의 새로운 컬럼이 추가되며
    • 나중에 검색엔진에 의해 indexing 된다.

배경

  • 구글의 Bigtable(구조화된 데이터용 분산 스토리지 시스템)을 모델로 함.
  • HBase의 실 서비스 사용자 : 어도비, 스텀블 어폰, 트위터, 야후 등

2. 개념

짧은 데이터 모델 여행

  • 애플리케이션은 데이터를 테이블에 저장한다.
  • 테이블은 로우와 컬럼으로 만들어진다.
  • 테이블 셀은 버전관리된다.(오직 셀들만 버전관리됨)
    • 셀 생성 시점에 HBase에 의해 자동 할당된 TimeStamp다.
  • 셀의 내용은 바이트 배열이다.
  • 테이블 로우 키도 바이트 배열이다.
    • 문자열, 정수 바이너리, 직렬화된 데이터 구조까지 어떤 것도 로우키가 될 수 있음
  • 테이블 로우는 주 키인 로우 키에 의해 정렬됨.
    • 기본적으로 바이트 순 정렬
    • 모든 테이블 접근은 테이블의 주 키를 통해서 이루어진다.
  • 로우의 컬럼은 column family로 그룹 지어진다.
  • Column Family
    • 컬럼패밀리 멤버는 동일한 접두사를 갖는다.
      e.g. temperature:air, temperature:dew_point는 temperature컬럼 패밀리 멤버다.
      station:identifier는 station 패밀리에 속한다.
    • 컬럼패밀리 접두사는 반드시 표시할 수 있는 문자로 구성되어야 함.
    • 뒷부분의 임의의 바이트로 구성할 수 있음.
    • 테이블 스키마에서 정의의 한 부분을 먼저 지정되어야 한다.
    • 새로운 컬럼패밀리 멤버는 동적으로 추가할 수 있다.
      e.g. 컬럼패밀리 station이 대상 테이블에 이미 존재한다면
      클라이언트는 새 컬럼 station:address를 업데이트 과정 일부처럼 추가할 수 있으며 컬럼값도 저장된다.
    • 모든 컬럼패밀리 멤버는 물리적으로 파일시스템에서 함께 저장된다.
    • 튜닝과 스토리지 명세가 컬럼패밀리 수준에서 이루어진다.

리전

  • 테이블은 HBase에 의해 Region으로 자동 수평 분할된다.
  • 초기에 테이블은 단일 리전으로 구성되지만 리전의 크기가 증가하여
    크기 임계값을 넘어가면 로우를 경계로 대략 비슷한 크기의 두 개의 새로운 리전으로 분할된다,
  • 테이블이 커지면 리전 개수도 증가한다.
  • 리전은 HBase 클러스터 상에서 분산되는 단위이다.

락킹

  • 로우 업데이트는 단일 접근이다. 이로 인해 locking모델의 단순함이 유지될 수 있다.

구현

HBase Master node
  • HBase Master 노드가 하나 이상의 Resion Server Slave를 조율한다.
  • HBase Master는 최초 설치를 하도록 부트스트래핑 역할 수행
  • 리전을 등록된 리전서버에 할당
  • 고장 난 리전서버를 복구해 준다.
Region Server
  • 0 또는 1개 이상의 리전을 가지며, 클라이언트의 읽기/쓰기 요청을 처리한다.
  • 새로운 자식 Region Server에 대해서 Master에게 알려주면서 이전 스플릿을 관리한다.
    • Master가 부모 리전의 offlining과 대체 자식 리전의 할당을 관리할 수 있도록 하기 위함.
      @ offlining - 유지보수나 기타 목적으로 서비스하는 테이블을 중단시키는 작업(opp. onlining)
HBase는 ZooKeeper에 의존적이며 ZooKeeper인스턴스를 사용하여 전반적인 클러스터의 상태를 관리한다.
  • 주키퍼 멤버십에 참여한 서버들이 할당 중에 고장 날 경우, 리전들의 할당은 주키퍼를 통해서 중재된다.

환경설정

  • 리전서버 : HBase/conf/regionservers에 열거된 slave node
  • Hadoop conf/slaves에 열거된 datanode, tasktracker와 비슷하다.
  • conf/hbase-site.xml
  • conf/hbase-env.sh

사용 중인 HBase

  • 카탈로그 테이블 - ROOT - 와 .META를 보유한다.
    • 현재 목록, 상태, 클러스터 내에서 활동 중인 모든 리전 정보를 관리한다.
  • ROOT - 테이블
    • .META 테이블 리전 목록을 유지한다.
  • .META 테이블
    • 모든 사용자 공간 리전 목록을 가진다.
    • 리전 네임이 테이블 내 엔트리들의 키로 사용된다.
  • 리전 네임
    • 리전이 속한 테이블 이름
    • 리전의 시작 로우
    • 리전의 생성시간
    • 앞의 모든 요소들의 MD5해쉬값으로 만들어진다.
  • 로우 동작 당 3회 왕복 통신(round-trip) 부담을 줄이기 위해 캐싱해서 임시저장한다.
  • 실패하지 않고 동작할 때까지 클라이언트는 캐싱된 엔트리를 계속 사용한다.
  • 리전이 이동할 경우(실패) 3과 2를 재참조한다.

3. 설치

사전준비

  • JDK 6 이상
  • linux : 1024로 제한된 파일 열기 옵션을 늘려줘야 한다.
    ]$ ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 32832
    max locked memory       (kbytes, -l) 32
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 16000
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 32832
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited

stable 버전
다운로드 http://www.apache.org/dyn/closer.cgi/hbase/
hbase-0.94.0

wget http://ftp.daum.net/apache/hbase/hbase-0.94.0/hbase-0.94.0.tar.gz
tar zxvf hbase-0.94.0.tar.gz
압축을 푸는 것으로 설치 완료!!!

링크 생성
ln -s hbase-0.94.0 hbase

프로파일 수정
.bash_profile

프로파일 적용
source .bash_profile

$ ll conf

합계 28
-rw-r--r-- 1 gurubee gurubee 2746  52 07:21 hadoop-metrics.properties
-rw-r--r-- 1 gurubee gurubee 4355  52 07:21 hbase-env.sh
-rw-r--r-- 1 gurubee gurubee 2250  52 07:21 hbase-policy.xml
-rw-r--r-- 1 gurubee gurubee  983  52 07:21 hbase-site.xml
-rw-r--r-- 1 gurubee gurubee 2070  52 07:21 log4j.properties
-rw-r--r-- 1 gurubee gurubee   10  52 07:21 regionservers

설정
$ ln -s /home/gurubee/apps/hadoop/conf/hdfs-site.xml hdfs-site.xml
$ ll

합계 28
-rw-r--r-- 1 gurubee gurubee 2746  52 07:21 hadoop-metrics.properties
-rw-r--r-- 1 gurubee gurubee 4432  710 20:27 hbase-env.sh
-rw-r--r-- 1 gurubee gurubee 2250  52 07:21 hbase-policy.xml
-rw-r--r-- 1 gurubee gurubee  983  52 07:21 hbase-site.xml
lrwxrwxrwx 1 gurubee gurubee   44  710 20:30 hdfs-site.xml -> /home/gurubee/apps/hadoop/conf/hdfs-site.xml
-rw-r--r-- 1 gurubee gurubee 2070  52 07:21 log4j.properties
-rw-r--r-- 1 gurubee gurubee   10  52 07:21 regionservers

conf설정
hbase-env.sh

export HADOOP_HOME=/home/gurubee/apps/hadoop
export HBASE_CLASSPATH=${HBASE_CLASSPATH}:$HADOOP_HOME/conf

hbase-site.xml

<configuration>
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://tvdev83.blog:9000/hbase</value>
        </property>
        <property>
                <name>dfs.support.append</name>
                <value>true</value>
        </property>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
</configuration>
  • hbase.rootdir은 $HADOOP_HOME/conf/core-site.xml 에 정의한
    fs.default.name과 포트번호를 그대로 따릅니다.

hdfs-site.xml

<property>
  <name>dfs.supprot.append</name>
  <value>true</value>
</property>
<property>
  <name>dfs.datanode.max.xcievers</name>
  <value>4096</value>
</property>

$ rsync -av . gurubee@tvdev84.blog:/home/gurubee/apps/hbase/
$ rsync -av . gurubee@tvdev85.blog:/home/gurubee/apps/hbase/

1) hadoop 구동

$ ./start-all.sh

2) hbase 구동

$ cd $HBASE_HOME
$ ./bin/start-hbase.sh
starting master, logging to /home/gurubee/apps/hbase/bin/../logs/hbase-gurubee-master-tvdev83.blog.out

3) hbase 구동여부 확인

$ ./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> help
명령어 및 shell 사용법에 대하 설명이 출력된다.

http://hbase.apache.org/book/quickstart.html#shell_exercises

4. 클라이언트

Hadoop 처럼 HBase는 자바로 만들어졌다.

맵리듀스

org.apache.hadoop.hbase.mapred - HBase클래스와 유틸리티는 HBase를 원본으로서
그리고 MR작업의 결과 저장소로 사용된다.

  • TableInputFormat : 리전의 경계를 기준으로 Split을 생성. 맵이 하나의 리전에서 수행되도록 전달함.
  • TableOutputForm : 리뷰스의 결과를 HBase에 쓴다.

에이브로, REST, thrift

HBase는 에이브로, REST, thrift의 인터페이스를 포함.
자바 이외의 다른 언어로 개발된 응용프로그램과 상호 작용할 때 유용함.
단, 자바 서버는 HBase 클라이언트의 broker 인스턴스를 관리해야 하고
추가로 요청과 응답을 대행하기 때문에 자바 클라이언트를 직접 사용하는 것보다는 느리다.

6. HBase와 RDBMS

HBase

  • 분산된 컬럼 기반의 데이터 저장 시스템
  • 물리적인 인덱스 부재
    • 로우는 순차적으로 저장되며 각 로우별 컬럼도 순차적으로 저장된다.
    • 인덱스 증가 같은 이슈가 없으며 삽입 성능은 테이블 크기와 무관.
  • 자동 파티셔닝
    • 테이블이 증가하면 자동으로 리전으로 분할되고 모든 가용한 노드 상에서 분산된다,
    • 새로운 노드가 추가되면 리전은 자동으로 re-balancing
  • 범용 하드웨어
  • 장애 대응성
    • 수많은 노드로 구성, 개별 노드는 상대적으로 덜 중요함
  • 배치 처리
    • 맵리듀스 통합은 데이터에 대한 로컬 참조성을 지원하는 완전한 병렬성과 분산작업 가능

참고

1) HBase Schema - http://blog.xebia.fr/2009/11/18/devoxx-jour-1-nosql-avec-hbase/
2) http://wiki.gurubee.net/pages/viewpage.action?pageId=23232556

profile
Data Engineer

0개의 댓글