터칭 데이터

Docker & K8S - Airflow 운영상의 어려움 본문

Docker & K8S

Docker & K8S - Airflow 운영상의 어려움

터칭 데이터 2023. 12. 18. 10:06

 

 

관리해야하는 DAG의 수가 100개를 넘어간다면?

 

데이터 품질이나 데이터 리니지 이슈 이외에도 다양한 이슈들이 발생

 

어떤 이슈들이 있을까?

라이브러리 충돌
Worker의 부족
Worker 서버들의 관리와 활용도 이슈

 

 

 

 

 

 

 

 

 

 

 

1. 라이브러리 충돌

 

라이브러리/모듈의 충돌 이슈가 발생하기 시작함

 

DAG에 따라 실행에 필요한 라이브러리/모듈이 달라지기 시작

예) Python 버전

 

이로 인해 DAG 혹은 Task별로 별도의 독립공간을 만들어주는 것이 필요

Docker to the rescue

Dag 혹은 Task 코드를 Docker Image로 만들고 이를 독립된 공간(Docker Container)안에서 실행

 

지금은 Docker 이미지(Image)는 소프트웨어의 실행을 위해 필요한 모든 dependent한 모든 것(의존성 파일)들이 들어 있는 패키지이고 Docker 컨테이너는 그 소프트웨어를 위해 분리된 공간이라고 생각하시면 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. Worker의 부족

 

Scale Up

 

Scale Out

클라우드 서비스 사용

 

K8s와 같은 컨테이너 기술 사용

필요한대로 서버 요청

 

 

공용 서버 클러스터: K8S

 

지금은 필요에 따라 자원을 요청하고 사용한 뒤 돌려준다는 개념만 이해 해주세요.

 

 

 

 

 

 

 

 

 

 

 

 

 

3. 낮은 Server Utilization 이슈

 

Airflow 전용 하드웨어를 지정했는데 서버들이 항상 바쁘지 않다면?

 

서비스별로 전용 서버를 할당하는 것은 여러가지로 이슈를 만들어냄

서비스별로 Capacity 관리를 해야함

각 서비스에 속한 서버들은 보면 utilization이 낮은 이슈 발생

 

이 역시 K8s와 같은 컨테이너 기술의 도입으로 해결 가능

바로 위에서 살펴 본 K8S와 같은 공용 서버 클러스터를 만든 뒤 필요에 따라 각 서비스가 온 디맨드(On Demand) 형식으로 사용하고 반환하는 방법으로 해결할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

해결책


태스크나 DAG 코드를 Docker Image로 만들어서 Docker Container 형태로 실행

라이브러리/모듈 충돌을 방지
개발 환경과 프로덕션 환경을 동일하게 유지

 

Airflow Worker를 K8s에서 필요한 대로 동적으로 할당하여 사용

전용 서버를 Airflow에 할당하지 않고 Container Orchestration 서비스를 통해 할당해서 사용하고 리턴

 

Airflow에서 이를 해결하는 방법은 3가지

a. Airflow Operator로 KubernetesPodOperator를 사용
b. Airflow Operator로 DockerOperator를 사용
c. Airflow Executor로 아래를 사용

    KubernetesExecutor
    CeleryKubernetesExecutor
    LocalKubernetesExecutor

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

잠깐! Airflow Executor는 무엇?


Executor는 Task들을 관리하고 실행하는 역할을 수행

- 병렬 혹은 일렬 실행이나 어느 worker에서 실행할지 등등

 

다양한 수의 Executor 타입이 존재

- Sequential Executor: 디폴트로 설치되며 Sqlite와 같은 싱글스레드 DB에서만 사용가능 (병렬 X)
- Local Executor: task들을 Airflow 마스터 노드안에서 실행
- Celery Executor: 다수의 Worker 노드가 있는 경우 사용되며 Celery 큐를 사용해 task들을 worker 노드로 분산하여 실행
- Kubernetes Executor는 K8s 클러스터를 사용하여 task들을 독립된 환경에서 사용
- Local Kubernetes Executor와 Celery Kubernetes Executor도 존재

(LKE는 LE와 KE 모두 지원, CKE는 CE와 KE 모두 지원)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Airflow 아키텍처: Docker와 K8s를 사용하는 방법

 

Airflow Operator로 KubernetesPodOperator를 사용

이 방식은 특정 태스크를 Docker Image로 만들어 K8s에서 실행

 

Airflow Operator로 DockerOperator를 사용

이 방식은 특정 태스크를 Docker Image로 만들어 Docker Container 위 에서 실행

 

Airflow Executor로 다음 중의 하나를 사용

KubernetesExecutor

    - 모든 DAG 코드가 Docker Image로 빌드되어 K8s에서 실행됨


CeleryKubernetesExecutor

    - CeleryExecutor와 KubernetesExecutor를 동시에 사용하는 방법을 제공해주는 Executor
    - 이는 Airflow 로드가 전체적으로 큰데 소수의 task만 Isolation을 필요로 하는 경우


LocalKubernetesExecutor

    - LocalExecutor와 KubernetesExecutor를 동시에 사용하는 방법을 제공해주는 Executor

 

 

 

 

 

'Docker & K8S' 카테고리의 다른 글

Docker & K8S - Docker 프로그램 개발 프로세스  (0) 2023.12.18
Docker & K8S - Docker 설치  (0) 2023.12.18
Docker & K8S - Virtual Machines vs. Docker Containers  (0) 2023.12.18
Docker & K8S - Docker 소개  (0) 2023.12.18
Docker & K8S  (0) 2023.12.18