데이터 엔지니어 기술 블로그

[Airflow] Airflow + Celery Executor 구축(Docker) 본문

데이터 엔지니어링

[Airflow] Airflow + Celery Executor 구축(Docker)

jun_yeong_park 2021. 10. 15. 18:26
반응형

개요

에어플로우를 LocalExecutor를 사용해서 하나의 인스턴스에 실행시키고 있었다. 그러나 인스턴스에 문제가 생기면 Airflow도 동작하지 않을 수 있는 문제가 있고, 인프라가 커졌을 때 확장이 힘들어서 Worker를 분리해야했다.

 

airflow에서 공식적으로 제공하는 docker-compose에서는 celery를 사용하며, 보통 airflow를 구축할 때 celery를 사용하는 것 같다.

 

이렇게 클러스터로 구축을 하게 되면 리소스가 필요할 때 worker의 갯수만 늘리면 되고, 리소스가 필요 없을 때 불필요하게 낭비하지 않고 worker의 갯수를 줄이면 되기 때문에 좋다.

 

구축할 때는 AWS ECS, AWS EFS 환경에서 구축했다.

 

 

구축 과정

Dask Cluster를 활용하여 구축 시도

가장 간단하게 Dask를 사용하여 구축하려고 했다.

  • Dask는 pandas, numpy를 분산컴퓨터에서 처리할 수 있게 해주는 기능을 가지고 있다.
  • Dask를 Jupyter Notebook에서 활용할 수 있는지 확인해보았다. 그러나 버전이 맞지 않아 동작하지 않았다.

Airflow와 Worker가 통신을 제대로 하지 못하는 이슈가 발생했다. 찾아보니 사람들이 현재 잘 사용하지 않아서 이슈가 발생해도 업데이트가 안되는 것 같다. 만약에 발생한 문제를 해결한다고 해도 또 다른 이슈가 생겼을 때 해결하기 힘들 것 같아서, 대중적인 방법을 사용하기로 결정했다.

 

Celery를 활용하여 구축

Airflow Celery

Airflow sample docker-compose에서 Celery를 활용하여 구축한 예시가 있었다. 그래서 이 docker-compose를 기반으로 시도했으나, 커스텀하는 부분에서 제한이 되외서 Airflow 이미지를 직접 만들어서 사용했다.

최종적으로 아래의 서비스로 분류하여 구축했다.

  • mysql: mysql
  • redis: redis
  • airflow: airflow-scheduler, airflow-webserver, flower
  • airflow worker: airflow-worker

 

발생했던 문제

Docker CMD 명령어 이해 못하는 문제

CannotStartContainerError: ResourceInitializationError: failed to create new container runtime task: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/bin/bash -c": stat /bin/bash -c: no such file or directo....
  • ["airflow worker"] 와 같은 방식으로 사용하면 하나의 명령어인 줄 알고 이해하지 못한다. ["airflow", "worker"] 와 같이 사용해야 한다.

 

redis, celery 버전 문제

pip3 install apache-airflow[celery]==2.1.2
pip3 install apache-airflow[redis]==2.1.2
  • redis, celery도 마찬가지로 설치시에 버전까지 명시해주어야한다.

 

db init 사용 시 계정이 사라지는 문제

  • db init 명령어를 사용했을 때 기존에 DB에 데이터가 있다면 기존에 있던 데이터가 날아간다.

 

ERROR: Pidfile (/opt/airflow/airflow-worker.pid) already exists.

  • Docker로 각자 실행하는데 같은 airflow-worker.pid 파일을 바라보기 때문에 생기는 문제이다. dags, logs, plugins만 따로 마운트하도록 변경해서 해결했다.

 

 

 

 

반응형
Comments