본문 바로가기

공부

Airflow 에서 직면한 여러 환경 설정 오류 해결

반응형

 

  1. 새로운 conda 환경 생성

파이썬은 3.X 버전, 환경 이름은 airflow_env 라 지정했다.

새로 만든 환경을 활성화시킨다.

conda create -n airflow_env python=3.X
conda activate airflow_env

 

2. 에어플로우 설치

나는 airflow 2.9.3 버전을 설치해주었다.

설치하면, 홈 디렉토리에 airflow 라는 폴더가 하나가 생겼다.

pip3 install apache-airflow==2.9.3

 

[!오류]
계속 airflow 를 설치를 해줬는데, airflow 명령어를 실행하면 관련 명령어가 나와야 하는데, 나오지 않았다.
이유는 모르겠지만 해결했음

처음에는 
% pip3 install apache-airflow==2.9.3 
을 해주고 잘 될 줄 알았는데, conda list의 값이 비어있어서
% conda install apache-airflow
해주었지만, airflow 명령어에 계속 
"zsh: command not found: airflow" 라는 오류를 뽑아냄
conda uninstall, pip uninstall 등등을 하다가
마지막에는 
% pip3 uninstall apache-airflow
% pip install apache-airflow==2.9.3
해주니까 
% airflow version
결과값이 나옴

 

3. 다른 폴더에서 아래와 같이 snowflake를 install 해주고, 연결이 되는지 확인했다.

import snowflake.connector

# Snowflake 연결 정보
conn = snowflake.connector.connect(
    user="LUNA",
    password="",
    account="XXXXXX-XXXXXXX"
)

# 커서 생성
cur = conn.cursor()

# 현재 계정 정보 확인
cur.execute("SELECT CURRENT_USER(), CURRENT_ROLE(), CURRENT_WAREHOUSE(), CURRENT_DATABASE(), CURRENT_SCHEMA();")

# 결과 출력
for row in cur.fetchall():
    print(row)

# 연결 종료
cur.close()
conn.close()

 

 

4. airflow 폴더로 이동하고, airflow 데이터베이스를 초기화해 주어야 한다.

% cd airflow

airflow 내부에는 아래와 같이 되어있다.

사실 좀 걱정했던게, snowflake 에 대한 정보에 영향이 있을까 싶었는데, 그런 부분은 아닌듯

아래 명령어는 db에 reach가 가능한지를 확인한다.

% airflow db check

 

그리고 airflow db init으로 데이터베이스를 초기화해준다.

% airflow db init

 

그러면 아래와 같이 값이 나오는데, 뭔가 쎄하다. SQLite를 사용하는게 아니라 SQL을 사용하기 때문이다.

 

알고보니, airflow기본 DB는 SQLite이라고 한다.

간단한 DAG 구성에는 기본으로 제공되는 DB를 사용해도 무방하지만 SQLite를 백엔드 DB로 사용하면 병렬 처리를 하지 못한다는 치명적인 단점이 존재한다. DAG내에 task 구성을 병렬적으로 구성해도 순서대로 처리하게 되는데 이를 해결하기 위해 Airflow의 백엔드 DB를 MySQL로 변경한다.

 

5. MySQL Server로 변경하기

 

6. airflow run

아래 명령어에서 airflow를 실행할 수 있다.

airflow webserver -p 8080

 

그러면 아래와 같은 창이 떴다.

[오류 해결]
처음에 localhost:8080 에 들어갔을 때 아래의 오류가 발생
(로그에 뜨는 "Listening at: http://0.0.0.0:8080 (40954)" 를 통해서 들어가면 계속 안보여서 내 잘 못인줄 알았지만,, 저 링크타고는 안들어가진다. 저 링크를 command + 클릭을 하면 "about:blank" 에 들어가짐!!)

The scheduler does not appear to be running.
The DAGs list may not update, and new tasks will not be scheduled.

Do not use SQLite as metadata DB in production – it should only be used for dev/testing. We recommend using Postgres or MySQL.
Click here for more information. Do not use the SequentialExecutor in production. Click here for more information.
The scheduler does not appear to be running
맨 위의 문제는 Airflow 스케쥴러 실행 오류 해결을 해야 되는 부분이다.
1. 먼저 스케쥴러가 실행 중인가?
ps aux | grep airflow
2. 만약에 스케줄러가 실행되지 않았다면, 다음 명령어로 실행할 수 있다.
airflow scheduler &

두번째는 Airflow UI에서 경고 메시지에 나와 있듯이, SQLite는 개발/테스트 용도로만 사용해야 한다.
SQLite는 멀티 프로세스 환경에서 안정적으로 동작하지 않으므로, MySQL 또는 PostgreSQL로 변경이 필요하다.
1. 사용중인 DB 확인
airflow config get-value core sql_alchemy_conn
확인해본 결과 = "sqlite:////Users/na0/airflow/airflow.db" 
위와 같이 sqlite로 나왔기에, SQLite를 사용중이기에 MySQL 또는 PostgreSQL을 사용하도록 변경한다.

2. MySQL로 변경 (airflow.cfg 수정)
nano ~/airflow/airflow.cfg

3. sql_alchemy_conn 값을 MySQL 또는 PostgreSQL 연결 정보로 변경
sql_alchemy_conn = mysql+mysqlconnector://username/(생략)/airflow
위와같이 앞부분을 변경해주면 된다.

 

그러나 내가 원하는 dags의 값들이 안뜨고 airflow/example_dags/example 에서 가져온 예제들만 떠있다.

그래서 아래의 명령어로 어디서 dags를 가져오고 있는지를 확인한다.

airflow config get-value core dags_folder

 

그러면 다른 곳에서 가져오고 있다는 것을 확인하고, 

DAG 폴더를 dags_folder에 심볼릭 링크로 연결시킨다.

ln -s ~/na0-airflow/airflow/dags ~/airflow/dags

 

그래서 딱히 변화한 값이 없는것 같지만, ㅡ아래처럼 새로운 파일들이 생겼다.

 

근데 계속 다른 파일로 인식해서, 설정을 다시 해주었다. 

기본 airflow home 디렉토리를 수정했다.

그랬더니 airflow 파일 내부에 다양한 것들이 생겼는데,

sql이 제대로 적용이 안되어서 

sudo nano /etc/pf.conf
pass in proto tcp from any to any port 3306
sudo pfctl -sr | grep 3306

 

---

사실 내 오류는 pip install mysqlclient 가 설치가 안되어서 헤맸던 건데, 

brew로 아래 처럼 해주니 됐다... 헐..

$ brew install mysql pkg-config

$ pip install mysqlclient

그리고 나서 mysql 접속이 되는지 확인하기 (서버를 실행시켜야 한다.)

brew services list
brew services start mysql
mysql -u root -p

 

그리고 아래 처럼 수정해주었다.

1. sql_alchemy_conn = mysql+mysqlconnector://airflow_user:your_password@127.0.0.1:3306/airflow

2. MySQL 데이터 베이스 생성

MySQL에 Airflow용 데이터베이스가 존재하지 않기 때문에, 새로운 데이터베이스를 생성해

mysql -u root -p

비밀번호 입력 후, MySQL 프롬프트 아래를 실행

CREATE DATABASE airflow;
CREATE USER 'airflow_user'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON airflow.* TO 'airflow_user'@'localhost';
FLUSH PRIVILEGES;

이후 exit;

로 MySQL에서 나온다.

 

그러나 아래처럼 안뜨는건 매한가지.

그래도 뭔가 마음이 편해진다.

aws provider를 설치하라고 에러가 난 후 봐서 그런지, 뭔가 일단은 알맞게 되었고, 그냥 에러가 떠서 dag들이 안뜬 것 같다는 생각이 들었다.

그래서 확인해보니, Airflow는 DAG의 문법 오류 또는 import 오류가 있다면, DAG를 표시하지 않는다고 한다.

아래 명령으로 에러 로그를 확인할 수 있었다.

airflow dags list-import-errors

 

출력 결과가 비어야 되는데, 아닌경우에는

DAG 에서 어떤 import 나 error가 존재한다는 뜻

 

생각보다 많은 오류들이 나와서 다양한 패키지들을 설치해주었다.

 

+

이런 저런 시도를 하다가 새로운 가상 환경(airflow2_env)도 만들어보고

에러 뜬거 설치하고 그랬다.

 

airflow.db 관련 경로 설정 시에

문제였던거는 sql 이 46 char만 받을 수 있다고 해서,, 경로가 너무 길어지면 아예 import 가 안되었다.

그리고 다른 폴더로 파서 새로 clone 해서 진행했다.

 

그러다가 생각해보니까 그냥 한 파일이 아니라,

기본 airflow.db 로 db 설정을 시켜줄까 싶어서 진행했다.

(나중에 두번째 판 파일에서도 돌아가도록 해봐야겠다.)

 

바꾸어서 해결 됐다고 생각하는 것

처음에 SQLite 관련
- brew 로 관련 패키지 다운
- pip 로 필요한 라이브러리 다운
- mysql conn 설정 : sql_alchemy_conn = mysql+mysqlconnector://admin:admin@127.0.0.1:3306/airflow
- executor = LocalExecutor 로 바꿔줌 : 멀티로 돌릴 수 있도록
- mysql 서버 켜주어야 함(or DB 생성까지?)

도움이 된 명령어
airflow info
airflow config list
airflow dags list
airflow dags list-import-errors

 

출처 및 참고

- https://robomoan.medium.com/ubuntu-환경에서-airflow-구성하기-2-fce0dfd42e00

- https://seill.tistory.com/1139

- https://velog.io/@qkr135qkr/Docker-환경-Airflow의-SMTP-설정법

- https://spidyweb.tistory.com/349

- https://xhaqhdl.tistory.com/40

- https://spidyweb.tistory.com/349

 

반응형