본문 바로가기
Big Data

[Big Data] HBase 핵심 개념과 실무 사용법 정리

by SeungyubLee 2025. 12. 11.

※ HBase란?

HBase는 Hadoop 기반 분산 NoSQL 데이터베이스로, 초대규모 데이터를 빠르게 저장하고 조회하는 데 강점을 가진다.

· 수평 확장 우수
· RowKey 기반 정렬
· 컬럼 패밀리 기반 저장
· 실시간 메트릭/로그 저장에 최적
· SQL이 아닌 put/get/scan/delete 기반
HBase를 잘 쓰려면 RowKey 설계와 scan을 이해해야 한다.

 

HBase 데이터 모델 구조

HBase는 RDBMS와 구조가 완전히 다르다.

요소 설명
RowKey 정렬 + 파티션 기준 (가장 중요)
Column Family (CF) 논리적 컬럼 그룹 (생성 시 고정)
Qualifier CF 아래 동적으로 생성되는 컬럼
Timestamp Cell 버전 (Update는 버전 추가)
Cell RowKey + CF + Qualifier + Timestamp + Value

 

즉, RowKey가 곧 데이터 정렬의 기준이며 HBase 성능의 핵심이다.

 

RowKey 설계 - 사실상 HBase의 모든 것

RowKey 설계는 HBase 성능과 조회 방식을 결정짓는다.

 

▶ Timestamp 기반 RowKey

20251211153000|redis01
epochMillis|instanceId
reversedTimestamp|instance

장점 : 최신 데이터 조회가 빠름, REVERSED = 최신순처럼 작동, 범위 스캔 용이

 

Prefix + Timestamp

redis01|20251211|metricId

특정 서버/인스턴스별 조회에 효과적

 

Salting (Hotspot 방지)

03|20251211153000|instanceA
hash(host)%10|timestamp

대량의 write(put) 분산에 도움

 

피해야 할 RowKey 패턴

3028410800002716202506100243
random_abc_202512
STG_row_0001

문제점 : 최신 데이터 조회 불가, REVERSED 무의미, 범위 검색 어려움, 필터 사용 비용 증가

 

HBase Shell 기본 명령어

HBase 접속

hbase shell

 

테이블 목록

list

 

테이블 구조 확인

describe '테이블명'

 

데이터 샘플 조회

scan '테이블명', { LIMIT => 숫자 }
-- Row 수가 아닌 RowKey 수를 의미

 

단일 Row 조회

get '테이블명', 'RowKey값'

 

scan (조회) 옵션 정리

STARTROW / STOPROW - RowKey 범위 지정 조회

scan '테이블명', {
  STARTROW => 'RowKey의 앞부분(prefix)',
  STOPROW  => 'RowKey의 앞부분(prefix)'
}

 

LIMIT - RowKey 수 제한 조회

scan '테이블명', { LIMIT => 숫자 }

 

COLUMNS - 특정 컬럼값만 조회

scan '테이블명', {
  COLUMNS => ['cf:컬럼값'] -- FILTER => "QualifierFilter(=, 'binary:컬럼값')" 옵션과 같이 쓰면 더 좋음
}

 

REVERSED - RowKey 역순 조회

scan '테이블명', { REVERSED => true, LIMIT => 숫자 }
-- RowKey가 Timestamp 기반일 때만 최신순처럼 보임

 

FILTER - 조건 필터 조회

 

RowKey 패턴 필터 조회

scan '테이블명', {
  FILTER => "RowFilter(=, 'regexstring:.*202512.*')" -- 202512는 RowKey 값 중 일부
}

 

특정 컬럼값만 필터 조회

scan '테이블명', {
  FILTER => "QualifierFilter(=, 'binary:컬럼값')" -- COLUMNS => ['cf:컬럼값'] 옵션과 같이 쓰면 더 좋음
}

 

여러가지 필터 조회

scan '테이블명', {
  FILTER =>
  "RowFilter(=,'regexstring:.*202512.*') AND QualifierFilter(=,'binary:컬럼값')"
}
scan '테이블명', {
  FILTER =>
    "RowFilter(=, 'regexstring:.*202512.*') AND QualifierFilter(=, 'binary:컬럼값')",
  LIMIT => 숫자,
  REVERSED => true
}

 

옵션 종합 조회

scan '테이블명', {
  STARTROW => '...',                         -- 스캔 시작 RowKey (이 값 이상부터 조회)
  STOPROW  => '...',                         -- 스캔 종료 RowKey (이 값 "직전"까지 조회, STOPROW는 포함되지 않음)
  COLUMNS  => ['cf:컬럼값1', 'cf:컬럼값2'],   -- 특정 컬럼값만 조회 (출력되는 컬럼을 제한)
  FILTER   => "필터들",                      -- RowFilter, QualifierFilter, ValueFilter 등 사용
  LIMIT    => 10,                            -- RowKey 10개까지만 조회
  REVERSED => true,                          -- RowKey 기준 역순 조회 (RowKey가 Timestamp 기반일 때만 최신순)
  RAW      => true,                          -- tombstone(삭제 마킹) 포함한 raw cell까지 출력 (디버깅용)
  VERSIONS => 1                              -- 조회할 버전 개수 (1 = 가장 최신 버전만 조회)
}

 

INSERT/UPDATE/DELETE

HBase는 SQL이 아니다.

따라서 INSERT/UPDATE/DELETE 명령이 없지만, 대응되는 기능은 존재한다.

 

INSERT = put

put 'RedisLOG', 'rowKey', 'cf:metric', '123'

 

UPDATE = put

put 'RedisLOG', 'rowKey', 'cf:value', '100'
put 'RedisLOG', 'rowKey', 'cf:value', '200'

 

DELETE = delete/deleteall

delete 'RedisLOG', 'rowKey', 'cf:metric'
deleteall 'RedisLOG', 'rowKey'
-- 즉시 제거가 아니라 tombstone 후 compaction에서 실제 삭제됨