아이스버그 테이블 최적화: 정렬, 통계, 삭제 벡터
아이스버그 테이블에 데이터를 쓸 때 정렬을 적용하면 실행 엔진이 매니페스트 파일의 최소/최대 통계를 기반으로 불필요한 파일을 건너뛸 수 있습니다. 정렬이 없으면 파일 간 값 범위가 겹쳐서 엄격한 필터링을 적용해도 모든 데이터를 읽어야 합니다.
정렬 없이 테이블 생성 및 쓰기 예시:
spark.sql("""
CREATE TABLE habr.paper.write_ordered (
id INT,
name STRING,
event STRING
)
USING ICEBERG
""")
data = [(i, f"name_{i}", f"event_{i}") for i in range(1, 1000000)]
df = spark.createDataFrame(data, ["id", "name", "event"]).repartition(16)
df.writeTo("habr.paper.write_ordered").append()
메타데이터를 조회하면 무질서한 범위가 나타납니다:
| id_min | id_max | file_path |
|--------|--------|-----------|
| 2 | 999994 | ... |
| 43 | 999988 | ... |
id < 100000 필터를 적용하면 모든 파일을 읽게 됩니다.
정렬 활성화:
spark.sql("""
ALTER TABLE habr.paper.write_ordered
WRITE ORDERED BY id
""")
재작성 후 순차적 범위를 얻습니다:
| id_min | id_max | file_path |
|--------|--------|-----------|
| 1 | 196479 | ... |
| 196480 | 395983 | ... |
이제 id < 196470 필터는 단 하나의 파일만 읽습니다.
컬럼 통계 수집 구성
아이스버그는 기본적으로 모든 컬럼에 대해 전체 최소/최대/축약 통계를 수집하여 쿼리에는 도움이 되지 않으면서 쓰기 시간을 증가시킵니다. 일반적인 테이블에서는 1-2개 컬럼에만 필터링이 적용되므로 다른 컬럼에 대한 통계는 불필요합니다.
10개 컬럼을 가진 평면 테이블 예시:
spark.sql("""
CREATE TABLE habr.paper.typical_flat_table (
id INT,
name STRING,
col_1 STRING,
col_2 STRING,
col_3 STRING,
col_4 STRING,
col_5 STRING,
col_6 STRING,
col_7 STRING,
col_8 STRING
)
USING ICEBERG
""")
TBLPROPERTIES를 통한 구성:
spark.sql("""
ALTER TABLE habr.paper.typical_flat_table SET TBLPROPERTIES (
'write.metadata.metrics.default' = 'counts',
'write.metadata.metrics.column.id' = 'full',
'write.metadata.metrics.column.col_1' = 'none'
)
""")
- default: 'counts' — 모든 컬럼에 대해 행 수만 수집
- full: 핵심 필터 컬럼(id)에 대해 최소/최대 + 축약 통계
- none: 사용되지 않는 컬럼에 대해 비활성화
이를 통해 주요 필드의 데이터 스킵핑을 잃지 않으면서 쓰기 오버헤드와 메타데이터 용량을 줄일 수 있습니다.
MoR에서의 벡터화된 삭제
병합-읽기 전략에서 읽기 성능은 삭제 적용 메커니즘에 따라 달라집니다. 기존 삭제 파일은 데이터와 조인이 필요합니다.
삭제 파일 유형:
- 동등 삭제: 삭제 규칙(v3에서 더 이상 사용되지 않음)
- 위치 삭제: 파일 내 행 위치
아이스버그 v3에서는 위치 삭제가 삭제 벡터로 발전하여 Puffin 형식을 기반으로 합니다. 삭제 벡터는 데이터 파일에 한 사이클로 적용되는 비트맵 마스크입니다.
위치 삭제 예시:
| file_path | pos |
|-----------|-----|
| ...parquet | 873 |
| ...parquet | 230 |
조인 대신: 비트맵 로드 + 논리 AND 연산. 이로 인해 높은 삭제 비율을 가진 MoR 테이블 읽기 속도가 5-10배 빨라집니다.
삭제 벡터는 특히 다음과 같은 경우에 효과적입니다:
- 빈번한 업데이트가 있는 배치 ETL
- 느리게 변화하는 차원 테이블
- MoR을 사용한 스트리밍
핵심 요약
- 필터링 가능한 컬럼에 WRITE ORDERED BY로 정렬을 적용하면 분석 시 읽을 파일 수가 줄어듭니다.
- write.metadata.metrics.* 구성으로 데이터 스킵핑을 유지하면서 쓰기 오버헤드를 최소화합니다.
- 아이스버그 v3의 삭제 벡터는 위치 삭제를 대체하여 비트맵을 통해 MoR 읽기를 가속화합니다.
- 최적화는 쿼리나 ETL 로직 변경 없이 작동합니다.
- 효과가 누적됩니다: 파일 수 감소, 메타데이터 감소, 객체 스토리지 부하 감소
— Editorial Team
아직 댓글이 없습니다.