
※ 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에서 실제 삭제됨