Airflow 환경 설정

복준수·2024년 12월 12일

🏹1. airflow 공식 이미지 download

airflow에서 제공하는 공식 docker-compose.yaml 을 통해 빌드하였다.

curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.10.3/docker-compose.yaml'

🏹2. .env 파일 설정

컨테이너 빌드하는 과정에서 airflow UID를 설정하라는 메세지가 나오면서 처음에 빌드가 되지 않았다.
docker compose 파일만 다운받고 빌드하려니 문제가 생겼던것 같다.

  • .env 파일을 따로 작성해서 AIRFLOW_UID를 설정해주니 컨테이너가 잘 빌드 되었다.

🏹3. docker-compose.yaml 파일 수정

🎯포트 설정

포트는 80:80 형태로 :앞에 숫자는 호스트 포트의 번호를 뒤의 숫자는 컨테이너의 포트를 지칭한다.
컨테이너간의 포트번호는 같아도 상관없지만, 호스트포트의 번호는 꼭 다르게 설정해주어야 한다.

  • sample dags를 실행시키며 발생했던 오류 메세지. 로컬 호스트의 포트를 재설정하고, cfg에서 base_url도 수정해주니 해결됐다.

    *** Could not read served logs: Invalid URL 'http://:8793/log/dag_id=pro_dags_python_operator_get_data/run_id=manual__2024-12-11T05:34:31.732682+00:00/task_id=get_data_/attempt=1.log': No host supplied

  • 원래는 8080:8080 포트가 기본인데 스터디에서 해당 포트를 사용하고 있어서 다음과 같이 수정해주었다.
  airflow-webserver:
    <<: *airflow-common
    command: webserver
    ports:
      - "8081:8081"
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s
    restart: always
    depends_on:
      <<: *airflow-common-depends-on
      airflow-init:
        condition: service_completed_successfully

🎯volume 수정

/opt/airflow/airflow.cfg 파일을 기본적으로 사용하는데 작업을 좀 쉽게 하기 위해서 localairflow.cfg파일을 가져오고 volume도 로컬과 마운트 해주었다.

  • airflow.cfg파일 수정
# The base url of your website: Airflow cannot guess what domain or CNAME you are using.
# This is used to create links in the Log Url column in the Browse - Task Instances menu,
# as well as in any automated emails sent by Airflow that contain links to your webserver.
#
# Variable: AIRFLOW__WEBSERVER__BASE_URL
#
base_url = http://localhost:8081
  • docker compose파일 volume 설정

    • AIRFLOW_CONFIG 환경변수는 커스터마이징한 .cfg파일을 사용할때 내 로컬에 있는 .cfg파일의 이름을 작성해서 사용하라는 것 같다.

      참고 한 문서
      https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html

    • 그대로 airflow.cfg를 적당히 로컬에서 수정하고 마운트해서 사용할거라 해당 환경변수는 필요없지만 직관적인 이해를 위해 활성화 시켜놨다.

    • plugins 디렉토리에는 shell파일등을 위치시킬 예정이고
      data 디렉토리에는 airflow Python Operator을 통해 수집된 데이터를 저장할 디렉토리 이다.

      추후에 빌드할 Spark 컨테이너를 로컬의 data디렉토리로부터 읽어가 SparkJob을 실행할 예정이다.

	# The following line can be used to set a custom config file, stored in the local config folder
    # If you want to use it, outcomment it and replace airflow.cfg with the name of your config file
    AIRFLOW_CONFIG: '/opt/airflow/airflow.cfg' # environment 에 들여쓰기된 부분
  volumes:
    - ./dags:/opt/airflow/dags
    - ./plugins:/opt/airflow/plugins
    - ./config/airflow.cfg:/opt/airflow/airflow.cfg
    - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
    - ./data:/opt/airflow/data

🎯컨테이너 빌드

  • -d 옵션을 주면 백그라운드에서 컨테이너를 빌드한다.
$ docker compose up -d 
  • 컨테이너들이 잘 빌드된 모습 localhost:8081로 접속도 잘 되었다.
bokjunsoo@BRIAN:~/rankingflow$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS                     PORTS                              NAMES
c0d8cfe12233   apache/airflow:2.10.3   "/usr/bin/dumb-init …"   10 minutes ago   Up 9 minutes (healthy)     8080/tcp                           rankingflow-airflow-scheduler-1
0642805fe6d4   apache/airflow:2.10.3   "/usr/bin/dumb-init …"   10 minutes ago   Up 9 minutes (unhealthy)   8080/tcp, 0.0.0.0:8081->8081/tcp   rankingflow-airflow-webserver-1
9ef845d28e1d   apache/airflow:2.10.3   "/usr/bin/dumb-init …"   10 minutes ago   Up 9 minutes (healthy)     8080/tcp                           rankingflow-airflow-triggerer-1
11a7898b80f7   apache/airflow:2.10.3   "/usr/bin/dumb-init …"   10 minutes ago   Up 9 minutes (healthy)     8080/tcp                           rankingflow-airflow-worker-1
ffccde9da5c5   redis:7.2-bookworm      "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes (healthy)    6379/tcp                           rankingflow-redis-1
b5a570891541   postgres:13             "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes (healthy)    5432/tcp                           rankingflow-postgres-1

🏹4. Next

  • Python Operator을 이용한 API호출
  • 파이썬 함수작성
  • airflow의 보안 시스템을 이용한 API KEY 숨기기 - variable 전역변수

0개의 댓글