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. 핵심 개념
주요 컴포넌트
- Asset: 데이터 자산(테이블, 파일, 모델)을 표현하는 객체. 데이터 계보의 중심.
- Op: 실제 작업을 수행하는 함수 단위. 순수 함수 권장.
- Job: Ops/Assets를 실행 가능한 단위로 묶은 것.
- Resource: 데이터베이스 연결, API 클라이언트 등 외부 의존성.
- I/O Manager: Asset의 로드/저장을 관리하는 저장소 추상화.
- Sensor: 파일 생성, API 응답 등 외부 이벤트를 감지하여 Job 실행.
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. 참고 자료
- 📘 공식 문서 (한글 부분 번역 포함) - 개념, 튜토리얼, API 레퍼런스