이 글은 Data Engineering Zoomcamp의 Module 2: Workflow Orchestration 를 바탕으로
워크플로 오케스트레이션 개념과 Kestra 실습 내용을 정리한 글입니다.
목차
- Workflow Orchestration 개요
- ETL vs ELT 개념 비교
- Kestra 소개
- Kestra 로컬 환경 구성
- Workflow 실행
- ETL 파이프라인 구성
- 스케줄링과 Backfill
- 참고 자료 / 출처
1. Workflow Orchestration 개요
데이터 엔지니어링에서 워크플로 오케스트레이션은
여러 데이터 작업을 순서·의존성·시간 기준으로 관리하는 역할을 합니다.
일반적인 데이터 파이프라인은 다음과 같은 단계로 구성됩니다.
- 데이터 수집 (Extract)
- 데이터 변환 (Transform)
- 데이터 적재 (Load)
이 작업들을 단순히 스크립트로 실행할 경우 다음과 같은 문제가 발생합니다.
- 중간 단계 실패 시 어디서 멈췄는지 알기 어렵다
- 재실행, 재처리(backfill)가 번거롭다
- 스케줄 관리와 모니터링이 힘들다
이 문제를 해결하기 위해 워크플로 오케스트레이션 도구가 필요합니다.
2. ETL vs ELT 개념 비교
ETL (Extract → Transform → Load)
- 데이터를 먼저 추출
- 중간 처리 서버에서 변환
- 변환된 데이터를 최종 저장소에 적재
특징
- 전통적인 데이터 웨어하우스 방식
- 변환 로직이 파이프라인에 강하게 결합
- 처리 서버 부하가 큼
ELT (Extract → Load → Transform)
- 데이터를 먼저 그대로 적재
- 데이터 웨어하우스 내부에서 변환
특징
- 클라우드 DW(BigQuery, Snowflake)에 적합
- 원본 데이터 보존
- 변환 로직 분리(dbt 등)
ETL vs ELT 비교 정리
| 구분 | ETL | ELT |
| 변환 위치 | 외부 처리 서버 | 데이터 웨어하우스 내부 |
| 원본 데이터 | 변환 후 저장 | 그대로 저장 |
| 확장성 | 제한적 | 높음 |
| 클라우드 친화성 | 낮음 | 높음 |
해당 학습 자료에서는 ETL 구조로 먼저 실습한 후, ELT 구조를 전제로 워크플로 오케스트레이션 + 데이터 웨어하우스 설계를 진행합니다.
3. Kestra 소개
Zoomcamp Module 2에서는 오케스트레이션 도구로 Kestra를 사용합니다.
Kestra의 특징은 다음과 같습니다.
- YAML 기반 워크플로 정의
- UI 제공 (실행 상태, 로그 확인 가능)
- Cron 기반 스케줄링
- Docker 환경에서 쉽게 실행 가능
4. Kestra 로컬 환경 구성
1) 레포지토리 클론
git clone https://github.com/DE-zoomcamp-kr/de-zoomcamp-yhs.git
cd de-zoomcamp-yhs/02-workflow-orchestration
2) Docker Compose 실행
docker compose up -d
컨테이너가 정상적으로 올라가면 Kestra UI에 접속할 수 있습니다.
- 기본 주소: http://localhost:8080
UI에서는 워크플로 목록, 실행 이력, 로그를 확인할 수 있습니다.
5. Workflow 실행
Kestra에서 워크플로는 YAML 파일로 정의됩니다.
기본적인 워크플로 구조는 다음과 같습니다.
- workflow id
- namespace
- task 목록
예시 구조
id: hello_world
namespace: zoomcamp
tasks:
- id: print_message
type: io.kestra.core.tasks.log.Log
message: "Hello, Kestra!"
해당 워크플로를 실행하면 Kestra가 task를 순서대로 실행하고, 결과 로그를 UI에 기록합니다.
6. ETL 파이프라인 구성
이제 본격적으로 ETL 파이프라인을 워크플로로 구성합니다.
ETL 흐름
- 데이터 다운로드 (Extract)
- 데이터 전처리 (Transform)
- 데이터베이스 또는 스토리지 적재 (Load)
Kestra에서는 각 단계를 task 단위로 정의합니다.
ETL Workflow 예시
id: etl_pipeline
namespace: zoomcamp
tasks:
- id: extract
type: io.kestra.core.tasks.scripts.Bash
command: |
python extract_data.py
- id: transform
type: io.kestra.core.tasks.scripts.Bash
command: |
python transform_data.py
- id: load
type: io.kestra.core.tasks.scripts.Bash
command: |
python load_data.py
각 task는 앞 task가 성공해야 다음 task가 실행됩니다.
중간에 실패하면 워크플로는 중단되고 실패 상태로 기록됩니다.
7. 스케줄링과 Backfill
스케줄링
Kestra는 Cron 기반 스케줄을 지원합니다.
triggers:
- id: daily_schedule
type: schedule
cron: "0 2 * * *"
timezone: "UTC"
위 설정은 매일 새벽 2시(UTC) 에 워크플로를 자동 실행합니다.
Backfill 개념
Backfill은 과거 데이터에 대해 워크플로를 다시 실행하는 것을 의미합니다.
- 하루치 데이터 적재 실패
- 특정 기간 데이터 재처리 필요
와 같은 상황에서
Kestra UI에서는 특정 실행 날짜를 지정해 과거 워크플로를 다시 실행할 수 있습니다.
8. 참고자료 / 출처
- Kestra Video: https://www.youtube.com/playlist?list=PLEK3H8YwZn1p-pCYj46rRhA0HcdXXxzzP
- Data Engineering Zoomcamp Repo: https://github.com/DataTalksClub/data-engineering-zoomcamp
- NYC TLC Trip Record Data(공식): https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page
- DataTalksClub NYC TLC Data(학습용): https://github.com/DataTalksClub/nyc-tlc-data
- Kestra Github : https://github.com/kestra-io/
- Kestra Docs: https://kestra.io/docs/quickstart