홈으로 돌아가기

Iceberg 최적화: 정렬 및 삭제 벡터

이 기사는 Apache Iceberg 테이블의 최적화를 다룹니다: 데이터 스키핑을 위한 정렬, 컬럼 통계 구성 및 v3에서의 삭제 벡터 전환. Spark 코드 예제와 효율성 지표가 제공됩니다.

Iceberg 최적화: 정렬부터 삭제 벡터까지
Advertisement 728x90

아이스버그 테이블 최적화: 정렬, 통계, 삭제 벡터

아이스버그 테이블에 데이터를 쓸 때 정렬을 적용하면 실행 엔진이 매니페스트 파일의 최소/최대 통계를 기반으로 불필요한 파일을 건너뛸 수 있습니다. 정렬이 없으면 파일 간 값 범위가 겹쳐서 엄격한 필터링을 적용해도 모든 데이터를 읽어야 합니다.

정렬 없이 테이블 생성 및 쓰기 예시:

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()

메타데이터를 조회하면 무질서한 범위가 나타납니다:

Google AdInline article slot

| id_min | id_max | file_path |

|--------|--------|-----------|

| 2 | 999994 | ... |

Google AdInline article slot

| 43 | 999988 | ... |

id < 100000 필터를 적용하면 모든 파일을 읽게 됩니다.

정렬 활성화:

Google AdInline article slot
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

Advertisement 728x90

다음 읽기