딥상어동의 딥한 프로그래밍/엔지니어링

[Airflow] 설치(pip install) 및 webserver 실행

딥상어동의 딥한생각 2022. 5. 8. 09:18
가짜연구소 내 Python - Data Engineering 스터디를 위해 작성했습니다. 

https://www.notion.so/chanrankim/PseudoLab-c42db6652c1b45c3ba4bfe157c70cf09

(가짜연구소 링크)

https://www.notion.so/chanrankim/Data-Engineer-Python-83c206a662004120a8211a800581e124

(스터디상세 링크)

 

 

0. DAG란?

Directed Acyclic Graph의 약자이다.

https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html

여기서, 가장 중요한 단어는 acyclic = 비순환이 아닐까 생각한다. 

 

It defines four Tasks - A, B, C, and D - and dictates the order in which they have to run

왜냐하면, "비순환"이기 때문에 하고자 하는 작업에 순서가 보장되기 때문이다. 예를 들어, 서머리 테이블을 만드는 작업과 서머리 테이블을 만들기 전 데이터를 전처리하는 테스크를 분리하고 싶을 수 있다. 이렇게 테스크를 분리하면, 전처리 테이블을 이용해 추후 다른 배치 작업을 실행할 수 있다.

 

그런데, 이렇게 하기 위해서는 "작업의 순서"가 보장되어야 한다. 즉, 전처리 테이블을 먼저 생성후 -> 서머리 테이블이 생성되어야 하는 것이다. 

 

https://gibles-deepmind.tistory.com/118?category=954919 

 

[linux] Python과 crontab을 이용하여 카카오톡 메시지 보내는 배치 실행하기(카카오 API)

가짜연구소 내 Python - Data Engineering 스터디를 위해 작성했습니다. https://www.notion.so/chanrankim/PseudoLab-c42db6652c1b45c3ba4bfe157c70cf09 (가짜연구소 링크) https://www.notion.so/chanrankim/Dat..

gibles-deepmind.tistory.com

얼마전에, 크론탭과 카카오API를 이용해서 나에게 메시지 보내는 배치를 실행해봤는데 크론탭의 경우 작업의 순서를 인과적으로 보장할 수 없기 때문에 여러 테스크들을 연이어 실행하는 경우 굉장히 불편할 수도 있겠다는 생각이 들었다. 물론, 시간상 순서를 정할 수는 있다. 하지만, 만약 앞단 작업에서 장애가 발생하면 어떻게 할 것인가? Airflow의 DAG는 이러한 문제들을 손쉽게 해결해준다.

 

1. 강력한 웹 인터페이스

Airflow의 또 다른 장점 중 하나는 강력한 웹 인터페이스가 아닐까 생각한다. 

https://www.google.com/search?q=airflow+tree+view&tbm=isch&ved=2ahUKEwj0wJPYvc73AhXAz4sBHXf3CgIQ2-cCegQIABAA&oq=airflow+tree+view&gs_lcp=CgNpbWcQAzIECAAQEzoFCAAQgAQ6BggAEAcQHlCWCFiNDmCmD2gAcAB4AIABmQGIAbUIkgEDMC45mAEAoAEBqgELZ3dzLXdpei1pbWfAAQE&sclient=img&ei=nPh2YvSCKsCfr7wP9-6rEA&bih=927&biw=958&hl=ko#imgrc=JkcU65RObbHKUM

지금 보이는 이미지는 Tree View인데 왼쪽에는 DAG가 정의되어 있고, 오른쪽에는 작업 실행 내역이 나와있다. Tree View를 통해, 나처럼 ETL/엔지니어링에 대한 지식이 부족한 분석가도 손쉽게 배치 작업을 제어할 수 있다. 

 

https://www.google.com/search?q=airflow+tree+view+upstream&tbm=isch&ved=2ahUKEwio3cravc73AhVAz4sBHYZLD-MQ2-cCegQIABAA&oq=airflow+tree+view+upstream&gs_lcp=CgNpbWcQAzoECAAQEzoECAAQHjoECAAQGFD6BVjSF2CkGGgBcAB4AIABmwGIAfEIkgEEMC4xMJgBAKABAaoBC2d3cy13aXotaW1nwAEB&sclient=img&ei=ofh2YuiIMMCer7wPhpe9mA4&bih=927&biw=958&hl=ko#imgrc=9vag4wzZtIjvRM

위 이미지는 불곰님의 블로그 스샷을 참고했다. Tree View에서 초록색 알갱이들을 클릭하면 위와 같은 뷰를 볼 수 있는데, 작업이 실패했을 경우 해당 작업만 재시작 할수 있다. 또한, 특정 시기를 기점으로 데이터에 문제가 생긴 경우 특정 시기 이후의 배치 작업만 다시 재처리 할 수도 있어서 매우 편리했다.

 

2. Airflow 설치

설치 방법은 공홈의 Installation from PyPI 문서를 참조했다.

https://airflow.apache.org/docs/apache-airflow/stable/installation/installing-from-pypi.html

 

Installation from PyPI — Airflow Documentation

 

airflow.apache.org

우선, 가상환경을 먼저 실행해주었다.

 

pip install "apache-airflow[celery]==2.3.0" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.3.0/constraints-3.7.txt"

그런 다음, Airflow를 설치해준다.

 

aiflow db init

db를 초기화 해주고

 

airflow users create --username admin --firstname dm --lastname j --role Ademin --email dongmin@zzang.co.kr --password blar

admin user를 생성해준다. 

 

여기까지 하고나면 홈 디렉토리에 airflow 폴더가 생성된 것을 확인할 수 있다.

 

export AIRFLOW_HOME=~/airflow

한번 더 홈 환경변수를 설정해주자.

 

airflow webserver -p 8080

webserver를 실행하고 다른 shell에서

 

airflow scheduler

airflow scheduler를 실행해준다.

 

그리고 나서 localhost:8080을 웹에서 실행하면 위와 같은 로그인 화면을 볼 수 있는데, username과 password를 차례대로 입력해준다. 참고로, GCP VM인스턴스에서 localhost는 외부 IP주소이다.

 

이후 로그인 하면 위와 같은 화면을 볼 수 있다.

 

가끔, 에어플로우 강제 종료가 안되는 경우가 있는데, 그럴 때는 sudo lsof -i tcp:8080 으로 8080포트로 실행되고 있느 프로세스들을 확인한 다음

 

 

sudo lsof -i tcp:8080 | grep 'user' | awk '{print $2}' | xargs kill -9 로 프로세스를 죽이고 다시 실행하면 된다.