airflow(에어플로우)
airflow 실행 환경 관리
데이터왕
2024. 1. 4. 21:47
실습파일 다운 및 세팅
- 실습파일을 다운로드
weare@DESKTOP-BE1I4GE:~$ git clone https://github.com/learndataeng/learn-airflow.git
Cloning into 'learn-airflow'...
remote: Enumerating objects: 219, done.
remote: Counting objects: 100% (95/95), done.
remote: Compressing objects: 100% (93/93), done.
remote: Total 219 (delta 31), reused 2 (delta 0), pack-reused 124
Receiving objects: 100% (219/219), 71.07 KiB | 6.46 MiB/s, done.
Resolving deltas: 100% (106/106), done. - 다운 받은 파일로 이동
weare@DESKTOP-BE1I4GE:~$ cd learn-airflow - docker-compose.yaml 파일 다운
weare@DESKTOP-BE1I4GE:~/learn-airflow$ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.5.1/docker-compose.yaml'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10493 100 10493 0 0 31703 0 --:--:-- --:--:-- --:--:-- 31796 - 필요한 폴더 만듦
weare@DESKTOP-BE1I4GE:~/learn-airflow$ mkdir -p ./dags ./logs ./plugins - .env 파일을 생성하고, 그 내용으로 AIRFLOW_UID와 AIRFLOW_GID 변수를 설정
weare@DESKTOP-BE1I4GE:~/learn-airflow$ echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env - docker-compose.yaml 파일 수정
5가지를 수정해야하고, 수정내용은 아래와 같다.
1) environment 에 Airflow에서 사용하는 데이터 디렉토리를 /opt/airflow/data로 설정
AIRFLOW_VAR_DATA_DIR: /opt/airflow/data
2) 처음 설치 모듈들 추가
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- yfinance pandas numpy oauth2client gspread}
3) 볼륨 설정. 호스트의 ${AIRFLOW_PROJ_DIR:-.}/data 경로를 컨테이너 내부의 /opt/airflow/data 경로로 마운트
- ${AIRFLOW_PROJ_DIR:-.}/data:/opt/airflow/data
4) mkdir~ : /sources/data 폴더 추가
5) chown~: AIRFLOW_UID에 지정된 사용자 ID를 소유자로 설정하고, 0은 그룹을 root 그룹으로 설정.
data 폴더에 대해 명령어를 수행 - 컨테이너 실행, 맨뒤에 -d 넣으면 서버 실행돼서 우분투 하나더 실행 안해도 됨
weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker-compose up -d - docker 데스크탑으로 확인하면 잘 실행됨
- 저장된 data_dir이 저장된 위치 확인.
weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73c2ebf8ecec apache/airflow:2.5.1 "/usr/bin/dumb-init …" 10 minutes ago Up 10 minutes (healthy) 8080/tcp learn-airflow_airflow-triggerer_1
90cb7b11d245 apache/airflow:2.5.1 "/usr/bin/dumb-init …" 10 minutes ago Up 10 minutes (unhealthy) 8080/tcp learn-airflow_airflow-scheduler_1
a5bacafc0519 apache/airflow:2.5.1 "/usr/bin/dumb-init …" 10 minutes ago Up 10 minutes (healthy) 8080/tcp learn-airflow_airflow-worker_1
065f9ee9e619 apache/airflow:2.5.1 "/usr/bin/dumb-init …" 10 minutes ago Up 10 minutes (healthy) 0.0.0.0:8080->8080/tcp learn-airflow_airflow-webserver_1
cd5a97a54a1c redis:latest "docker-entrypoint.s…" 29 minutes ago Up 12 minutes (healthy) 6379/tcp learn-airflow_redis_1
73ed8fe8f6d1 postgres:13 "docker-entrypoint.s…" 29 minutes ago Up 12 minutes (healthy) 5432/tcp learn-airflow_postgres_1
weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker exec -it 90cb7b11d245 airflow variables get DATA_DIR
/home/airflow/.local/lib/python3.7/site-packages/airflow/models/base.py:49 MovedIn20Warning: [31mDeprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. [32mTo prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". [36mSet environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings. Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message.[0m (Background on SQLAlchemy 2.0 at: https://sqlalche.me/e/b8d9)
/opt/airflow/data
airflow 실행환경 관리
- 기타 환경설정값들(variables, connections 등) 어떻게 관리/배포할까?
보통 docker-compose.yml 파일에서 관리 - 어디까지 airflow 이미지로 관리하고 뭘 docker-compose.yml에서 관리할까?
- 두가지 실행환경 : 에어플로우(Apache Airflow) 이미지, Docker Compose
1. **에어플로우 이미지:**
- **개념:** 에어플로우 이미지는 에어플로우 및 관련 의존성, DAGs, 설정 파일 등이 미리 패키징된 Docker 이미지입니다. 이 이미지는 에어플로우를 실행하는 데 필요한 모든 것을 포함합니다.
- **용도:** 이미지는 여러 환경 (개발, 테스트, 프로덕션)에서 일관된 에어플로우 환경을 유지하고, 배포를 단순화하는 데 사용됩니다.
2. **Docker Compose:**
- **개념:** Docker Compose는 여러 컨테이너를 정의하고 관리하는 도구로, YAML 파일에 컨테이너 설정을 기술합니다. 이를 사용하여 여러 서비스를 하나의 프로젝트로 정의하고 실행할 수 있습니다.
- **용도:** `docker-compose.yml` 파일은 여러 컨테이너를 동시에 실행하고, 서비스 간의 의존성, 네트워킹, 볼륨 마운트 등을 설정하는 데 사용됩니다. 즉, 여러 서비스를 함께 실행하고 관리하는 데 도움이 됩니다.
**차이점:**
- **에어플로우 이미지:** 에어플로우와 관련된 모든 것을 패키징한 이미지. 에어플로우 자체, DAGs, 설정 파일, 의존성 등이 이미지에 포함됨.
- **Docker Compose:** 여러 컨테이너를 정의하고 관리하는 도구. 여러 서비스를 정의하고 이를 함께 실행할 때 사용. 컨테이너의 구성, 네트워킹, 데이터 볼륨 등을 관리.
일반적으로, 에어플로우 이미지는 에어플로우 환경을 패키징하고, Docker Compose는 여러 서비스를 함께 실행하고 이를 관리하는 데 사용됩니다. `docker-compose.yml` 파일에서는 에어플로우 이미지를 어떻게 사용할지, 각 컨테이너 간의 상호작용을 어떻게 설정할지 등을 정의합니다. - 조심할점 : airfow의 dag 스캔패턴의 특성상 dags_folder가 가리키는 폴더를 서브폴더들까지 다 스캔함. dag모듈이 포함된 모든 파이썬 스크립트를 실행해서 사고로 이어진다.
해결방법 : .airflowignore로 무시해야할 dag_folder의 폴더나 파일을 지정
실제예
1. `project_a`: 이 패턴은 단순히 `project_a`라는 파일 또는 디렉토리를 무시하는 패턴입니다.
2. `tenant_[\d]`: 이 패턴은 `tenant_` 다음에 숫자(`[\d]`는 숫자를 나타냄)가 따라오는 경우를 의미합니다. 이것은 `tenant_0`, `tenant_1`, `tenant_2` 등과 같은 패턴을 무시하는 데 사용될 수 있습니다.