스키마 드리프트를 수용하면, Tanzu Greenplum에서도 데이터가 어떻게 변하든 원활한 Parquet 쿼리가 가능하다.

발행: (2026년 6월 17일 PM 10:00 GMT+9)
11 분 소요

출처: VMware 블로그

A data lake 은 고정된 스냅샷이 아니라 생동하는 아카이브 입니다. 1월 말에 작성된 파일과 12월 말에 작성된 파일이 거의 비슷하지 않을 것입니다. 제품이 진화하고 비즈니스가 변하면서 컬럼은 필연적으로 추가되고, 이름 변경되고, 삭제되고, 재배열됩니다. 핵심 질문은: 귀하의 쿼리 엔진이 이와 함께 진화하고 있나요?

전통적인 데이터베이스와 달리, 데이터 레이크는 Parquet 파일에 걸친 스키마 일관성을 강제할 중앙 권한이 없습니다. 이러한 구조적 자유로움은 컬럼 이름, 순서, 가용성이 시간에 따라 극명하게 변하게 만들며, 자동화된 화해가 없으면 조직은 지속적인 쿼리 실패와 부정확한 결과에 노출됩니다.

스키마 드리프트의 실제 비용

스키마 진화는 일상적인 현상이며 더 이상 예외 사항이 아닙니다. 쿼리 엔진이 적응하지 못할 경우, 파티션 간 단일 스키마 불일치가 비용이 많이 발생하는 연쇄 반응을 일으킵니다.

  • Cascading pipeline failures가 다운스트림 데이터 흐름을 중단
  • 테라바이트 규모의历史数据 긴급 재작성
  • 수시간~수일간 핵심 비즈니스 보고서 지연으로 의사결정이 멈춤

대규모 AI, BI 및 lakehouse 아키텍처를 구축하는 조직에게는 스키마 변경 시 페타바이트 수준의 Parquet 데이터를 매번 재작성하는 것은 지속 불가능합니다. 이들은 데이터가 진화해도 중단 없이 원활히 쿼리할 수 있는 플랫폼을 필요로 합니다.

적응력이 필수적인 곳

이 동적 스키마 처리가 특히 중요해진 데이터 집약적이고 고위험 환경은 다음과 같습니다:

  • 스트리밍 인gestion 파이프라인 – 업스트림 데이터 포맷이 즉시 변경
  • IoT 및 텔레메트리 워크로드 – 다양한 예측 불가능한 장치 로그 처리
  • 금융 트랜잭션 시스템 – 규정 및 기능 업데이트에 따른 정확성 요구
  • 멀티 테넌트 SaaS 분석 – 각 고객이 고유한 데이터 형태를 정의
  • AI/ML 피처 스토어 – 모델 학습을 위해 새로운 변수를 지속적으로 통합
  • 장기 보존 아카이브 – 연도 간 레거시 포맷과 현대 포맷 혼합

결국, 현대 분석 팀은 rígid한 데이터 구조에 의해 느려질 수 없습니다. 이들은 스키마 진화에 동적으로 대응하면서 최고의 성능과 신뢰를 유지할 수 있는 솔루션이 필요합니다.

웨어하우스와 레이크하우스 간 격차를 메우는 방법

전통적으로 구조ured 데이터 웨어하우스와 진화하는 데이터 레이크 사이의 간격을 메우려면 엄격한 계약이 필요했습니다. VMware Tanzu Greenplum 은 Platform Extension Framework (PXF) – 고성능 병렬 데이터 이동기 – 를 활용합니다. 이 프레임워크는 AWS S3, Google Cloud Storage, Azure Data Lake 와 같은 외부 객체 스토리지에 쿼리를 가능하게 합니다.

최초 릴리스 이전에는 PXF 가 엄격한 구조적 정합을 기대했습니다. Tanzu Greenplum 테이블 정의가 더 오래된 Parquet 파일에 존재하지 않는 컬럼을 찾으면 쿼리 엔진이 즉시 실패했습니다. 이러한 실패를 피하기 위해 데이터 팀은 비싼 회피책을 강요받았습니다.

  • Historical data 재작성: 수천 GB~페타바이트 규모의 레거시 파일에 빈 컬럼을 삽입하기 위한 대규모 Spark 또는 Hive 작업 실행
  • DDL 증가: 데이터 생성 시점에 따라 동일한 데이터셋에 대한 여러 외부 테이블 관리

이 운영상의 마찰을 제거하기 위해 Tanzu Greenplum 은 PXF 가 현대 파일 포맷과 통신하는 방식을 근본적으로 재정의했습니다.

**The Solution: FILL_MISSING_COLUMNS**

FILL_MISSING_COLUMNS 옵션을 활성화하면, PXF위치 기반 또는 강경한 매핑에서 스마트 이름 기반 조회로 전환합니다.

  • 테이블 정의와 Parquet 파일에 모두 존재하는 컬럼: 정상적으로 읽힘
  • VMware Tanzu Greenplum 에 정의되어 있지만 Parquet 파일에 없는 컬럼: PXF 가 해당 파일Rows에 대해 자동으로 NULL 로 채우고, 오류 없이 파이프라인이 중단되지 않음

FILL_MISSING_COLUMNS 인가? (FILL_MISSING_FIELDS 대신)

Tanzu Greenplum 의 기존 COPY 프레임워크는 FILL_MISSING_FIELDS 를 사용하지만, 이 옵션은 텍스트/CSV 포맷에만 적용되며 행末尾에 있는 trailing 컬럼만을 처리합니다. PXF 의 새 FILL_MISSING_COLUMNS 파라미터는 테이블 정의 어디에 있든 Parquet 파일에 없는 컬럼에 대해 이름 기반으로 NULL 을 삽입합니다.

작동 방식

사용자가 시간이 지나면서 누적된 Parquet 파일 폴더가 있지만, 오래된 파일에는 최신 파일에 존재하는 모든 컬럼이 포함되지 않는 상황을Consider 해 보겠습니다.

2022/  -> id, ts, user_id, action
2023/  -> id, ts, user_id, action, region
2024/  -> id, ts, user_id, action, region, cost
  • 스키마 진화 없음: 쿼리 결과가 반환되지 않음
  • 스키마 진화 있음: 쿼리는 성공하고, region 컬럼이 없었던 2022 파티션은 NULL 로 채워져 반환됩니다.

The Foreign Table

CREATE FOREIGN TABLE events(
id BIGINT,
ts TIMESTAMP, 
user_id INTEGER,
action TEXT,
region TEXT,
cost NUMERIC) 
SERVER s3_server 
OPTIONS ( 
resource 'data/events/', 
format 'parquet',
fill_missing_columns 'true' -- Enable schema flexibility 
);

위 SQL 은 Tanzu Greenplum Foreign Data Wrapper (FDW) 문법을 사용해 외부 디렉터리를 테이블과 연결합니다. 자세한 DDL 업데이트는 구문 설명을 참고하십시오.

  • 대상 스키마: 사용자는 id, ts, user_id, action, regioncost 총 6개의 컬럼으로 구성된 테이블 정의를 합니다(예: regioncost 는 최근에 추가된 컬럼).
  • FDW 연결: SERVER s3_server 는 Tanzu Greenplum 이 PXF Java 엔진에게 heavy lifting을 위임하도록 지시합니다.
  • 마법 파라미터: OPTIONS 절에 fill_missing_columns 'true' 를 넣어 스키마 유연성을 활성화합니다.

작동 방식: 이는 PXF 에게 “이 디렉터리 안의 Parquet 파일을 열고 ‘region’ 혹은 ‘cost’ 컬럼이 없으면 panic 하지 마라. 오류를 발생시키지 말고, 파일 안에 해당 컬럼이 있은 듯이(NULL 로 가득 채워진) 동작하게 하라”는 명시적 지시입니다.

동기 부여된 사용자 쿼리

SELECT id, ts, user_id, action, region
FROM events
WHERE ts >= '2022-01-01';

PXF 가 모든 일치하는 파티션을 S3에서 스캔

resource 'data/events/' 는 디렉터리를 가리키므로, PXF 는 해당 아래에 있는 모든 Parquet 파일을 스캔합니다. S3 레이아웃 예시:

s3://your-bucket/data/events/
├── year=2022/   ← Parquet 파일 (region 컬럼 없음)
├── year=2023/   ← Parquet 파일 (region 컬럼 존재)
└── year=2024/   ← Parquet 파일 (region 컬럼 존재)

ts >= '2022-01-01' 은 모든 세 파티션을 아우르며, PXF 는 모두 읽습니다.

스키마 불일치 문제

파티션region 컬럼 존재 여부 (fill_missing_columns 적용)
year=2022❌ 없음 → QUERY FAILS (❌)
✅ NULL 로 대체 (✅)
year=2023✅ 있음 → 값 반환 (✅)
year=2024✅ 있음 → 값 반환 (✅)

전역 구성 (클러스터 전체 기본값)

여러 Parquet 테이블을 관리하고 매 DDL 스크립트에 파라미터를 추가하고 싶지 않다면, 모든 Greenplum 클러스터의 Parquet 테이블에 대해 기본적으로 이 동작을 적용할 수 있습니다.

Step 1: pxf-site.xml 파일 업데이트

PXF 코디네이터 노드에 로그인하여 전역 사이트 구성 파일인 pxf-site.xml 을 엽니다.

(이후 내용은 사용자 메시지에 누락되었습니다.)

0 조회
Back to Blog

관련 글

더 보기 »