pile·
DB / 데이터·spotify-engSpotify Engineering·

데이터 레이크 온라인 포인트 쿼리 인덱싱 — RAP

Spotify 엔지니어링이 페타바이트 규모 데이터 레이크(GCS)에 저장된 Parquet 파일에서 한 자릿수 밀리초 레이턴시로 포인트 쿼리를 수행하는 RAP(Random Access Parquet) 방식을 공개했다. Trino·BigQuery 같은 분산 SQL 엔진은 단일 행 조회도 스케줄링·플래닝 비용으로 수 초가 걸리지만, RAP는 외부 인덱스로 키→(파일, 행 번호)를 직접 매핑해 의존적 read chain을 병렬화함으로써 이 문제를 해결했다. 기존 KV 스토어(Bigtable)와 달리 GB당 비용이 클라우드 스토리지 read 수준에 불과해 장기 이력 데이터나 롱테일 피처도 인터랙티브 조회 대상이 된다.

핵심 포인트
  • 전통적 Parquet 조회는 footer fetch → row group 파싱 → key 스캔 → page 위치 순서의 의존적 read chain으로 레이턴시가 누적된다.
  • RAP는 키를 파일·행 번호에 직접 매핑하는 외부 인덱스로 이 chain을 끊고 인덱스 조회·페이지 매핑·ranged read를 병렬 실행한다.
  • 정렬·해시 버켓팅·co-grouping으로 동일 키 데이터를 인접 배치해 읽는 바이트를 최소화한다.
  • ZSTD frame reset과 스토리지 블록 정렬, 컬럼 인터리빙으로 read 횟수 자체를 줄인다.
  • covering index(호이스트 값)로 소형 값을 인덱스 엔트리에 직접 저장해 스토리지 read를 완전히 제거한다.
  • KV 스토어 대비 비용이 낮아져 AI 에이전트가 레이크의 수개월·수년치 데이터에 실시간 접근 가능해진다.
상세 정리
  • 문제 배경: Spotify는 온라인 서비스용 데이터를 Bigtable 같은 KV 스토어에, 분석용은 GCS 데이터 레이크에 이중으로 저장한다. 클라우드 스토리지 자체 레이턴시는 이미 한 자릿수 ms지만, 쿼리 엔진 오버헤드가 병목이었다.
  • 핵심 병목: Parquet 파일 읽기는 footer → row group 메타데이터 → key 컬럼 스캔 → page 위치 순으로 의존적 read chain이 발생해 단계마다 레이턴시가 쌓인다.
  • RAP 동작 원리: 외부 인덱스가 각 키를 file(딕셔너리 인코딩)과 row numbers에 직접 매핑한다. 인덱스 조회·캐시된 페이지 매핑·ranged read가 의존성 없이 병렬 실행된다.
  • 인덱스 구조: 멀티맵 형태로 엔트리마다 key, file, row numbers, 선택적 value count(페이지네이션)를 저장한다. 페타바이트 인덱싱 시 테라바이트급 인덱스가 생성된다.
  • 키 집중화: 키 기준 정렬로 동일 키 행을 연속 배치해 최소 페이지로 압축한다. 해시 버켓팅은 키를 특정 파일에 결정론적으로 매핑하고, co-grouping은 스키마를 user_id + ARRAY_AGG(값)로 재구성해 sort order 의존을 제거한다.
  • 바이트 절감 - one page per key: 키 경계마다 page를 flush해 페이지 전체가 해당 키 소유가 되므로 row 추출이 불필요하다.
  • 바이트 절감 - ZSTD frame reset: 각 키의 행을 독립 ZSTD 프레임으로 압축하고 바이트 오프셋과 크기를 인덱스에 저장해 별도 페이지 인덱스를 제거한다.
  • 바이트 절감 - 스토리지 정렬: ZSTD skippable frame으로 키 사이를 스토리지 블록 경계(4KB/16KB)에 맞춰 패딩해 불필요한 블록 읽기를 방지한다.
  • read 횟수 절감 - Blob/Variant: 필요 필드를 JSON·Protobuf·Parquet Variant 단일 컬럼으로 통합해 파일당 read를 1회로 줄인다.
  • read 횟수 절감 - 컬럼 인터리빙: 여러 컬럼 데이터를 키 단위로 물리적 인접 배치한다(key1-colA, key1-colB, key2-colA, key2-colB 순). ZSTD skippable frame이 컬럼 간 브리지 역할을 하며 하위 호환성을 유지한다.
  • covering index: 소형 값과 사전 계산된 집계(이벤트 수, 총 재생 시간)를 인덱스 엔트리에 직접 내장해 스토리지 read를 완전히 제거한다.
  • 보조 인덱스: 구매자/판매자 ID처럼 복수 차원 조회 시 동일 인덱스 엔트리에 해시 테이블(O(1) 정확 조회)·정렬 인덱스(범위 쿼리)를 선택해 추가할 수 있다. 보조 인덱스 추가·제거는 서빙 레이어만 변경하면 된다.
  • 경제적 임팩트: KV 스토어는 GB당 비용 때문에 저장 데이터를 선별해야 했지만, RAP는 클라우드 스토리지 read 비용만 발생해 장기 이력·롱테일·저빈도 피처도 인터랙티브 조회 대상이 된다.
왜 읽나대용량 데이터 레이크 위에서 인터랙티브한 포인트 쿼리를 구현해야 하는 데이터 엔지니어·백엔드 엔지니어에게 Parquet 구조 최적화부터 외부 인덱싱 설계까지 실전 레퍼런스를 제공한다.
spotify-eng
Spotify Engineering 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. DB / 데이터·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    데이터 통합— MongoDB 원칙으로 document를 통합하고 동기화를 재설계하다 (3/3)

    여기어때 전시개발팀은 ES 단일 대문서 → MongoDB v1 RDB 1:1 파편화 → v2 도메인 단위 통합이라는 세 차례 구조 전환을 거쳐 전체 동기화 시간을 약 1시간에서 10분으로 단축했다. 이 글은 3부작의 마지막으로, v2 통합 문서 구조에 맞춰 "$set/$unset 필드 단위 부분 갱신 + 이벤트 발행" 기반 동기화를 어떻게 재설계했는지 구체적인 MongoDB 패턴과 함께 설명한다.

    #denormalization#data-sync#mongodb+2
  2. DB / 데이터·pinterest-engPinterest Engineering·

    Pinterest 차세대 DB 수집 프레임워크의 자동화된 스키마 진화

    Pinterest의 CDC 기반 DB 수집 파이프라인은 MySQL에서 Kafka, Flink, Spark, Iceberg를 거치는 다층 구조다. 스키마 변경이 생기면 모든 계층을 동시에 업데이트해야 해 드리프트, 배포 실패, 데이터 불일치가 반복됐다. Pinterest 엔지니어링 팀은 이를 해결하기 위해 가산적 변경만 자동화하는 스키마 진화 프레임워크를 구축하고, PR 기반 롤아웃과 SLA 기반 일관성 모델을 도입했다.

    #data-pipeline#apache-flink#cdc+2
  3. DB / 데이터·aws-architectureAWS Architecture·

    Amazon SageMaker Unified Studio로 금융 분석 인프라 현대화하기

    인도 교육대출 핀테크 Avanse Financial Services가 기존 외부 분석 애플리케이션의 4시간 배치 동기화 병목을 Amazon SageMaker Unified Studio 기반 레이크하우스 아키텍처로 30분 미만으로 단축한 마이그레이션 사례다. 라이선스 비용 완전 제거, S3 인텔리전트 티어링 비용 자동 최적화, 사용량 기반 서버리스 과금 모델로 전환했다.

    #data-migration#emr#data-lake+2