Skip to Content
Data EngineeringApache Phoenix를 이용한 시계열(Time-Series) 데이터 HBase 최적화 기법 (ROW_TIMESTAMP)
📊 Data Engineering2017년 5월 25일

Apache Phoenix를 이용한 시계열(Time-Series) 데이터 HBase 최적화 기법 (ROW_TIMESTAMP)

#phoenix#hbase#time-series#data-engineering#flamingo

과거 당사의 빅데이터 플랫폼인 빅데이터 모니터링 플랫폼의 코어 백엔드 저장소는 막강한 쓰기(Write) 능력을 자랑하는 넘버원 하둡 분산 DB인 Apache HBase 였습니다. 하지만 HBase 고유의 무자비한 Byte Array 기반의 복잡한 Filter 코딩을 극복하고, 개발팀에게 익숙한 RDB 형태의 SQL 인터페이스(JDBC)를 제공하기 위해, 그 위에 SQL 스킨 레이어인 Apache Phoenix(피닉스)를 올려 아키텍처를 구성했습니다.

플랫폼가 수집하는 데이터의 핵심은 CPU_USAGE, MEMORY_USED 와 같은 “시계열(Time-series)” 메트릭이었습니다. 문제는, 브라우저 대시보드에서 “최근 15분 간의 로그”를 보여주기 위해 SELECT ... WHERE TIMESTAMP > NOW() - 15MIN 쿼리를 날릴 때마다, 피닉스가 HBase의 무수히 쪼개진 Store File 전체를 Full-Scan 하면서 HDFS의 디스크 I/O를 터트리는 현상이 발생했습니다.

설계 단계의 이런 병목을 원천봉쇄했던 치트키가 바로 Phoenix 4.6부터 지원되기 시작한 파티션 매핑 키워드, ROW_TIMESTAMP 기능입니다.


1. ROW_TIMESTAMP의 핵심 원리와 이점

시계열 데이터 모델링 시 기본 키(PK) 컴포지트에 들어가는 시간(Date/Timestamp) 컬럼에 ROW_TIMESTAMP 속성을 매핑해주면, 피닉스는 이 컬럼의 값을 HBase의 네이티브(Native) 물리 영역인 데이터 셀(Cell)의 내부 타임스탬프 스펙(KeyValue Timestamp) 자체로 연결해 버립니다.

이 연결 고리를 맺었을 때 얻는 막강한 이점은 다음과 같습니다.

  • Min Time Range Scans (Range Skip): HBase는 리전(Region) 단위로 데이터를 나눌 뿐 아니라 내부적으로도 시간 값(TimeRange)의 메타데이터 블럭을 들고 있습니다. 쿼리에서 시간 범위를 치면, 그 시간에 속하지 않은 과거의 HFile(저장파일) 덩어리들을 통째로 Skip 해버립니다.
  • 디스크 블록 전체를 건너뛰는 물리적 인덱싱 효과 덕분에, 전체 테이블을 풀스캔(Full-Scan) 하는 끔찍한 오버헤드를 막고 오직 ‘꼬리표 데이터(최근 데이터)‘만 나노초 단위로 발라낼 수 있습니다.

2. 시계열(TSDB) 기반의 피닉스 테이블 DDL 샘플

플랫폼 엔진 베이스에 실제 적용되었던 것과 유사한, 이벤트 로깅 테이블의 구조 설계안입니다.

sql
-- 1. 이벤트 시간(EVENT_DATE) 변수를 복합키(PK)에 반드시 편입 -- 2. 해당 컬럼 끝에 오직 테이블당 하나만 부여 가능한 ROW_TIMESTAMP 지정 CREATE TABLE PLATFORM_EVENTS_RTS ( EVENT_ID CHAR(15) NOT NULL, EVENT_TYPE CHAR(3) NOT NULL, EVENT_DATE DATE NOT NULL, APPLICATION_TYPE VARCHAR, SOURCE_IP VARCHAR CONSTRAINT PK PRIMARY KEY ( EVENT_ID, EVENT_TYPE, -- 이 컬럼의 Long 값이 HBase put 연산의 순수 Cell Time으로 강제 투입됨 EVENT_DATE ROW_TIMESTAMP ) );

3. 실측 기반 퍼포먼스(Impact) 차이 검증

플랫폼 R&D 검증 랩에서 약 5억 건의 데이터(500 Million Records)를 깔아놓고 조회 성능 테스트를 진행한 결과치입니다. 방금 들어온 따끈따끈한 최신(Tail-end) 데이터의 범위를 조회할 때, 압도적인 차이를 뽐냅니다.

스캔 조건 (Where)ROW_TIMESTAMP 최적화 적용 OROW_TIMESTAMP 최적화 적용 X
과거 데이터 1분 치 조회200 ms (초고속 즉시 리턴)4,000 ms (파일 여느라 딜레이)
과거 데이터 1시간 치 조회2.1 초 (대폭 향상)500 초 (사실상 타임아웃 뻗음)
범위 이탈 엉뚱한 값 조회100 ms (바로 해당 블록 패스)340 초 (끝까지 풀스캔)

⚠️ 주의사항 (Major Compaction 함정)

HBase 클러스터 유휴 시간에 여러 Store File들을 영혼까지 끌어 모아 합쳐버리는 찌꺼기 제거 작업(Major Compaction)이 일어나 버리면, 작은 덩어리들의 메타데이터(TimeRange)가 하나의 그릇으로 섞여버리게 됩니다. 이렇게 되면 HBase 엔진이 타임스탬프 기준으로 특정 블록들을 통째로 Skip 할 수 있는 지표가 뭉개지기 때문에 최적화 속도 이점이 일시적으로 상실(Negated) 되는 맹점이 있으니 튜닝 시나리오 설계 시 유의해야 합니다. (이후 다시 실시간 플러시 파일이 쪼개져 생성되면 원상 복구됨)

Last updated on