::: IT인터넷 :::

Docker로 AirFlow 설정하기 (Apache)

곰탱이푸우 2022. 3. 14. 08:20
Apache에서 제공하는 Docker 이미지로 AirFlow를 설정하는 방법에 대해 정리한다.
 
AirFlow 소개와 구조에 대해서는 다음 포스팅을 참고한다.
Apache에서 제공하는 GitHub과 DockerHub 사이트는 다음과 같다.
 
 

docker-compose 업그레이드

Apache 공식 사이트에서 제공하는 방법을 사용하기 위해서는 docker-compose를 최신 버전으로 업데이트 해야 한다.
 
우분투 20.04 버전에서 제공하는 최신 버전은 1.25.0 (2022-02-04 기준)이다.
그러나 docker-compose.yaml에서 AirFlow 컨테이너 4개에 공통으로 적용하기 위해 작성 된 부분이 기존 버전으로 인식을 하지 못해 오류가 발생한다.
 
우분투에서 apt 설치 방법으로는 1.25.0 버전 이상의 최신 버전 설치가 어렵기 때문에 다른 방법을 사용해야 한다.
 
pip 사용하기
우분투에 파이썬이 기본 설정되어 있으므로, pip를 사용하면 쉽게 셋팅 가능하다.
2022-02-04 현재 pip 설치 방법으로 사용 가능한 docker-compose의 최신 버전은 1.29.2이다.
$ rm -rf /usr/local/bin/docker-compose
$ pip install docker-compose
$ docker-compose -v
docker-compose version 1.29.2, build unknown
 
아나콘다를 사용 중이라면 Conda 가상 환경을 생성해서, 호스트 PC와 분리할 수 있다.
(base) $ conda create -n test-dev python=3.8  # 가상환경 이름과 파이썬 버전은 변경 가능
(base) $ conda activate test-dev
(test-dev) $ pip install docker-compose
(test-dev) $ docker-compose -v
docker-compose version 1.29.2, build unknown

(test-dev) $ conda deactivate
(base) $ docker-compose -v
docker-compose version 1.25.0, build unknown
 
 
외부 바이너리 사용하기
github에서 제공하는 docker-compose 바이너리를 다운로드 하는 방법도 있다.
/usr 경로 하위에 파일을 저장해야 하므로 sudo 권한도 필요하다.
 
아래 사이트에서 제공하고 있으며 2022-02-04 현재 사용 가능한 docker-compose의 최신 버전은 2.2.3이다.
$ sudo curl -L \
    https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 \
    -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose -v
Docker Compose version v2.2.3
 
참고로 /usr/bin 경로에 기존 파일이 있어도 /usr/local/bin에 저장 된 파일이 우선적으로 실행된다.
 

docker-compose.yaml 다운로드

아래 명령으로 docker-compose.yaml 파일을 다운로드 한다.
2022-01-26 현재 2.2.3 버전이 최신 버전이다.
$ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.2.3/docker-compose.yaml'
 
참고로 AirFlow는 파이썬 3.6부터 3.9까지 지원하며, 2.2.3 버전의 Docker 이미지에 내장 된 파이썬의 기본 버전은 3.6이다.
파이썬 3.7~3.9 버전이 적용 된 Docker 이미지를 사용하려면 docker-compose.yaml 파일을 수정해야 한다.
 
 

docker-compose.yaml 수정

docker-compose.yaml 파일의 설정을 변경한다. 변경할 사항들은 다음과 같다.
  • Docker 이미지 경로 - 사설 저장소를 사용하는 경우
  • Docker 이미지 버전 - 파이썬 3.8 사용할 것이므로 변경
  • 공유 볼륨 경로 - 공유 볼륨을 다른 경로에 설정하려는 경우
  • 연결 포트 변경 - 변경이 필요한 경우
 
참고로 AirFlow의 서비스들이 사용하는 포트는 다음과 같다.
  • AirFlow Webserver - 8080:8080
  • flower - 5555:5555
 
Docker 이미지 경로와 버전
DockerHub를 사용하는 경우 Docker 이미지 경로를 수정할 필요는 없다.
사설 저장소를 사용할 것이므로 Docker 이미지 경로를 수정한다.
 
또한 AirFlow에서 파이썬 3.8을 사용할 것이므로 해당 이미지명으로 변경한다.
버전별 Docker 이미지 배포 목록은 아래 사이트를 참고한다.
$ vi docker-compose.yaml

## 중략 ##
version: '3'
x-airflow-common:
  &airflow-common
  image: 사설저장소경로:포트/apache/airflow:2.2.3-python3.8

## 중략 ##

services:
  postgres:
    image: 사설저장소경로:포트/postgres:13

## 중략 ##

  redis:
    image: 사설저장소경로:포트/redis:latest
 
 
공유 볼륨 경로
공유 볼륨은 그대로 사용할 것이므로 변경하지 않는다.
변경이 필요한 경우 아래 항목을 변경한다.
$ vi docker-compose.yaml

## 중략 ##
version: '3'
x-airflow-common:
  ## 중략 ##
  volumes:  # ./ 항목을 /path/to/dags 형태로 변경한다.
    - ./dags:/opt/airflow/dags
    - ./logs:/opt/airflow/logs
    - ./plugins:/opt/airflow/plugins

services:
  ## 중략 ##

  airflow-init:
  ## 중략 ##
    volumes: # . 항목을 /path/to/sources 형태로 변경한다.
      - .:/sources
 
dags 폴더가 중요하다.
AirFlow에서 실행할 파이프라인(Pipeline)을 정의한 dag 파일은 dags 폴더에 위치한다.
dags 폴더를 공유 볼륨으로 설정하면 컨테이너 내부로 진입할 필요 없이 호스트의 dags 폴더를 사용하면 된다.
 
연결 포트
연결 포트도 그대로 사용할 것이므로 변경하지 않는다.
변경이 필요한 경우 아래 항목을 변경한다.
$ vi docker-compose.yaml

## 중략 ##
services:
  ## 중략 ##
  airflow-webserver:
    ## 중략 ##
    ports:    # 8080: 부분을 변경할포트: 형태로 변경한다.
      - 8080:8080

  ## 중략 ##

  flower:
    ## 중략 ##
    ports:    # 5555: 부분을 변경할포트: 형태로 변경한다.
      - 5555:5555
 

env 파일 생성

docker-compose.yaml 파일 내부에 환경 변수로 정의 된 AIRFLOW_UID가 있다.
리눅스에서 파일과 폴더의 소유자는 사용자ID:그룹ID 형태로 지정한다.
해당 환경 변수는 컨테이너 내부에서 AirFlow 관련 파일과 폴더의 소유자를 지정하기 위해 사용한다.
$ echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
$ cat .env
AIRFLOW_UID=1000
AIRFLOW_GID=0

 

 

airflow-init 컨테이너 실행

Apache에서 제공하는 docker-compose.yaml 파일은 두 단계에 걸쳐 실행된다.
  • init 컨테이너를 생성해서 PostgreSQL과 redis 컨테이너를 생성한다.
  • AirFlow 컨테이너들을 생성하고 미리 생성 된 컨테이너와 연결한다.
 
아래 명령을 사용하여 airflow-init 컨테이너를 생성한다.
$ docker-compose up airflow-init
 
AirFlow 초기화 과정으로 인해 시간이 좀 오래 걸리는 편이다.
기다리면 아래와 같은 최종 메시지가 출력된다.
airflow-apache-airflow-init-1  | User "airflow" created with role "Admin"
airflow-apache-airflow-init-1  | 2.2.3
airflow-apache-airflow-init-1 exited with code 0

 

실행이 완료되면 PostgreSQL과 redis 컨테이너가 생성된다.
CONTAINER ID  IMAGE                NAMES
34eaa8e23bb4  postgres:13          airflow-apache-postgres-1
aee96ea710b0  redis:latest         airflow-apache-redis-1
 

airflow 컨테이너 실행

마지막 단계인 AirFlow 컨테이너를 실행한다. -d 옵션을 지정하여 백그라운드로 실행되도록 한다.
$ docker-compose up -d
 
실행이 완료되면 AirFlow와 관련 된 모든 컨테이너가 생성 된 것을 확인할 수 있다.
$ docker ps

CONTAINER ID  IMAGE                            NAMES
d3c8a5a5aa27  apache/airflow:2.2.3-python3.8  airflow-apache-flower-1
16533217af47  apache/airflow:2.2.3-python3.8  airflow-apache-airflow-triggerer-1
f8d53764c774  apache/airflow:2.2.3-python3.8  irflow-apache-airflow-webserver-1
c33edcbe8025  apache/airflow:2.2.3-python3.8  airflow-apache-airflow-scheduler-1
16ec275beb6c  apache/airflow:2.2.3-python3.8  airflow-apache-airflow-worker-1
3270138dd9d9  redis:latest                    airflow-apache-redis-1
67be1db670d5  postgres:13                     airflow-apache-postgres-1
 
 

AirFlow 웹서버 접속

localhost:8080으로 접속하면 airflow가 실행 된 것을 확인할 수 있다.
 
Apache에서 제공하는 Docker 이미지의 최초 로그인 계정은 airflow / airflow이다.
관리자 ID와 비밀번호는 접속 이후 Security - User List에서 변경 가능하다.
 
로그인하면 Apache에서 제공하는 여러 개의 예제 튜토리얼을 확인할 수 있다.
 

타임존 변경

우측 상단의 시계를 클릭하면 UTC와 로컬 시간인 KST를 선택할 수 있다.
 
예제 튜토리얼의 Next Run 시간이 00:00:00에서 09:00:00으로 변경 된다.
 
AirFlow에서 동작하는 DAG의 시작 트리거는 시간이기 때문에, 타임존이 명확해야 혼란을 방지할 수 있다.

'::: IT인터넷 :::' 카테고리의 다른 글

AirFlow Webserver에 SSL 적용하기  (0) 2022.03.21
Docker로 AirFlow 설정하기 (Bitnami)  (0) 2022.03.17
AirFlow 소개와 구조  (2) 2022.03.10
Docker로 PostgreSQL 사용하기  (0) 2022.03.07
Docker로 MinIO 사용하기  (2) 2022.03.03