Airflow 운영 상의 어려움
- 관리해야하는 DAG의 수가 100개를 넘어간다면?
- 데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈들이 발생
- 어떤 이슈들이 있을까?
- 라이브러리 충돌
- Worker의 부족
- Worker 서버들의 관리와 활용도 이슈
-
라이브러리 충돌
- 라이브러리/모듈의 충돌 이슈가 발생하기 시작함
- DAG에 따라 실행에 필요한 라이브러리/모듈이 달라지기 시작
- 이로 인해 DAG 혹은 Task별로 별도의 독립공간을 만들어주는 것이 필요
- Docker to the rescue
- Dag 혹은 Task 코드를 Docker Image로 만들고 이를 독립된 공간(Docker Container)안에서 실행
-
Worker의 부족
- Scale Up
- Scale Out
- K8s와 같은 컨테이너 기술 사용
-
낮은 Server Utilization 이슈
-
Airflow 전용 하드웨어를 지정했는데 서버들이 항상 바쁘지 않다면?
-
서비스별로 전용 서버를 할당하는 것은 여러가지로 이슈를 만들어냄
- 서비스별로 Capacity 관리를 해야함
- 각 서버가 필요할 만큼 on demand 형식으로 리소스를 가져다 씀
- 각 서비스에 속한 서버들은 보면 utilization이 낮은 이슈 발생
-
이 역시 K8s와 같은 컨테이너 기술의 도입으로 해결 가능
해결책
- 태스크나 DAG 코드를 Docker Image로 만들어서 Docker Container 형태로 실행
- 라이브러리/모듈 충돌을 방지
- 개발 환경과 프로덕션 환경을 동일하게 유지
- Airflow Worker를 K8s에서 필요한 대로 동적으로 할당하여 사용
- 전용 서버를 Airflow에 할당하지 않고 Container Orchestration 서비스를 통해 할당해서 사용하고 리턴
<aside>
💡 Airflow에서 이를 해결하는 방법은 3가지
- Airflow Operator로 KubernetesPodOperator를 사용
- Airflow Operator로 DockerOperator를 사용
- Airflow Executor로 아래를 사용
- KubernetesExecutor
- CeleryKubernetesExecutor
- LocalKubernetesExecutor
</aside>
잠깐! Airflow Executor는 무엇?
Kubernetes를 이용한 효율적인 데이터 엔지니어링(Airflow on Kubernetes VS Airflow Kubernetes Executor) - 1
- Executor는 Task들을 관리하고 실행하는 역할을 수행
- 즉, Executor는 Scheduler 프로세스안에 존재하는 요소이나, Task가 동작하는 환경과 메커니즘을 Executor 라고 할 수 있음
- 병렬 혹은 일렬 실행이나 어느 worker에서 실행할지 등등