HBase 테이블에서 일정 기간이 지난 데이터를 매월 뽑아 S3 호환 스토리지에 보관한다. 원본 삭제는 별도 정책으로 두고, 우선 추출만 안정적으로 돌린다.
| 방식 | 내용 | 적합한 상황 |
|---|---|---|
Export MapReduce + 타임스탬프 범위 |
셀 타임스탬프 기준으로 구간을 잘라 SequenceFile 로 추출 | 표준적이고 구현이 단순하다 |
스냅샷 + ExportSnapshot |
시점 전체를 HFile 째 복사 | 전체 백업. 기간 추출에는 맞지 않는다 |
Hive/Impala 매핑 후 INSERT ... SELECT |
매핑 테이블을 읽어 Parquet 으로 저장 | 분석용 포맷이 필요할 때 |
| 컬럼 패밀리 TTL | 기간이 지나면 자동 만료 | 삭제 정책. 추출과 반드시 순서를 맞춰야 한다 |
TTL 로 자동 삭제를 함께 쓴다면 추출 작업이 삭제보다 먼저 돌아야 한다. major compaction 이 만료분을 물리적으로 지운 뒤에는 되살릴 수 없다.
Export 는 선택적 인자로 버전 수, 시작 시각, 종료 시각을 받는다. 시각은 epoch milliseconds 이며 셀 타임스탬프와 비교한다.
hbase org.apache.hadoop.hbase.mapreduce.Export \
<table> <outputdir> [versions] [starttime] [endtime]
#!/bin/bash
set -euo pipefail
TABLE="mytable"
S3_PATH="s3a://my-archive/hbase/${TABLE}"
MAPPERS=20
START_TS=0
END_TS=$(( $(date -d "6 months ago" +%s) * 1000 ))
OUT_PATH="${S3_PATH}/$(date +%Y-%m)"
echo "[INFO] table=${TABLE} range=${START_TS}~${END_TS} out=${OUT_PATH}"
hbase org.apache.hadoop.hbase.mapreduce.Export \
"${TABLE}" "${OUT_PATH}" "${MAPPERS}" "${START_TS}" "${END_TS}"
date -d "6 months ago" +%s 는 초 단위이므로 1000 을 곱해 밀리초로 맞춘다. GNU date 가 아닌 환경에서는 이 옵션이 없으므로 python3 -c 등으로 계산한다.
출력 경로에 s3a:// 를 직접 주면 MapReduce 가 S3 로 쓴다. 자격증명은 명령줄이 아니라 core-site.xml 또는 자격증명 공급자에 둔다.
<property>
<name>fs.s3a.endpoint</name>
<value>https://minio.example.net</value>
</property>
<property>
<name>fs.s3a.path.style.access</name>
<value>true</value>
</property>
<property>
<name>fs.s3a.access.key</name>
<value>${ACCESS_KEY}</value>
</property>
<property>
<name>fs.s3a.secret.key</name>
<value>${SECRET_KEY}</value>
</property>
MinIO 등 S3 호환 스토리지는 path.style.access 를 켜야 버킷 접근이 된다. 대용량이면 HDFS 에 먼저 쓰고 distcp 로 옮기는 편이 재시도 제어가 쉽다.
Export 결과는 SequenceFile 이므로 그대로는 분석 도구에서 읽기 어렵다. 장기 보관 포맷을 Parquet 으로 가져가려면 Hive/Impala 매핑 테이블을 거쳐 변환한다.
RowKey 에 날짜가 들어 있는 설계라면 타임스탬프 범위 대신 RowKey 범위 스캔이 훨씬 싸다. 이 경우 Export 대신 scan 범위를 지정하는 MapReduce 잡이나 Spark 잡을 쓴다.
기간 추출은 셀 타임스탬프를 기준으로 하므로, 적재 시 타임스탬프를 직접 지정하지 않는 파이프라인에서는 "적재 시각"이 기준이 된다. 업무상 기준일과 다르면 결과가 어긋나므로 설계 단계에서 확인한다.