본문 바로가기
Data Engineering

Amazon Linux 2 Airflow 2.4 설치 가이드 (KOR)

by KaneTheDataEngineer 2023. 7. 10.

1. Private Instance 생성

  • Airflow가 설치될 EC2를 Private Subnet에 생성한다
  • 인스턴스 사이즈의 경우 공식 문서에 명시된 Airflow 실행에 필요한 최소 메모리는 4GB이기 때문에 적당한 사이즈로 선택 (본 가이드에서는 t3.medium으로 진행)
  • 보안 그룹 Inbound Rule

Bastion으로부터의 SSH 22번 포트

Bastion으로부터의 Web Server로 사용할 포트 (default는 8080)

  • Tunneling 하여 접속 (22)
 

2. Airflow 2.4 설치

파이썬 3.0 pip 설치

yum update / pip3 install

sudo yum update -y
sudo yum install -y python3-pip

Airflow 2.4 설치

  • airflow 및 필요한 provider 등 패키지 설치
  • sudo 실행이 가능한 ec2-user 등에서 진행할 것
  • 필요한 패키지만 설치할 것
#sudo yum install -y postgresql-server-dev-all
#sudo yum install -y libmysqlclient-dev
sudo pip3 install numpy
sudo pip3 install pandas
sudo pip3 install apache-airflow==2.4.2
sudo pip3 install apache-airflow-providers-postgres==2.2.0
sudo pip3 install apache-airflow-providers-mysql==2.2.0
sudo pip3 install apache-airflow-providers-amazon==2.3.0
sudo pip3 install apache.airflow.providers.slack
sudo pip3 install apache.airflow.providers.google
sudo pip3 install SQLAlchemy==1.3.23
sudo pip3 install oauth2client
sudo pip3 install gspread
sudo pip3 install typing_extensions

# snowflake 관련 provider 설치
sudo pip3 install apache-airflow-providers-common-sql
sudo pip3 install snowflake-connector-python
sudo pip3 install snowflake-sqlalchemy
sudo pip3 install apache-airflow-providers-common-sql
sudo pip3 install apache-airflow-providers-snowflake

⇒ 에어플로우 버전은 원하는 버전으로 수정 가능

Airflow 계정 생성

  • airflow 서비스를 airflow 사용자를 기반으로 실행시키기 위해 airflow 계정을 생성한다. 이때 홈 디렉토리는 /var/lib/airflow로 설정한다.
sudo groupadd airflow
sudo useradd -s /bin/bash airflow -g airflow -d /var/lib/airflow -m
  • airflow 계정으로 접속하여 홈 디렉토리 확인 및 airflow 명령어 동작하는 지 확인
sudo su - airflow
cd ~
# dags 폴더 생성
mkdir dags
AIRFLOW_HOME=/var/lib/airflow airflow db init

# 이때 아래와 같이 나오면 정상
Traceback (most recent call last):
  File "/usr/local/bin/airflow", line 5, in <module>
    from airflow.__main__ import main
  File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 35, in <module>
    from airflow import settings
  File "/usr/local/lib/python3.7/site-packages/airflow/settings.py", line 35, in <module>
    from airflow.configuration import AIRFLOW_HOME, WEBSERVER_CONFIG, conf  # NOQA F401
  File "/usr/local/lib/python3.7/site-packages/airflow/configuration.py", line 1187, in <module>
    conf.validate()
  File "/usr/local/lib/python3.7/site-packages/airflow/configuration.py", line 224, in validate
    self._validate_config_dependencies()
  File "/usr/local/lib/python3.7/site-packages/airflow/configuration.py", line 278, in _validate_config_dependencies
    f"error: sqlite C library version too old (< {min_sqlite_version}). "
airflow.exceptions.AirflowConfigException: error: sqlite C library version too old (< 3.15.0). See <https://airflow.apache.org/docs/apache-airflow/2.2.5/howto/set-up-database.html#setting-up-a-sqlite-database>

=> 이는 아래의 db 활성화 단계를 거치지 않아 발생하는 에러이기 때문에 무시할 것

# ll로 확인 시 아래와 같음
-rw-rw-r-- 1 airflow airflow 44512 Nov  3 08:00 airflow.cfg
drwxrwxr-x 2 airflow airflow     6 Nov  3 08:00 dags
-rw-r--r-- 1 airflow airflow  4695 Nov  3 08:00 webserver_config.py

PostgreSQL 설치 (Airflow 메타데이터 저장소)

  • Airflow는 기본적으로 SQLite를 사용하나 이는 Single Thread이기 때문에 다수의 DAG나 Task가 실행되는 것을 지원하지 못함.

PostgreSQL 10 설치

  • 먼저 ec2-user로 변경
exit
  • ec2-user에서 아래 명령어 실행
sudo amazon-linux-extras install postgresql13 epel -y
sudo yum install postgresql-server postgresql-devel -y
  • 설치 완료 후 버전 확인 및 initdb
/usr/bin/postgres --version
sudo /usr/bin/postgresql-setup --initdb

PostgreSQL 설정 파일 변경

  • root 유저로 변경 : sudo su -
  • postgresql.conf 수정
vi /var/lib/pgsql/data/postgresql.conf
# 파일 열어서 listen_addresses 및 port 주석 해제하고 listen_addresses '*'으로 수정
# 전체 listen 할 수 있게 함

----
# - Connection Settings -
listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
  • postgres 재시작
service postgresql restart
  • postgresql의 계정 추가
vi /var/lib/pgsql/data/pg_hba.conf

# 파일 열어서 기존 것 IPv4 local connection 주석처리 후 airflow 계정 추가
---
# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            ident
host    all             airflow         0.0.0.0/0               trust
# IPv6 local connections:
host    all             all             ::1/128                 ident
  • postgres 재시작
service postgresql restart

Postgres 접속하여 Airflow 가 사용할 Postgres 계정 및 DB 생성

  • postgres 사용자로 변경 후 airflow 계정 및 DB 생성
su - postgres

# postgres 실행
-bash-4.2$ psql

postgres=# CREATE USER airflow PASSWORD 'airflow';
CREATE ROLE
postgres=# CREATE DATABASE airflow;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE airflow to airflow;
GRANT
postgres=# \q
  • 다시 root로 나와 postgresql 재시작
exit
[root@ip-10-0-2-23 ~]# service postgresql restart

Airflow 초기화

PostgreSQL로 메타데이터 저장소 변경

  • Airflow 계정으로 변경
sudo su - airflow

Airflow 환경 파일(/var/lib/airflow/airflow.cfg) 편집

  • “executor”를 SequentialExecutor에서 LocalExecutor로 수정한다
  • DB connection(“sql_alchemy_conn”)을 앞서 설치한 Postgres로 바꾼다

이 경우 ID와 PW와 데이터베이스 이름이 모두 airflow를 사용하고 호스트 이름은 localhost를 사용한다

  • “load_examples” 설정을 False로 바꾼다
  • timezone을 서울시간으로 바꾼다

default_ui_timezone 값을 Asia/Seoul로 수정 (Web UI의 시간대)

default_timezone 값을 Asia/Seoul로 수정 (스케줄러의 시간대)

vi /var/lib/airflow/airflow.cfg

# 아래와 같이 수정
--- 
[core]
...
executor = LocalExecutor
...
sql_alchemy_conn = postgresql+psycopg2://airflow:airflow@localhost:5432/airflow
...
load_examples = False
...
default_ui_timezone = Asia/Seoul
...
default_timezone = Asia/Seoul
  • 저장 후 airflow db init
AIRFLOW_HOME=/var/lib/airflow airflow db init

Airflow 웹서버 및 스케줄러 실행

  • airflow 웹서버  스케줄러를 각각 서비스로 등록한다.
  • root로 접속
exit
  • 웹서버  스케줄러를 각각 서비스로 등록한다
  1. 웹서버
  • 웹서버 서비스 생성
sudo vi /etc/systemd/system/airflow-webserver.service
  • 아래 코드 붙여넣기
[Unit]
Description=Airflow webserver
After=network.target

[Service]
Environment=AIRFLOW_HOME=/var/lib/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/usr/local/bin/airflow webserver -p 8080
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target

2. 스케줄러

  • 스케줄러 서비스 생성
sudo vi /etc/systemd/system/airflow-scheduler.service
  • 아래 코드 붙여넣기
[Unit]
Description=Airflow scheduler
After=network.target

[Service]
Environment=AIRFLOW_HOME=/var/lib/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/usr/local/bin/airflow scheduler
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target

3. 웹서버 및 스케줄러 서비스 활성화

sudo systemctl daemon-reload
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 WebServer 로그인 어카운트 생성

  • Airflow 계정으로 로그인
sudo su - airflow
  • admin user 생성
AIRFLOW_HOME=/var/lib/airflow airflow users create --role Admin \
--username admin --email admin --firstname admin --lastname admin \
--password admin4321

# 결과창
[2022-11-03 08:22:22,686] {manager.py:779} WARNING - No user yet created, use flask fab command to do it.
[2022-11-03 08:22:22,973] {manager.py:512} WARNING - Refused to delete permission view, assoc with role exists DAG Runs.can_create User
[2022-11-03 08:22:26,508] {manager.py:214} INFO - Added user admin
User "admin" created with role "Admin"

# 위에서 username 및 password를 원하는대로 설정할 수 있다
  • cf) user 삭제 방법
AIRFLOW_HOME=/var/lib/airflow airflow users delete --username admin
 

3. Tunneling을 통한 Airlfow Webserver 접속

  • Bastion으로 Tunneling하여 8080포트로 접속한다

⇒ bastion의 22번 포트가 airflow server와 local의 8080포트로 터널링함

 

기타 사항

Snowflake 필요 패키지

  • snowflake connector는 airflow 2.3에서 에러가 발생함
  • 따라서 airflow 2.4.2 버전 설치 후 에러 해결됨
apache-airflow
apache-airflow-providers-common-sql
snowflake-connector-python
snowflake-sqlalchemy
apache-airflow-providers-common-sql
apache-airflow-providers-snowflake

$AIRFLOW_HOME 영구 설정

  • 리눅스 airflow 계정에 들어가서
vi .bashrc

# 아래와 같이 export 구문 추가

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
export AIRFLOW_HOME=/var/lib/airflow

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

'Data Engineering' 카테고리의 다른 글

AWS EMR 클러스터 생성 가이드  (0) 2023.07.10
AWS Glue JDBC 병렬 처리 성능 테스트  (0) 2023.07.10