← 학습 카테고리

Learn

Spark

84개 모듈 · 현재 60번째

Spark 모듈 60/84 spark-learn-60

Vectorized Parquet Reader — 행 하나씩이 아니라 컬럼 배치 단위로 디코딩하기

Spark foreachBatch 및 Vectorized Parquet Reader 공식 문서 종합 (웹 리서치, 2026) — Databricks 공식 문서(structured-streaming/foreach) + The Internals of Spark SQL(Vectorized Decoding) The Internals of Spark SQL — Vectorized Parquet Decoding

이 모듈을 다 읽으면

  • Vectorized Parquet Reader가 행 단위 디코딩과 다른 방식으로 동작하는 이유를 설명할 수 있다
  • 이 기능이 활성화되는 조건과 배치 크기 설정을 설명할 수 있다

Parquet 인코딩이 컬럼 단위 배치 디코딩에 최적화돼 설계됐다는 점을 활용해, 행을 하나씩 읽고 디코딩하는 대신 여러 행을 컬럼 단위 배치로 묶어 한꺼번에 처리하는 Vectorized Parquet Reader의 동작 방식을 정리한다.

행 단위가 아니라 컬럼 단위 배치로 디코딩

Parquet 인코딩 자체가 컬럼별로 배치 단위로 더 빠르게 디코딩되도록 설계돼 있다. Vectorized Parquet Reader는 이 특성을 살려, 행을 하나씩 읽고 디코딩하는 대신 여러 행을 컬럼 형태의 배치(ColumnBatch)로 묶어 컬럼별로 한 번에 처리한다 — Databricks의 성능 테스트에서는 이 방식이 비벡터화 방식 대비 컬럼 디코딩 속도를 9배 개선했다고 보고됐다.

핵심 포인트

  • Parquet 인코딩은 컬럼별 배치 디코딩에 최적화돼 설계됨 — Vectorized Reader는 행 단위 대신 여러 행을 ColumnBatch로 묶어 컬럼별로 한꺼번에 처리
  • Databricks 성능 테스트 기준 비벡터화 방식 대비 컬럼 디코딩 속도 9배 개선

활성화 조건과 배치 크기 설정

이 기능은 spark.sql.parquet.enableVectorizedReader 설정(기본값 true)이 켜져 있고, 읽어야 할 스키마가 AtomicTypes(원자적 타입, 복잡한 중첩 구조가 아닌 단순 타입)로만 이뤄져 있을 때만 적용된다. 한 번에 묶어 처리하는 배치 크기는 spark.sql.parquet.columnarReaderBatchSize로 조절할 수 있다. 내부적으로는 VectorizedParquetRecordReader가 ColumnBatch와 ColumnVector 인스턴스를 데이터 로딩 과정 내내 재사용해, 매번 새로 객체를 할당하지 않고 메모리 사용량(footprint)을 최소화한다.

핵심 포인트

  • spark.sql.parquet.enableVectorizedReader(기본 true) 활성화 + 스키마가 AtomicTypes로만 구성돼야 적용됨(복잡한 중첩 구조는 대상 밖)
  • 배치 크기는 spark.sql.parquet.columnarReaderBatchSize로 조절, ColumnBatch/ColumnVector 인스턴스를 재사용해 메모리 사용량 최소화