Search

[Airflow 운영 안정화] Tableau 데이터 싱크 파이프라인 리팩토링

제목
작성일

배경

데이터팀에서는 태블로 메인 서버와 파트너사 서버 두개 운영 중
메인 서버와 파트너 서버 둘 간의 데이터 이동이 필요
Airflow에서 Tableau 소스 서버 → Tableau 타겟 서버로 데이터를 싱크하는 DAG을 운영
BI팀 요청에 따라 4:30, 6:30, 8:30, 9:30 시간 트리거, 9개 task 순차 실행
실패 알람이 잦아 확인

문제

Airflow task timeout

9개 태스크중 2개의 태스크가 데이터 양이 많아 execution timeout 발생
거의 매일 하루에 한건 이상 timeout 실패 알람이 슬랙에 전송됨

main 중복 및 비효율 코드

9개의 태스크의 main 함수가 전부 동일한 흐름을 가지고 있음
아래 제외하고 코드가 동일
datasource_id, project_id
로컬, zip/hyper 파일명
같은 코드를 task별로 복붙해 유지보수성이 매우 떨어지는 상태
각 task 주요 흐름
1.
tableauserverclient 라이브러리를 이용해 Tableau 소스 서버에서 .tdsx 파일 다운로드
2.
.zip 으로 변환 후 압축 해제하여 .hyper 파일 추출
3.
타겟 Tableau 서버에 .hyper 파일 publish
기존 코드

개선

1.
Task timeout 상향 조정
데이터양 많은 두 태스크의 실행 로그 확인 후 execution timeout 값을 맞춰 늘려 안정적으로 처리가능하게 조정
2.
중복 코드 모듈화
공통 로직(download → publish)을 하나의 유틸 클래스로 분리
Task별로 달라지는 값(datasource_id, project_id, filename)과 태블로 서버 credential은 config 파일로 관리
3.
불필요한 압축 해제 제거
태블로 서버에서 태블로로 데이터를 옮기는 것으로, tdsx 파일을 굳이 압축을 풀고 hyper 파일로 만들어서 옮길 필요 없음
tdsx 파일 자체를 바로 업로드하면 되므로 압축 해제 단계 제거
4.
문서화
기존 각 task 코드에 박혀있던 datasource 쿼리/id 정보를 README에 따로 정리
개선된 코드 예시

성과

매일 반복되던 Timeout 에러 제거
하루도 빠지지 않고 오던 태스크 실패 알람
9개 Task에 중복돼 있던 코드를 공통 모듈 1개로 단순화
기존에는 각 태스크 코드를 하나씩 들어가야 어디서 어디로 가는지 알 수 있었는데, config + README만 보면 어떤 소스가 어디로 sync 되는지 한눈에 파악가능

실행시간 비교

구분
단계
개선 전(초)
개선 후(초)
Task A
Download
61
62.99
Unzip
17
-
Publish
34.61
26.87
Total
112.61
89.86
Task B
Download
32.69
34.75
Unzip
6
-
Publish
15.75
19.16
Total
54.44
53.91
압축 해제 단계 제거로 전체 단계가 단순해짐