Materialized Table 소개

Materialized Table 소개

Materialized Table은 Flink SQL에 도입된 새로운 테이블 유형으로, 배치와 스트림 데이터 파이프라인을 모두 단순화하고 일관된 개발 경험을 제공하는 것을 목표로 합니다. Materialized Table을 생성할 때 데이터 신선도(freshness)와 쿼리를 지정하면, 엔진이 자동으로 구체화 테이블(materialized table)의 스키마를 도출하고 지정된 신선도를 달성하도록 데이터 갱신 파이프라인을 생성합니다.

출처: 문서

본문

핵심 개념

Materialized Table은 데이터 신선도(Data Freshness), 갱신 모드(Refresh Mode), 쿼리 정의(Query Definition), 스키마(Schema)라는 핵심 개념을 포함합니다.

데이터 신선도 (Data Freshness)

데이터 신선도는 구체화 테이블의 내용이 기본 테이블의 갱신보다 뒤처질 수 있는 최대 시간을 정의합니다. 신선도는 보장이 아니라 Flink가 충족하려고 시도하는 목표입니다. 구체화 테이블의 데이터는 신선도 목표 내에서 최대한 가깝게 갱신됩니다.

데이터 신선도는 구체화 테이블 생성 시 선택 사항입니다. 지정하지 않으면 시스템은 갱신 모드에 따라 기본 신선도를 사용합니다: CONTINUOUS 모드의 경우 materialized-table.default-freshness.continuous (기본값: 3분), FULL 모드의 경우 materialized-table.default-freshness.full (기본값: 1시간) 입니다.

데이터 신선도는 구체화 테이블의 중요한 속성으로, 두 가지 주요 목적이 있습니다.

  • 갱신 모드 결정. 현재 CONTINUOUS와 FULL 두 가지 모드가 있습니다. 갱신 모드 결정 방법에 대한 자세한 내용은 materialized-table.refresh-mode.freshness-threshold 구성 항목을 참조하세요.
    • CONTINUOUS 모드: 구체화 테이블 데이터를 지속적으로 갱신하는 Flink 스트리밍 작업을 실행합니다.
    • FULL 모드: 워크플로 스케줄러가 주기적으로 Flink 배치 작업을 트리거하여 구체화 테이블 데이터를 갱신합니다.
  • 갱신 빈도 결정.
    • CONTINUOUS 모드에서 데이터 신선도는 Flink 스트리밍 작업의 checkpoint 간격으로 변환됩니다.
    • FULL 모드에서 데이터 신선도는 워크플로의 스케줄링 주기(예: cron 표현식)로 변환됩니다.

갱신 모드 (Refresh Mode)

갱신 모드에는 FULL과 CONTINUOUS 두 가지가 있습니다. 기본적으로 갱신 모드는 데이터 신선도를 기반으로 추론됩니다. 사용자는 특정 비즈니스 시나리오를 위해 갱신 모드를 명시적으로 지정할 수 있으며, 이는 데이터 신선도 추론보다 우선합니다.

  • CONTINUOUS 모드: Flink 스트리밍 작업이 구체화 테이블 데이터를 증분 갱신합니다. 이 데이터의 가시성은 해당 Connector의 동작에 따라 즉시 또는 checkpoint 완료 후가 됩니다.
  • FULL 모드: 스케줄러가 주기적으로 구체화 테이블 데이터의 전체 덮어쓰기를 트리거하며, 데이터 갱신 주기는 워크플로의 스케줄링 주기와 일치합니다.
    • 기본 덮어쓰기 동작은 테이블 수준입니다. 파티션 필드가 있고 partition.fields.#.date-formatter로 시간 파티션 필드 형식이 지정된 경우 파티션 단위로 덮어씁니다. 매번 최신 파티션만 갱신됩니다.

쿼리 정의 (Query Definition)

구체화 테이블의 쿼리 정의는 모든 Flink SQL Queries를 지원합니다. 쿼리 결과는 구체화 테이블을 채우는 데 사용됩니다. CONTINUOUS 모드에서는 쿼리 결과가 구체화 테이블에 지속적으로 갱신되고, FULL 모드에서는 쿼리 결과가 매번 구체화 테이블을 덮어씁니다.

스키마 (Schema)

구체화 테이블의 스키마 정의는 일반 테이블과 동일합니다. 기본 키와 파티션 키를 선언할 수 있습니다. 구체화 테이블의 열 이름과 타입은 해당 쿼리에서 자동으로 추론되며, 사용자가 지정할 수 없습니다.

더 알아보기 (Learn more)