Airflow – 데이터 엔지니어링 실무에서의 견고한 파이프라인을 위한 DAG 설계 원칙
데이터 엔지니어링 실무에서 Airflow를 사용하다 보면, 단순히 “실행이 잘 되는” DAG를 만드는 것을 넘어 “장애에 강하고 유지보수가 쉬운” DAG를 만드는 것이 얼마나 중요한지 깨닫게 됩니다.
잘못 설계된 DAG는 재실행 시 데이터를 중복시키거나, 사소한 실패에도 전체 파이프라인을 마비시키곤 합니다. 오늘은 안정적인 데이터 파이프라인 구축을 위해 반드시 지켜야 할 Airflow DAG 설계 원칙을 정리해 보았습니다.
1. 멱등성 유지 (Idempotency) : 같은 인풋값으로 실행하면 항상 결과는 동일
가장 중요한 원칙입니다. 멱등성이란 동일한 입력 값으로 여러 번 실행해도 항상 결과가 같아야 함을 의미합니다.
- 왜 중요한가?
파이프라인은 언제든 실패할 수 있습니다. 3일 전 작업을 재실행(Backfill)했을 때 데이터가 중복으로 쌓인다면 신뢰할 수 없는 파이프라인이 됩니다. - 실천 팁
- INSERT 대신 UPSERT를 사용하거나, 실행 날짜 기반의 파티션을 OVERWRITE 하는 전략을 취하세요.
- 데이터 저장 경로에 날짜 정보를 포함시켜 범위를 명확히 분리하세요.
2. 원자성 보장 (Atomicity) : 태스크는 쪼갤수록 안전하다
각 태스크는 “전부 성공하거나, 아니면 아예 실패하거나” 중 하나여야 합니다.
- 왜 중요한가?
하나의 태스크에서 ‘데이터 추출’과 ‘업로드’를 동시에 하면, 추출은 성공했는데 업로드만 실패했을 때 재실행 시 로직이 꼬이게 됩니다. - 실천 팁
- 태스크를 최대한 작은 단위로 분리하세요.
* 하나의 오퍼레이터는 하나의 구체적인 작업만 수행해야 합니다.
- 태스크를 최대한 작은 단위로 분리하세요.
3. 결정론적 설계 (Deterministic) : 현재 시간이 아닌 ‘기준 시간’을 사용하기
DAG 내부에 datetime.now() 같은 코드가 들어가는 순간, 그 파이프라인은 시한폭탄이 됩니다.
- 왜 중요한가?
과거 날짜 데이터를 처리하는 ‘Backfill’을 수행할 때, 코드가 실행되는 현재 시점의 시간을 참조하면 데이터가 엉뚱하게 추출됩니다. - 실천 팁
- Airflow가 제공하는 템플릿 변수(Jinja Template)인 {{ ds }}(실행 날짜)나 {{ data_interval_start }}를 적극 활용하세요.
* 태스크는 항상 “내가 지금 언제인지”를 Airflow로부터 전달받아야 합니다.
- Airflow가 제공하는 템플릿 변수(Jinja Template)인 {{ ds }}(실행 날짜)나 {{ data_interval_start }}를 적극 활용하세요.
4. 데이터 전달 최소화 : 데이터 값 대신 포인터 사용
태스크 간에 수 GB 단위의 데이터를 직접 주고받는 것은 메타데이터 DB에 과부하를 유발합니다.
- 왜 중요한가?
Airflow의 XCom은 메타데이터 저장용(DB 기반)입니다. 대용량 데이터를 여기에 담으면 메타데이터 DB 부하가 급증하고 워커 메모리가 고갈됩니다. - 실천 팁
- 실제 데이터는 S3, GCS, HDFS 같은 외부 저장소에 저장하세요.
- 태스크 간에는 데이터 자체가 아닌, 데이터가 저장된 **’경로(S3 URI 등)’**만 전달하세요.
5. 점진적 처리 (Incremental Loading) : 필요한 만큼만 가져오기
매번 전체 데이터를 처음부터 끝까지 다시 읽는 방식은 데이터가 늘어날수록 오버헤드가 커집니다.
- 왜 중요한가?
데이터 규모가 커지면 실행 시간이 기하급수적으로 늘어나고 타임아웃 오류가 발생하기 쉽습니다. - 실천 팁
- Airflow의 스케줄 주기에 맞춰 해당 기간(예: 최근 1시간, 어제 하루)의 데이터만 추출하는 쿼리를 작성하세요.
- Catchup 설정을 활용해 누락된 구간만 순차적으로 처리하게 하세요.
6. 보안과 유지보수 : 하드코딩은 금물
접속 정보나 API 키를 DAG 코드에 직접 적는 것은 보안 이슈입니다.
- 왜 중요한가?
비밀번호가 바뀌었을 때 수십 개의 DAG 코드를 일일이 수정할 수는 없습니다. - 실천 팁:
- Airflow의 Connections와 Variables 메뉴를 활용하세요.
- 환경별(Dev/Prod) 설정값은 외부 설정 파일이나 환경 변수로 관리하여 코드와 인프라를 분리하세요.
좋은 DAG 설계는 단순히 에러가 나지 않는 코드가 아니라, 에러가 났을 때 가장 빠르고 안전하게 복구할 수 있는 코드입니다. 위 6가지 원칙을 체크리스트 삼아 여러분의 DAG를 점검해 보세요.