Airflow를 왜 골랐는가?
ML이라면 kuberflow를 썼을 거 같음.
그리고 아주 간단한 작업이면 cron을 썼을 것이다. 하지만 문제가 있는데, 어중간하게 복잡하다는 것이다.
ex) 다운로드1, 다운로드2, 다운로드3을 한 다음 1, 2, 3이 잘 되었는지 확인을 하고싶고, 1, 2, 3은 병렬로 실행 가능하다.
작업들간의 실행 순서를 그래프로 (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를 켠다.
- cd ~/airflow
- airflow scheduler
- 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에 등록함.