[Airflow] Airflow Setup하기

geun·2023년 2월 24일
0

Airflow

목록 보기
1/2
post-thumbnail

Apache AirFlow란?

Airflow란 Airbnb사에서 만든 Workflow Management Tool입니다.
여기서 workflow란 일련의 작업의 흐름을 뜻하는데, Airflow를 활용해서 해볼 작업을 미리 예로들면 주기적으로 Data 수집을 진행하게끔 python 코드를 미리 구성해놓고 데이터 수집 → 데이터 전처리 → DB에 데이터 입력 순으로 미리 스케줄링을 걸어놓게 되는데 이렇게 흐름이 있는 작업을 workflow라고 합니다.
그리고 Airflow는 이 작업들을 관리해주는 툴입니다.

Airflow는 특징이 되는 컴포넌트들이 있고, 각 Component들 간의 아키텍처는 아래와 같습니다.

이미지에서 보이듯 Airflow는 크게 4가지의 구성요소로 이루어져 있습니다.

  • Webserver
  • Scheduler
  • Excutor
  • Workers

또한, Airflow의 Workflow를 진행하기 위해서 DAG(Directed Acyclic Graph)를 이용해서 WorkFlow를 작성하게 됩니다.

하나씩 알아봅시다..!

Airflow Webserver

Airflow의 Webserver는 Airflow의 다양한 Log들을 시각화해서 나타내줍니다.
예를들면, Scheduler에 의해 생성된 DAG의 목록, Task 상태 등을 시각화 해줍니다.

Airflow Scheduler

Airflow의 Scheduler는 이름에서 알 수 있듯이 할당된 work들을 주기적으로 실행할 수 있게 트리거 역할을 합니다.

Airflow Executor

Airflow Executor는 실행 중인 task들을 관리하는 역할을 합니다.

Airflow Worker

Airflow Worker는 마찬가지로 이름에서 알 수 있듯이 실제로 task를 실행하는 역할을 합니다.

Airflow Database

Airflow Database는 실행된 DAG, Task의 Data를 저장하고 관리하는 역할을 합니다.

DAG(Directed Acyclic Graph)

DAG는 비순환 그래프로써 노드와 노드가 단방향으로 연결되어 있어 한번 실행된 노드로는 돌아오지 않는 특성을 가지고 있습니다. 따라서 Airflow에서는 Workflow를 DAG로 구성해서 Workflow를 어떻게 진행할 지를 구성하게됩니다.

Airflow 설치 및 기본 Settup

개발환경

  • Raspberry Pi 4b +
  • ubuntu 22.04.01 LTS
  • MacBook M1

Airflow 공식 문서를 확인해보면 Airflow를 가장 빨리 시작하는 방법은 Docker Compose를 이용한 시작이 가장 빠르다고 합니다.

왜냐하면 앞서 알아봤듯이 Airflow에는 여러 컴포넌트가 필요합니다. 따라서 Docker Compose을 이용해서 각 컴포넌트들의 Container를 한번에 실행할 수 있게 되므로 가장 빠른 방법이라고 한것 같습니다.

개인적인 생각으로는 Container Orchestration tool을 사용하게 되면 각 Container를 보다 효율적으로 관리할 수 도 있을 것 같습니다. 하지만 아직 저는 k8s와 같은 Container Orchestration Tool을 다룰줄 모르기 때문에 다음에 도전해보기로 하고 우선은 Docker-Compose를 이용해서 Airflow를 시작해보겠습니다!

아래 명령어로 Apache에서 공식으로 제공하고 있는 docker-compose.yaml 파일을 다운로드합니다.

$ curl -Lf0 'https://airflow.apache.org/docs/apache-airflow/stable/docker-compose.yaml'

docker-compose.yaml 파일을 다운 받았다면 필요에 따라 아래 내용을 변경해서 사용합니다.

  • Docker 이미지 경로
    → 사설 저장소를 이용하는 경우 수정
  • Docker 이미지 버전
    → python 버전 변경 등 필요시 수정
  • 볼륨 경로
    → 호스트와 Container 간에 연결할 볼륨을 설정 필요시 수정
  • 호스트 - 컨테이너 포트 변경
    → 기본적으로 Airflow의 Webserver와 flower는 호스트의 8080, 5555 포트를 사용 필요시 수정
$ vim docker-compose.yml

>> 
## 생략 ##
version: '3'
x-airflow-common:
  &airflow-common
  image: ${사설저장소경로:포트}:-apache/airflow:2.5.1

## 생략

	volumes:
	    - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
	    - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
	    - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins

## 생략 ##

services:
  postgres:
    image: ${사설저장소경로:포트}/postgres:13

## 생략 ##

  redis:
    image: ${사설저장소경로:포트}/redis:latest

## 생략 ##

	airflow-webserver:
	    <<: *airflow-common
	    command: webserver
	    ports: 
	      - ${호스트_포트}:8080 # 변경할 포트로 변경

## 생략 ##
	
	flower:
	    ports:
	      - ${호스트_포트}:5555 # 변경할 포트로 변경

.env 파일 생성

Apache의 docker-compose.yaml 파일 내부에는 환경 변수로 지정된 AIRFLOW_UID가 있습니다.
해당 환경변수를 지정해주기 위해서 .env 파일을 생성합니다.
해당 환경변수는 컨테이너 내부에서 Airflow 관련 파일 및 폴더들의 소유자를 지정하기 위해서 사용됩니다.

$ echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
$ cat .env

>> 
AIRFLOW_UID=1000
AIRFLOW_GID=0

aiflow-init 컨테이너 실행

Apache의 docker-compose.yaml 파일은 내용을 보면 알 수 있지만 크게 두 단계에 거쳐 실행됩니다.

  1. airflow-init 컨테이너를 생성해서 PostgreSQL과 Redis 컨테이너를 연결합니다.
  2. AirFlow 컨테이너들을 생성하고, 미리 생성된 컨테이너들과 연결합니다.

따라서 순서에 따라 airflow-init 컨테이너를 생성후 실행하겠습니다.

# Apache의 docker-compose.yml 이 있는 디렉토리에서 아래 명령어를 실행합니다.

$ docker compose up airflow-init

Airflow의 초기화 과정이 있어서 시간이 조금 걸립니다.. 저는 약 10분 내외로 걸렸던것 같습니다.

완료 이후 컨테이너 실행 목록을 확인해보면 위와같이 postgresql과 redis 컨테이너가 생성 및 실행됩니다.

airflow 컨테이너 실행

두번째 단계인 Airflow 컨테이너를 실행합니다. 이때 -d 옵션을 통해 데몬( 백그라운드 ) 실행으로 실행 되도록 합니다.

# Apache의 docker-compose.yml 이 있는 디렉토리에서 아래 명령어를 실행합니다.

$ docker compose up -d 

Airflow Webserver 접속하기

정상적으로 컨테이너가 실행됬다면 환경에 따라서 domain:port 로 웹 서버에 접속할 수 있습니다.

ex) localhost:8080

접속 완료!

Apache Airflow에서 기본적으로 생성되는 Admin 계정은 아래와 같습니다.

  • Username : airflow
  • Password : airflow

해당 Username과 Password 는 접속 이후 Security → List Users 에서 변경할 수 있습니다.

TimeZone 변경하기

우측 상단의 시간 표시를 눌러보면 위 사진과 같이 호스트의 시간대인 KST 시간으로 변경됩니다.

전체 docker compose 초기화

아래의 명령어를 통해 컨테이너를 모두 내리고, 연결된 볼륨을 삭제할 수 있습니다.

docker compose down --volumes --rmi all

만약 컨테이너만 내리고 싶다면 아래 명령어를 사용하면 됩니다.

docker compose down

실행 후 서버의 CPU 점유율 관련

위 이미지에서 보이듯 정상적으로 Airflow가 실행이 된 뒤로부터 서버의 리소스 점유율이 비정상적이었습니다.

서버의 환경을 모니터링 해보니 비정상적인 점유율을 차지하고 있는 것을 확인했습니다.

지속적으로 모니터링 해보니 주기적으로 점유율이 치솟다가 내려왔다 하고 있었습니다.

아직 정확한 원인은 확인 못했지만, 당장 생각이 드는것은 Airflow Scheduler가 Apache에서 제공하는 예제들을 의미없이 짧은 주기로 실행하고 있지 않을까 라는 생각이 듭니다.

우선 띄워놓은 다른 컨테이너에 영향이 가지 않게 Airflow 관련 컨테이너를 모두 내렸더니 정상적으로 돌아왔습니다...!

우선 이번 포스트에서는 설치와 실행을 해보았으니,
다음 글에서는 관련 트러블 슈팅을 시작으로 예제를 다뤄보는 것으로 글을 시작해보겠습니다.


추가적으로 보면 좋을 레퍼런스


profile
말하는 감자🥔에서 기록도 하는 감자🥔로 거듭나기

0개의 댓글