Parquet & Delta

Seohyeon Park·2025년 3월 17일

Parquet.

1. 소개

Parquet은 2013년에 Twitter와 Cloudera가 협력하여 개발한 오픈소스 프로젝트로 시작되었다. Google의 Dremel 논문(2010년)에서 영감을 받아 컬럼 저장 방식으로 설계되어 기존의 Apache AvroRCFile (Record Columnar File) 포맷의 단점을 보완하고자 만들어졌다.

이후 Apache Hadoop의 서브 프로젝트로 편입되면서, 현재는 빅데이터 분석 및 데이터 엔지니어링 분야에서 널리 사용되는 파일 포맷 중 하나가 되고있다.

2. 특징

  • 컬럼 기반 저장(Columnar Storage) 열 기반 특성으로 쿼리 엔진은 개별 열 중 원하는 열만을 골라서 사용이 가능하다.
  • 효율적인 압축 및 인코딩 상대적으로 비슷한 형태를 가지는 같은 열단위로 압축이 이루어져 높은 압축률을 가져갈 수 있다.
  • 무료이며 오픈 소스 파일의 형식
  • 분산 처리 지원

Delta.

1. 소개

Delta Lake는 2019년 Databricks에서 오픈소스로 공개한 프로젝트로, 기존의 Parquet 기반 데이터 레이크의 단점을 보완하기 위해 개발되었다. 전통적인 데이터 레이크는 Schema Enforcement(스키마 강제), ACID 트랜잭션, 데이터 품질 보장 등의 기능이 부족했으며, 이를 해결하기 위해 Delta Lake가 등장했다.

현재는 Linux Foundation의 프로젝트로 관리되며, Apache Iceberg, Apache Hudi와 함께 데이터 레이크의 발전을 이끄는 대표적인 솔루션이 되었다.

2. 구조

Delta Lake는 트랜잭션 로그에 메타 데이터를 저장하고 Parquet 파일에 테이블 데이터를 저장한다.

3. 특징

  1. ACID 트랜잭션 지원

    • Parquet 테이블은 ACID 트랜잭션을 지원하지 않기 때문에 데이터 일관성을 유지하는 데 어려움이 있다. 예를 들어, 대량의 데이터를 Parquet 테이블에 추가하는 중에 클러스터가 중단되면, 부분적으로 작성된 파일이 남아 테이블이 손상될 수 있다. 이러한 손상된 파일은 이후의 읽기 작업에서 오류를 발생시키며, 이를 수동으로 식별하고 삭제해야 한다.
    • Delta Lake는 ACID 트랜잭션을 지원하여 이러한 문제를 방지한다. 클러스터가 쓰기 작업 중간에 중단 되더라도 Delta Lake는 부분적으로 작성된 파일을 무시하여 이후의 읽기 작업이 정상적으로 수행되도록 한다. 이러한 트랜잭션 지원 덕분에 데이터의 무결성과 일관성을 보장할 수 있다.

    ACID 트랜잭션

    ACID 트랜잭션은 데이터베이스 관리 시스템(DBMS)에서 데이터의 일관성과 무결성을 보장하기 위한 핵심 원칙이다. 네 가지 특성을 의미하며, 데이터의 신뢰성을 유지하는 데 필수적인 개념이다.

    1. Atomicity(원자성)
    2. Consistency(일관성)
    3. Isolation(고립성)
    4. Durability(지속성)
  2. 파일 목록 조회 최적화

    • Parquet 테이블에서 데이터를 읽으려면 먼저 모든 파일의 목록을 가져와야 한다. 이러한 파일 목록 조회 작업은 특히 클라우드 환경에서 비용이 많이 들고 시간이 오래 걸릴 수 있다.
    • Delta Lake는 트랜잭션 로그에 모든 파일 경로를 저장하여 이러한 파일 목록 조회 작업을 최적화한다. 이를 통해 대규모 파일이 있는 경우에도 Delta Lake는 Parquet 테이블보다 더 빠르게 데이터를 읽을 수 있다.
  3. 메타데이터 관리

    • Parquet 파일은 각 파일의 푸터에 메타데이터를 저장한다. 따라서 테이블의 메타데이터를 수집하려면 각 파일을 개별적으로 읽어야 하며, 이는 많은 파일이 있을 경우 비효율적이다.
    • Delta Lake는 트랜잭션 로그에 파일 수준의 메타데이터를 저장하여, 쿼리 엔진이 단일 네트워크 요청으로 필요한 메타데이터를 빠르게 가져올 수 있도록 한다. 이를 통해 전체 파일을 읽지 않고도 효율적인 쿼리 최적화가 가능하다.
  4. 데이터 스키핑 및 Z-Ordering

    • Delta Lake는 파일 수준의 메타데이터를 활용하여 쿼리 시 관련 없는 데이터를 효율적으로 건너뛸 수 있다. 이를 통해 쿼리 성능을 크게 향상시킬 수 있다.
    • Delta Lake는 Z-Ordering을 지원하여 유사한 데이터를 물리적으로 근접하게 배치함으로써 다중 컬럼 쿼리 시 성능을 최적화한다. 이러한 데이터 정렬 기법은 특히 대규모 데이터셋에서 쿼리 성능을 크게 향상시킨다.

      Z-Ordering

      Z-Ordering은 데이터 정렬 및 클러스터링 기법으로, 쿼리 성능을 최적화하기 위해 관련된 데이터를 물리적으로 가깝게 저장하는 방식이다. 특히, Delta Lake에서 데이터 파일을 효율적으로 정리하고, 특정 컬럼을 기준으로 쿼리 성능을 향상시키는 데 사용된다.

      1. Z-Ordering의 원리
        Z-Ordering은 Z-Curve(지그재그 곡선) 정렬 방식을 기반으로 한다. 일반적인 정렬 방식은 단일 컬럼 기준으로 데이터를 정렬하지만, Z-Ordering은 다중 컬럼을 기준으로 데이터를 정렬하여 저장한다.
        예를 들어, 국가(나라)와 도시 데이터를 포함하는 테이블을 생각해보자.
      • 기본적으로 국가별 정렬을 하면 같은 나라의 데이터는 가깝게 배치되지만, 도시는 랜덤하게 섞일 수 있다.
      • 반대로, 도시별로 정렬하면 같은 도시의 데이터는 가까워지지만, 국가별로는 섞일 수 있다.
      • Z-Ordering을 적용하면 "국가 → 도시" 순서로 데이터를 정렬하면서도, 같은 나라의 도시는 서로 가까운 위치에 저장된다.
      1. Z-Ordering을 사용하는 이유
        Delta Lake에서 데이터를 저장할 때, 일반적인 정렬 방식만 적용하면 쿼리 성능이 떨어질 수 있다.
        예를 들어, 특정 컬럼을 기준으로 데이터를 필터링할 때, 해당 데이터가 여러 파일에 분산되어 있으면 불필요한 파일 스캔이 많아지고 성능이 저하된다.
        Z-Ordering을 적용하면 관련된 데이터를 같은 블록(파일)에 배치하여 스캔해야 할 파일 개수를 줄일 수 있다.
  5. 행 수준의 삭제 및 업데이트 지원

    • Parquet 테이블에서는 특정 행을 삭제하거나 업데이트하는 것이 어렵다. Delta Lake는 이러한 작업을 지원하여 데이터 관리의 유연성을 높인다.
  6. 변경 데이터 피드(Change Data Feed) 제공

    • Delta Lake는 데이터 변경 사항을 추적하는 기능을 제공하여, 데이터 파이프라인에서 변경된 데이터만을 효율적으로 처리할 수 있도록 한다.

Reference.

profile
카페에서 한줄 한줄

0개의 댓글