All
배경
•
데이터팀에서는 태블로 메인 서버와 파트너사 서버 두개 운영 중
•
메인 서버와 파트너 서버 둘 간의 데이터 이동이 필요
•
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 |
•
압축 해제 단계 제거로 전체 단계가 단순해짐




