터칭 데이터

Airflow Docker docker-compose.yml 리뷰 본문

Docker & K8S

Airflow Docker docker-compose.yml 리뷰

터칭 데이터 2023. 12. 21. 20:57

 

 

Docker 기반 Airflow 실행

 

Docker 기반 Airflow 설치 문서 참조

 

먼저 터미널 프로그램을 실행하고 적당한 폴더로 이동

 

airflow-setup Github repo를 클론

git clone https://github.com/keeyong/airflow-setup.git

 

airflow-setup 폴더로 이동하고 2.5.1 이미지 관련 yml 파일 다운로드

cd airflow-setup
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.5.1/docker-compose.yaml'

 

다음 2개의 명령을 수행 (이미지 다운로드와 컨테이너 실행)

docker-compose -f docker-compose.yaml pull
docker-compose -f docker-compose.yaml up

사실 up이 이미지가 없을 경우 pull까지 하기 때문에 2번째 줄 up만 사용해도 됩니다.

 

http://localhost:8080으로 웹 UI 로그인

airflow:airflow 사용

 

 

 

 

 

 

 

 

 

 

 

앞서 다운로드 받은 docker-compose.yaml 파일 내용 보기

 

version

version: '3'

Docker 1.27버전 이후로는 version:이 필요 없습니다.

Docker compose 2와 3의 약간 달랐던 문법을 1.27 이후로 통일했습니다.

 

x-airflow-common

airflow-common이라는 별칭 정의. 여러 서비스에서 공유하는 공통 구성을 정의
이를 보통 anchor라고 부르며 YML 파일 블록을 나중에 계승이란 형태로 재사용 가능하게 해줌
version, services, volumes, networks를 제외한 최상위 레벨 키워드는 모두 anchor

 

services

postgres
redis
airflow-webserver
airflow-scheduler
airflow-worker
airflow-triggerer
airflow-init

 

volumes

postgres-db-volume

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x-airflow-common

 

docker-compose.yml

 

x-airflow-common:
  &airflow-common # 이하의 내용들의 별칭
  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.5.1} # 즉 같은 airflow 이미지가 모든 서비스 기본 이미지로 사용됨
  # build: .
  environment:
    &airflow-common-env
    AIRFLOW__CORE__EXECUTOR: CeleryExecutor
    ...
    _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-}
  volumes: # 모두 세 개의 volume을 공유함 (host volumes)
    - ${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
    - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
    - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins
  user: "${AIRFLOW_UID:-50000}:0"
  depends_on:
    &airflow-common-depends-on
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy

 

 

 

 

 

 

 

 

 

 

airflow-scheduler 서비스 보기

 

  airflow-webserver:
    <<: *airflow-common # 위에서 본 airflow-common에서 정의한 내용들을 그대로 쓰겠다는 뜻 (재활용!)
    command: webserver
    ports:
      - 8080:8080
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/health"]
      interval: 10s
      timeout: 10s
      retries: 5
    restart: always
    depends_on:
      <<: *airflow-common-depends-on
      airflow-init:
        condition: service_completed_successfully

 

 

 

 

 

 

 

 

 

 

 

Dag를 구현하며 특정 파이썬 모듈을 설치해야한다면?

 

import yfinance as yf

@task
def get_historical_prices(symbol):
    ticket = yf.Ticker(symbol)
    data = ticket.history()

 

 

DAG를 구현하며 새로 생긴 모듈을 어떻게 설치해주어야할까?


일일히 docker container에 들어가서 설치해주는 것은 유지보수도 안되고 불가능!


docker-compose.yaml에 답이 있음

 

 

 

 

 

 

 

 

 

Dag를 구현하며 특정 파이썬 모듈을 설치해야한다면?

 

x-airflow-common에서 _PIP_ADDITIONAL_REQUIREMENTS의 값을 변경

Before:
 _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:-}
After:
 _PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- yfinance pandas 
numpy}