Dagster 실무 스터디 가이드

데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약

orchestration asset-based Python DataOps 실무 중심

1. Dagster란?

Dagster는 데이터 애플리케이션을 구축, 실행, 모니터링하기 위한 클라우드 네이티브 데이터 오케스트레이션 플랫폼입니다. 기존의 DAG 스케줄러를 넘어 Asset(자산)을 중심으로 한 개발 경험과 데이터 품질 관리를 제공합니다.

📦 Asset 중심 개발

데이터 파이프라인을 '테이블', '파일', '모델' 같은 실제 데이터 자산 단위로 설계합니다. 코드와 데이터의 관계가 명확해지고, 데이터 계보(Lineage) 추적이 용이합니다.

🔧 개발자 경험 최적화

로컬 개발, 테스트, 디버깅을 위한 강력한 도구를 제공합니다. UI에서 직접 파이프라인을 실행하고, 로그를 확인하며, 실시간으로 모니터링할 수 있습니다.

🛡️ 데이터 품질 내재화

Asset에 대한 검증(Expectation), 테스트, 모니터링을 파이프라인 정의에 직접 포함시킬 수 있습니다. 문제 발생 시 조기 감지와 자동화된 대응이 가능합니다.

2. 왜 써야 하는가?

Airflow, Prefect, Luigi 등과 비교한 Dagster의 차별점:

도구 주요 개념 강점 Dagster 대비
Apache Airflow Task DAG 성숙한 생태계, 다양한 연산자 개발 경험 부족, Asset 관리 약함
Prefect Flow, Task 간결한 API, 동적 워크플로우 데이터 중심성과 품질 기능 부족
Luigi Task, Target 간단한 구조, Spotify 검증 기능 제한적, 모니터링 약함
Dagster Asset, Op, Job Asset 중심, 개발 경험 우수, 데이터 품질 내재화 -

💡 선택 가이드

Dagster를 선택할 때: 데이터 품질과 계보 관리가 중요할 때, 개발/테스트/디버깅 환경이 필요할 때, 클라우드 네이티브 환경에서 운영할 때.

다른 도구를 고려할 때: 기존 Airflow 인프라가 이미 안정화되었을 때, 매우 단순한 배치 작업만 필요할 때.

3. 핵심 개념

+-------------------+ +----------------+ +----------------+ | Definitions | | Assets | | Jobs | | (Repository) |------>| (데이터 자산) |------>| (실행 단위) | +-------------------+ +----------------+ +----------------+ | | | v v v +-------------------+ +----------------+ +----------------+ | Ops | | Resources | | Schedules | | (작업 단위) | | (외부 연결) | | (스케줄) | +-------------------+ +----------------+ +----------------+ | | | v v v +-------------------+ +----------------+ +----------------+ | I/O Managers |------>| Sensors |------>| Runs | | (저장소 관리) | | (이벤트 감지) | | (실행 기록) | +-------------------+ +----------------+ +----------------+

주요 컴포넌트

4. 퀵스타트

4.1 설치

# pip를 이용한 설치 (최신 버전)
pip install dagster dagster-webserver

# 또는 poetry 사용
poetry add dagster dagster-webserver

# 추가 패키지 (데이터 처리용)
pip install pandas dagster-pandas

4.2 첫 번째 Asset 정의

# my_first_dagster.py
from dagster import asset, Definitions
import pandas as pd

@asset
def raw_data() -> pd.DataFrame:
    """원본 데이터를 생성하는 Asset"""
    return pd.DataFrame({"id": [1, 2, 3], "value": [10, 20, 30]})

@asset
def processed_data(raw_data: pd.DataFrame) -> pd.DataFrame:
    """raw_data를 가공하는 Asset"""
    df = raw_data.copy()
    df["value_doubled"] = df["value"] * 2
    return df

@asset
def summary_report(processed_data: pd.DataFrame) -> str:
    """최종 리포트 생성 Asset"""
    total = processed_data["value_doubled"].sum()
    return f"Total doubled value: {total}"

defs = Definitions(
    assets=[raw_data, processed_data, summary_report]
)

4.3 실행 및 UI 확인

# Dagster UI 서버 실행
dagster dev -f my_first_dagster.py

# 브라우저에서 http://localhost:3000 접속
# Asset 그래프 확인 및 수동 실행 가능

🚀 실무에서 바로 적용

위 예제에서 @asset 데코레이터만 제거하면 일반 Python 함수입니다. Dagster는 기존 코드를 쉽게 통합할 수 있습니다.

5. 핵심 설정 레퍼런스

구성 요소 설정 키 기본값/예시 설명
저장소 dagster.yaml local_artifact_storage 실행 기록과 아티팩트 저장 위치
실행기 execution multiprocess_executor 작업 실행 방식 (동시성 제어)
로그 python_logs level: INFO 로그 레벨 및 출력 설정
스케줄러 schedule_storage SqliteScheduleStorage 스케줄 정보 저장소
런 저장소 run_storage SqliteRunStorage 실행 기록 저장소
클라우드 dagster_cloud.yaml organization: "my-org" Dagster Cloud 전용 설정

설정 파일 예시 (dagster.yaml)

# dagster.yaml
storage:
  postgres:
    postgres_db:
      username: { env: DAGSTER_PG_USERNAME }
      password: { env: DAGSTER_PG_PASSWORD }
      hostname: { env: DAGSTER_PG_HOST }
      db_name: { env: DAGSTER_PG_DB }
      port: 5432

run_storage:
  module: dagster_postgres.run_storage
  class: PostgresRunStorage
  config:
    postgres_url: { env: DAGSTER_PG_URL }

schedule_storage:
  module: dagster_postgres.schedule_storage
  class: PostgresScheduleStorage
  config:
    postgres_url: { env: DAGSTER_PG_URL }

scheduler:
  module: dagster.core.scheduler
  class: DagsterDaemonScheduler

run_launcher:
  module: dagster.core.launcher
  class: DefaultRunLauncher

6. 실무 팁 & 트러블슈팅

✅ 팁 1: Asset 의존성 자동 추적

함수 인자로 Asset을 전달하면 Dagster가 자동으로 의존성을 인식합니다. 명시적 의존성 설정은 @asset(deps=[...])를 사용하세요.

✅ 팁 2: Resource로 외부 연결 관리

데이터베이스, API 클라이언트는 Resource로 정의하여 의존성 주입하세요. 테스트 시 Mock으로 쉽게 교체 가능합니다.

from dagster import resource

@resource
def database_connection():
    return create_engine("postgresql://...")

⚠️ 문제 1: UI가 로드되지 않음 (localhost:3000)

원인: 포트 충돌 또는 설치 문제
해결: 다른 포트로 실행: dagster dev -f my_pipeline.py -p 3001

⚠️ 문제 2: Asset이 이전 버전으로 실행됨

원인: Dagster의 캐싱 동작
해결: UI에서 "Reload definitions" 또는 코드에 @asset(compute_kind="python") 명시

⚠️ 문제 3: 대량 데이터 처리 시 메모리 부족

원인: 모든 데이터를 메모리에 로드
해결: 청크 처리 또는 I/O Manager를 사용한 점진적 로드 구현

디버깅 명령어

# 정의 로드 확인
dagster job list -f my_pipeline.py

# 특정 Job의 실행 계획 확인
dagster job preview -j my_job -f my_pipeline.py

# UI 없이 실행 (CLI)
dagster job execute -j my_job -f my_pipeline.py

7. 참고 자료