Unix

Airflow 설치 & 세팅

ForceCore 2022. 7. 10. 14:34

Airflow를 왜 골랐는가?

ML이라면 kuberflow를 썼을 거 같음.

그리고 아주 간단한 작업이면 cron을 썼을 것이다. 하지만 문제가 있는데, 어중간하게 복잡하다는 것이다.

ex) 다운로드1, 다운로드2, 다운로드3을 한 다음 1, 2, 3이 잘 되었는지 확인을 하고싶고, 1, 2, 3은 병렬로 실행 가능하다.

Task DAG

 

작업들간의 실행 순서를 그래프로 (DAG) 표현한다면 위 처럼 될 것이다.

 

파이썬으로 작업을 정의할 수 있다는 것도 장점이라 선택을 함.

나름 오래 되기도 했고, 그래서 커뮤니티도 클 것이라고 판단.

 

 

 

Airflow

Airflow 설치

https://insaid.medium.com/setting-up-apache-airflow-in-ubuntu-d0317a59f8a4 를 따라했다.

시스템 패키지로 설치된 python3.9 기반으로 venv 생성함.

/home/ubuntu/usr/venv-3.9-airflow/bin/python

venv activate한 후,

pip install --upgrade pip
pip install wheel

이렇게 해야 패키지들이 잘 설치된다. (이 setup뿐 아니라 모든 venv 구축 하자마자 이 명령어들을 해주자)

이제 airflow 설치.

pip3 install "apache-airflow[gcp,sentry,statsd,celery]"

별 탈 없이 설치되었다.

  • celery는 airflow의 worker이다. webserver, scheduler와는 별개로, worker없이는 task가 실행이 되질 않을 것이다.
  • airflow celery worker 명령어로 워커 인스턴스를 붙여주면 된다.

DB setup

DB가 있어야한다. 근데 db setup을 하려면 설정파일이 필요하네? 설정파일을 생성하려면 일단 실행을 한 번 하니 sqlite 세팅으로 우선 실행부터 해보자.

airflow db init

이 되어야 하는데… 잘 됨 일단.

airflow users create --username admin --password "비밀번호" --firstname 이름 --lastname 이름 --role Admin --email 관리자메일주소

airflow users list 로 유저가 있나 확인. 잘 뵌다.

Airflow 실행

byobu를 켠다.

  1. cd ~/airflow
  2. airflow scheduler
  3. airflow webserver -p 59691

PC에서 http://hostname:59691 로 접속하니 잘 접속된다.

Postgresql 사용

웹페이지에 나오는 경고를 보면, postgres나 mysql db를 쓰라고 하네… 놔둬도 airflow가 작동은 할거 같은데… 이왕 하는 것 제대로 하자. airflow scheduler와 웹서버를 끈다.

유저와 테이블 생성은 아래와 같이 한다:

sudo su - postgres
psql

# sql prompt에서 airflow 유저 생성
CREATE DATABASE airflow_db;
CREATE USER airflow_user WITH PASSWORD '비밀번호';
GRANT ALL PRIVILEGES ON DATABASE airflow_db TO airflow_user;

이제 airflow보고 저 db를 쓰라고 해야한다.

airflow config get-value database sql_alchemy_conn # 현재 값 보려면.

보기만 할 수 있고, 변경은 config파일 변경 해야함.

vi ~/airflow/airflow.cfg

내용 중 이런게 있을 것이다.

sql_alchemy_conn = sqlite:////home/ubuntu/airflow/airflow.db

이거를

postgresql+psycopg2://airflow_user:<passwd>@localhost/airflow_db

이렇게 바꿔준다. 근데 비번이 적히게 되었으니 chmod 600 ~/airlfow/airflow.cfg 를 해주자.

airflow scheduler를 실행 해보면, psycopg2 모듈이 없다고 실행이 안 되니 설치해줘야 함. 비번에 특수분자가 있다면 urlencode 돌리면 되는데, %자체도 설정파일의 excape sequence라서, urlencode 돌려서 나온 결과의 %는 %%로 교체하긴 할 것이다.

pip install psycopg2-binary

실행해보니 db init을 다시 해야하네. 유저 추가도.

airflow db init
airflow users create --username admin --password "비밀번호" --firstname 이름 --lastname 이름 --role Admin --email 이메일

설정 끝!

systemctl화

스케쥴러

[Unit]
Description=Airflow Scheduler
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/home/ubuntu/usr/venv-3.9-airflow/bin/airflow scheduler
WorkingDirectory=/home/ubuntu/airflow
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

웹서버

[Unit]
Description=Airflow Webserver
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/home/ubuntu/usr/venv-3.9-airflow/bin/airflow webserver -p 포트번호
WorkingDirectory=/home/ubuntu/airflow
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

쉽다.

Worker 붙이기

airflow celery worker를 실행하면…

airflow command error: argument GROUP_OR_COMMAND: celery subcommand works only with CeleryExecutor, CeleryKubernetesExecutor and executors derived from them, your current executor: SequentialExecutor, subclassed from: BaseExecutor, see help above.

이런, 생각보다 잘 안 붙음. 일단은 config를 다시 바꿔야 함.

~/airflow/airflow.cfg 에 executor = 을 CeleryExecutor 로 바꾸고 airflow-scheduler,webserver 서비스를 재실행.

worker의 에러가 바뀌었다.

could not translate host name "postgres" to address: Temporary failure in name resolution

result_backend 가 config에서 틀려서 그렇다.

result_backend = db+postgresql+psycopg2://airflow_user:PASSWD@localhost/airflow_db

이렇게 바꿈

File "/home/ubuntu/usr/venv-3.9-airflow/lib/python3.9/site-packages/kombu/transport/redis.py", line 262, in <module>
    class PrefixedStrictRedis(GlobalKeyPrefixMixin, redis.Redis):
AttributeError: 'NoneType' object has no attribute 'Redis'
[2022-07-10 04:59:25 +0000] [1445844] [INFO] Shutting down: Master

이건 또 뭐냐

pip install Redis를 하란다?

[2022-07-10 05:00:58,666: ERROR/MainProcess] consumer: Cannot connect to redis://redis:6379/0: Error -3 connecting to redis:6379. Temporary failure in name resolution..
Trying again in 2.00 seconds... (1/100)

로 바뀐 것 보니 거의 다 온 것 같군. 레디스 서버만 돌리면 될 것 같다 이제.

sudo apt install redis-server

redis가 알아서 6379포트에서 돌아가기 시작한다.

그리고 worker가 생각하는 redis hostname이 redis네, localhost로 바꿔야 할 듯. airflow.cfg의 broker_url 설정이다.

웹서버, 스케쥴러를 재시작하니 붙는다.

[2022-07-10 05:05:45,069: INFO/MainProcess] Connected to redis://localhost:6379/0
[2022-07-10 05:05:45,073: INFO/MainProcess] mingle: searching for neighbors
[2022-07-10 05:05:46,080: INFO/MainProcess] mingle: all alone
[2022-07-10 05:05:46,090: INFO/MainProcess] celery@galacticpunks ready.

휴;;

Task가 도는가? 돈다.

worker 1개당 16개 (디폴트) task (DAG의 node) 를 parallel하게 실행 가능함. → https://jybaek.tistory.com/923

[Unit]
Description=Airflow Celery Worker
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/home/ubuntu/usr/venv-3.9-airflow/bin/airflow celery worker
WorkingDirectory=/home/ubuntu/airflow
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

이걸로 systemctl에 등록함.