Dremio Cloud로 Apache Iceberg 실습

발행: (2026년 5월 23일 AM 02:19 GMT+9)
11 분 소요
원문: Dev.to

출처: Dev.to

이 글은 15부작 Apache Iceberg 마스터클래스 중 14번째 파트입니다. 13부에서는 스트리밍 접근 방식에 대해 다뤘습니다. 이번 글에서는 Dremio Cloud에서 Iceberg를 실제로 다루는 방법을 단계별로 살펴보며, 테이블 생성, 데이터 적재, 최적화, 시맨틱 레이어 구축, AI 기반 분석까지 다룹니다.

목차

  • 테이블 포맷이란 무엇이며 왜 필요했는가?
  • 현재 테이블 포맷의 메타데이터 구조
  • 성능과 Apache Iceberg 메타데이터
  • 파티션 진화에 대한 기술적 심층 분석
  • 숨겨진 파티션에 대한 기술적 심층 분석
  • Apache Iceberg 테이블에 쓰기
  • Lakehouse 카탈로그란?
  • 임베디드 카탈로그: S3 테이블 및 MinIO AI 스토어
  • Iceberg 테이블 스토리지가 시간이 지남에 따라 어떻게 악화되는가
  • Apache Iceberg 테이블 유지 관리
  • Apache Iceberg 메타데이터 테이블
  • Python 및 MPP 엔진과 함께 Iceberg 사용하기
  • Apache Iceberg 테이블에 스트리밍 데이터 적재
  • Dremio Cloud를 활용한 Iceberg 실습
  • Apache Iceberg로 마이그레이션하기

Dremio Cloud 계정 만들기 (무료 체험 제공)

  1. 클라우드 스토리지 소스(S3, ADLS, GCS)를 Sources 패널을 통해 추가합니다.
  2. 자격 증명과 대상 버킷을 설정합니다.
  3. Dremio는 Iceberg 테이블을 위한 Open Catalog를 자동으로 생성합니다. 이 Polaris 기반 카탈로그는 메타데이터 관리, 접근 제어, 자동 최적화를 담당합니다.
CREATE TABLE analytics.orders (
    order_id BIGINT,
    customer_id BIGINT,
    order_date DATE,
    amount DECIMAL(10,2),
    status VARCHAR,
    region VARCHAR
)
PARTITION BY (day(order_date))

위 구문은 day 단위의 숨겨진 파티션을 가진 테이블을 생성합니다. 사용자는 order_date를 자연스럽게 조회할 수 있으며, 엔진이 파티션 프루닝을 자동으로 수행합니다.

객체 스토리지 파일에서 적재

COPY INTO analytics.orders
FROM '@my_s3_source/raw/orders/'
FILE_FORMAT 'parquet'

다른 테이블 또는 소스에서 적재

INSERT INTO analytics.orders
SELECT * FROM postgres_source.public.orders
WHERE order_date >= '2024-01-01'

Dremio의 Federation 기능을 이용하면 PostgreSQL, MySQL, Oracle, MongoDB, S3 파일 등 다양한 소스에 있는 데이터를 직접 조회할 수 있습니다. 단일 INSERT...SELECT 문으로 데이터를 Iceberg 테이블로 옮길 수 있습니다.

Dremio Columnar Cloud Cache (C3)

C3는 쿼리 엔진 노드에 연결된 로컬 NVMe SSD에 자주 접근되는 Iceberg 데이터를 캐시합니다. 처음 쿼리할 때 해당 컬럼을 로컬에 저장하고, 이후 동일 데이터에 대한 쿼리는 원격 객체 스토리지가 아니라 로컬 SSD에서 읽어 레이턴시를 수백 밀리초에서 십 밀리초 이하로 낮춥니다.

  • 투명하게 동작합니다. 어떤 데이터를 캐시할지 별도 설정이 필요 없으며, Dremio가 접근 패턴을 자동으로 학습해 가장 많이 조회되는 데이터를 캐시합니다.

시맨틱 레이어와 BI 연동

Dremio는 ODBC, JDBC, Arrow Flight 엔드포인트를 통해 Iceberg 데이터를 노출합니다. Tableau, Power BI, Looker, Superset 등 모든 BI 도구가 마치 전통적인 데이터베이스에 연결된 것처럼 Iceberg 테이블을 조회할 수 있습니다. 시맨틱 레이어는 모든 도구에 일관된 거버넌스와 명명 규칙을 제공합니다.

거버넌스가 적용된 SQL 뷰 예시

CREATE VIEW analytics.customer_orders AS
SELECT
    o.customer_id,
    c.customer_name,
    c.region,
    SUM(o.amount) AS total_spend,
    COUNT(*) AS order_count
FROM analytics.orders o
JOIN analytics.customers c ON o.customer_id = c.customer_id
GROUP BY o.customer_id, c.customer_name, c.region
  • 뷰와 테이블에 위키·태그를 추가하면 Dremio UI에서 설명을 달 수 있어 다른 사용자가 데이터를 쉽게 찾고 이해할 수 있습니다. 또한 AI 에이전트가 자연어 질문을 정확한 SQL로 변환할 때 이 메타데이터를 활용합니다.

Dremio Reflections

Reflections는 사전 계산된 물리화 결과물로, 기존 SQL을 수정하지 않아도 자동으로 쿼리를 가속화합니다. 뷰나 테이블에 Reflection을 만들면 Dremio가 결과를 미리 계산해 빠른 스토리지(Optimized Iceberg 테이블)에 저장합니다.

-- 대시보드용 집계 Reflection 생성
ALTER TABLE analytics.customer_orders
  CREATE AGGREGATE REFLECTION customer_orders_agg
  USING DIMENSIONS (region, order_date)
  MEASURES (total_spend SUM, order_count SUM)

쿼리가 Reflection 정의와 일치하면 Dremio는 전체 테이블을 스캔하는 대신 사전 계산된 데이터를 반환합니다. 30초 걸리던 쿼리가 1초 이하로 단축될 수 있으며, 옵티마이저가 자동으로 Reflection을 선택하므로 사용자는 이를 알 필요가 없습니다.

컬럼‑레벨·행‑레벨 보안

시맨틱 레이어에서 직접 접근 제어와 행 필터링을 정의할 수 있습니다.

-- 비권한 사용자에게 PII 마스킹 적용 뷰
CREATE VIEW analytics.orders_masked AS
SELECT
    order_id,
    CASE WHEN is_member('finance_team') THEN customer_name
         ELSE '***MASKED***' END AS customer_name,
    order_date,
    amount
FROM analytics.orders

정의된 거버넌스 정책은 BI 대시보드, Python 노트북, AI 에이전트 등 어떤 도구를 통해 조회하든 일관되게 적용됩니다. 이는 정책을 각 애플리케이션에 중복 구현하는 것보다 유지 보수가 훨씬 용이합니다.

다중 소스와의 연합 쿼리

Iceberg 테이블과 다른 시스템 데이터를 동시에 조회할 수 있습니다.

-- Iceberg 테이블과 PostgreSQL 테이블 조인
SELECT i.order_id, i.amount, p.payment_status
FROM analytics.orders i
JOIN postgres_source.public.payments p
ON i.order_id = p.order_id

데이터를 모두 Iceberg로 옮길 필요 없이 연합(federation)으로 시작하고 점진적으로 마이그레이션할 수 있습니다. 마이그레이션 단계에서 레거시 시스템과 Iceberg 테이블을 나란히 조회하고, 준비가 되면 원본을 교체하면 됩니다.

테이블 최적화 명령

-- 작은 파일 압축
OPTIMIZE TABLE analytics.orders REWRITE DATA USING BIN_PACK

-- 정렬 기반 압축 (파일 스키핑 향상)
OPTIMIZE TABLE analytics.orders REWRITE DATA USING SORT (order_date, customer_id)

-- 오래된 스냅샷 삭제
ALTER TABLE analytics.orders EXPIRE SNAPSHOTS OLDER_THAN = '2024-04-01 00:00:00'

Open Catalog로 관리되는 테이블은 Dremio가 백그라운드에서 자동 최적화를 수행합니다. 컴팩션, 스냅샷 만료, 고아 파일 정리 등을 사용자가 개입하지 않아도 자동으로 처리됩니다.

시점 기반 조회 및 스냅샷 비교

-- 특정 시점의 테이블 조회
SELECT * FROM analytics.orders
AT TIMESTAMP '2024-03-01 00:00:00'

-- 현재 데이터와 이전 스냅샷 비교
SELECT
    current_data.region,
    current_data.total - old_data.total AS growth
FROM (SELECT region, SUM(amount) AS total FROM analytics.orders GROUP BY region) current_data
JOIN (
    SELECT region, SUM(amount) AS total
    FROM analytics.orders AT TIMESTAMP '2024-01-01'
    GROUP BY region
) old_data ON current_data.region = old_data.region

테이블 상태 점검

-- 파일 평균 크기와 파일 수 확인
SELECT AVG(file_size_in_bytes)/1048576 AS avg_mb, COUNT(*) AS files
FROM TABLE(table_files('analytics.orders'))

-- 최근 스냅샷 확인
SELECT committed_at, operation, summary
FROM TABLE(table_snapshot('analytics.orders'))
ORDER BY committed_at DESC LIMIT 5

내장 AI 에이전트 활용

AI 에이전트는 시맨틱 레이어에 달린 위키·태그를 컨텍스트로 삼아 자연어 질문을 SQL로 변환합니다.

  • “이번 분기 총 지출 기준 상위 10명 고객을 보여줘”
  • “지역별 월간 매출 성장률은 어떻게 변했나요?”
  • “지난 달 반품율이 가장 높은 제품은 무엇인가요?”

생성된 SQL은 표준 형태이며, 사용자는 언제든지 해당 SQL을 확인·검증·수정할 수 있습니다. 이는 결과 로직을 숨기는 블랙박스 AI 분석 도구와는 차별점입니다.

MCP Server와 외부 AI 에이전트 연동

MCP(Model Context Protocol) 서버는 Dremio의 데이터 접근을 외부 LLM(Claude, ChatGPT 등)이나 커스텀 에이전트 프레임워크에 노출합니다. 외부 AI는 MCP를 통해 Iceberg 레이크하우스에 질의하고, Dremio

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.