Milky's note

[Airflow] Airflow db 변경 본문

DevOps/Airflow

[Airflow] Airflow db 변경

밀뿌 2024. 8. 23. 20:25

 

전 글에서 잠깐 설명한 Airflow default DB를 sqlite에서 MySQL로 바꾸는 작업과

GCP 인스턴스에 설치한 Airflow를 서비스(데몬)으로 띄우는 작업에 대해서 글을 쓰려고 한다.

 

만약 아직 Airflow를 설치하지 않았다면 이전 글을 참고해서 Airflow부터 설치해야 한다.

 

https://milkyspace.tistory.com/127

 

[Airflow] 설치 (by.GCP 환경)

GCP에 Airflow를 설치하려면 당연히 인스턴스가 있어야 한다.혹시나 인스턴스 생성이 안되어 있다면 이전 게시글을 참조하면 된다. https://milkyspace.tistory.com/125 [GCP] VM Instance 생성 및 고정 IP 할당GCP

milkyspace.tistory.com

 

3. MySQL 설치 및 db생성, 계정 권한 부여

Airflow의 DB를 MySQL로 변경하기 전에 먼저 설치를 해야 한다.

설치 방법은 apt-get 명령어를 이용해서 쉽게 설치할 수 있다.

 

  • MySQL 설치
sudo apt-get install mysql-server
sudo apt-get install mysql-client  libmysqlclient-dev pkg-config
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

 

아래 명령어를 입력해서  mysql 서버로 접속이 되면 설치는 쉽게 완료되었다.

/usr/bin/mysql –u root –p

# password는 그냥 엔터

 

 

  • db생성 및 계정 권한 부여

위에 명령어로 MySQL을 설치해주고 난 뒤,

MySQL 서버에 접속하여 Airflow meta data와 dag들을 저장할 airflow 전용 db를 생성해준다.

 

나는 관리의 용이성을 위해 airflow 전용 사용자를 추가로 만들어주어서 진행했다.

(사실 아래 스크린샷에는 user를 만들지 않고 그냥 root에 권한을 주었는데 이렇게 되니까 뒤에서 꼬여서 admin이라는 user로 다시 생성해주었다..ㅜ)

#mysql 접속
mysql -u root -p

#airflow db 전용 user 생성
mysql> create user '{user명}'@'localhost' IDENTIFIED BY '{패스워드}';

#airflow db 생성
mysql > create database airflow(db명);

#airflow user에 airflowdb 권한 부여
mysql> GRANT ALL PRIVILEGES ON airflow(db명).* TO '{user명}'@'localhost';

 

4. Airflow db 변경(MySQL)

위에서 생성한 MySQL로 이제 Airflow의 DB를 변경해주는 작업을 진행하면 된다.

어려운 방법은 아니고 config 정도만 바꿔주고 초기화를 해주면 된다.

 

  • airflow.cfg 수정

Airflow가 설치된 경로에 가서 airflow.cfg 파일을 찾아서 vi로 열어준다.

그 파일에서 쭉 내리다 보면 다음과 같은 세 개의 변수들이 보일 것이다.

이 세 개의 설정을 아래와 같이 변경해주면 된다.

여기도 mysql user가 root로 되어있는 스크린샷인데 꼭 airflow user로 변경 해주어야 한다!! ㅠ

 

[참고. executor]

설정값
의미
SequentialExecutor
(Default)
task가 한 번에 한 개만 수행
- Airflow DB가 sqlite(싱글작업만 가능)일 때 유일하게 가능한 executor 설정
LocalExecutor
task들이 local에서 병렬적으로 수행
- Unlimited Parallelism : task 개수 제한 없음
- Limited Parallelism : task 개수 제한 있음 (task queue 존재)

 

  • 추가 설정

Airflow에 MySQL을 연결하기 위해 필요한 패키지를 추가로 설치해 주었다.

pip install mysqlclient

 

  • dags 폴더 생성

airflow.cfg에 보면 dag들 경로도 설정되어 있는 부분이 있는데

이 폴더는 default로 존재하지 않아서 추가로 dags라는 폴더를 생성해주었다.

 

  • airflow db init (초기화)

이제 설정을 끝낸 MySQL과 Airflow를 연결시키기 위해 Airflow의 DB를 초기화 해준다.

 

초기화를 해주면 위와 같이 mysql과 연결되었다는 메세지를 확인할 수 있다.

그리고 mysql에 생성한 airflow db의 table를 확인해보면 airflow meta table들이 생겼는지 한 번 더 확인을 해준다.

아래처럼 잘 보이면 Airflow의 db가 정상적으로 변경된 것이다.

 

  • Airflow 계정 생성

이제 Airflow를 접속할 계정을 생성해준다.

계정을 생성하는 명령어는 다음과 같다.

airflow users create \ 
--username <유저ID> \ 
--firstname <유저 firstname> \ 
--lastname <유저 lastname> \ 
--role <유저 role> \ 
--email <유저 email>

 

  • Airflow Server 실행 및 로그인

생성한 user와 db 전환이 잘 되었는지 Airflow Webserver를 실행하고 접속을 해보려고 한다.

다음과 같은 명령어로 airflow webserver를 기동 시킬 수 있다.

이전 글에서 airflow를 설치할 때 설정해준 port를 넣어주면 된다.

airflow webserver -p 8080

 

이제 직접 UI에서 접속을 해보자 !

 

접속이 잘 되는 것을 확인 했고 원래 sample dag들이 몇 개 있는데,

위에서 airflow.cfg 파일에서 load_example를 False로 변경해주어서 sample dag들은 없다.

이제 설치는 아주 정상적으로 되었다.

 

 

아래부터는 선택사항인데 Airflow의 webserver와 scheduler가 GCP 서버가 시작되면 자동으로 시작되도록 서비스로 등록해줄 것이다.

 

5. Airflow의 webserver와 scheduler 서비스 등록

먼저 airflow-webserver와 airflow-scheduler를 서비스로 만들어준다.

#airflow-webserver.service 생성
sudo vi /etc/systemd/system/airflow-webserver.service

[Unit]
Description=Airflow webserver daemon
After=network.target mysql.service
wants=mysql.service

[Service] 
Environment="AIRFLOW_HOME=/home/airflow/airflow"
User=airflow 
Group=airflow 
Type=simple
ExecStart=/usr/local/bin/airflow webserver 
Restart=on-failure 
RestartSec=5s 
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

#airflow-scheduler.service 생성
sudo vi /etc/systemd/system/airflow-scheduler.service

[Unit]
Description=Airflow scheduler daemon
After=network.target mysql.service
wants=mysql.service

[Service]
Environment="AIRFLOW_HOME=/home/airflow/airflow" 
User=airflow 
Group=airflow 
Type=simple
ExecStart=/usr/local/bin/airflow scheduler
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

그리고 데몬을 재실행 해준다.

cd /usr/bin/python3 
sudo systemctl daemon-reload

 

그리고 아래 명령어를 입력해주면 GCP 인스턴스가 실행 시 자동으로 Airflow가 시작되게 할 수 있다.

#서버 실행시 자동으로 시작되게끔 하기
sudo systemctl enable airflow-webserver 
sudo systemctl enable airflow-scheduler

#서비스 시작하기
sudo systemctl start airflow-webserver 
sudo systemctl start airflow-scheduler

#서비스 상태 확인하기
sudo systemctl status airflow-webserver 
sudo systemctl status airflow-scheduler

 

 

이제 설치랑 환경 설정은 모두 끝났고 Airflow의 Dags들만 잘 만들어서 ETL 파이프라인 개발에 사용하면 된다 !!!!!!!!!

Comments