airflow(에어플로우)

airflow 실행 환경 관리

데이터왕 2024. 1. 4. 21:47

실습파일 다운 및 세팅

  1. 실습파일을 다운로드
    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.

  2. 다운 받은 파일로 이동
    weare@DESKTOP-BE1I4GE:~$ cd learn-airflow

  3. 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

  4. 필요한 폴더 만듦
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ mkdir -p ./dags ./logs ./plugins

  5. .env 파일을 생성하고, 그 내용으로 AIRFLOW_UID와 AIRFLOW_GID 변수를 설정
    weare@DESKTOP-BE1I4GE:~/learn-airflow$  echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
  6. 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 폴더에 대해 명령어를 수행

  7. 컨테이너 실행, 맨뒤에 -d 넣으면 서버 실행돼서 우분투 하나더 실행 안해도 됨
    weare@DESKTOP-BE1I4GE:~/learn-airflow$ docker-compose up -d

  8. docker 데스크탑으로 확인하면 잘 실행됨
  9. 저장된 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` 등과 같은 패턴을 무시하는 데 사용될 수 있습니다.