새소식

반응형
Data pipeline/Airflow

docker기반 Airflow 2.0 설치

  • -
반응형

오랜만에 글을 쓰는거 같습니다. 

한동안 서버 세팅을 하면서 바쁜 시간을 보내고 재택 근무를 하면서 이런저런 적응을 하다보니 글을 안쓰게 되었습니다.

 

그러다 이번에 새롭게 Airflow2.0을 실제로 세팅 하면서 이런 저런것을 정리해야겠다 싶어서 글을 씁니다.

 

 

들어가며...

 

이 글을 읽고 참고 하시면 도움이 될 분들은 이런 분들 입니다.

 

  • 스케줄 처리를 해야하는데, Airflow를 선택 하였다. 하지만 나는 딥하게 알지는 못한다.
  • 대규모 처리가 필요한게 아닌 적당한 처리를 할 예정이다. 
  • 일단 실무에 급하게 반영해야 하는데 봐도 잘 모르겠다. 
  • 튜토리얼이 아닌 진짜 실무에서 쓸수 있는 Airflow 시스템을 구축 하려고 한다.

반면 읽어도 큰 도움이 안 될 분들은 이런 분들 입니다.

 

  • 대규모 작업이 필요하며, 빠르게 처리가 가능해야 한다. 
  • 코어하게 내가 하나하나 다 컨트롤해서 하는 수준의 Airflow 세팅을 원한다.
  • 이미 Airflow를 알고 있으며, Kubernates에서 운영 하려고 한다. (docker-compose입니다.)

 

저 같은 경우 Airflow 2.0을 설치하여 데이터 관련 모니터링 인프라 모니터링에 필요한 수집 적재 가공등의 프로세스를 스케줄링 하는 곳에 쓰고 있습니다. 하여 대규모 ETL은 사용하지 않기 때문에 여러개의 Worker가 필요 없으므로, 1개의 Worker만 세팅되어 있습니다. (근데 실제 써봤을때 어느정도는 커버가 가능 합니다.)

 

위에서 대규모 ETL을 언급했는데, 머신 성능이 좋으면 뭐 ^^.. 이 방법으로도 커버 가능 하다고 보여집니다. 실제로 제가 어느정도 몇GB 정도는 돌려도 큰 문제는 없었습니다. (Airflow 서버 내에서 무언가는 하는 작업들이 있을때도...)

 

이 글은 bitnami airflow 2.0을 사용하고 있습니다. ( 바로가기 ) 대부분 예쁘게 세팅이 되어 있으며, 제가 몇가지 조정해서 사용하였습니다. 세팅에 Jupyter Notebook을 추가하여 코드를 올리기 편하게 만든것이 가장 큰 변경사항이며 나머지는 크게 조정하지 않았습니다.

 

또한 베이스는 GCP 입니다. 

 

 

1. Docker 설치 

우선 서버는 기본적으로 있다고 가정 하겠습니다. 

한가지만 언급하면 OS는 Ubuntu 입니다. 

Linux os

나머지 네트워크 및 방화벽 등등의 내용은 각자 여러분의 상황에 맞게 세팅을 하시면 됩니다.

저 같은 경우 docker 설치는 이곳을 참고 하였습니다. ( 바로가기 )

 

아래의 내용을 한줄씩 실행 해주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
 
# docker 설치
sudo su
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
 
# 버전 확인
docker version
 
cs

 

아래와 같이 docker version을 입력하면 정상적으로 출력이 되어야 합니다.

Docker 버전 확인

 

2. docker-compose 설치

 

이제 docker-compose를 설치 합니다.

역시 docker-compose도 같은 곳에서 참고하여 설치 하였습니다.

 

아래의 내용을 한줄씩 실행 해주세요.

1
2
3
4
5
6
7
8
# docker-compose
sudo su
curl -"https://github.com/docker/compose/releases/download/1.27.0/docker-compose-$(uname -s)-$(uname -m)" -/usr/local/bin/docker-compose
chmod +/usr/local/bin/docker-compose
ln -/usr/local/bin/docker-compose /usr/bin/docker-compose
 
# 버전 확인
docker-compose -v
cs

 

아래와 같이 docker-compose -v를 입력하면 정상적으로 출력이 되어야 합니다.

docker-compose version

이제 기본적인 준비는 끝났습니다.

이게 bitnami에서 Airflow 2.0의 ymal 파일을 다운받아서 수정 합니다.

 

 

3. bitnami docker-compose yaml 파일 수정

 

기본적으로 yaml 파일의 내용은 다음과 같습니다. 

airflow의 경우 서버의 IP:8080으로 접속 가능하게 세팅이 됩니다. 

아래에 보면 postgresql과 redis의 user / password가 나오는데요. 변경해서 올리면 접속이 안됩니다.

아마 docker파일에 저렇게 세팅이 되어 있어서 그런것으로 보입니다. 그래서 굳이 변경하지는 않았습니다.

volumes의 경우 아래 local로 있는데 Jupyter Notebook과 airflow의 저장소를 같게 하기 위해서 살짝 바꿨습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
version: '2'
 
services:
  postgresql:
    image: 'docker.io/bitnami/postgresql:10-debian-10'
    volumes:
      - 'postgresql_data:/bitnami/postgresql'
    environment:
      - POSTGRESQL_DATABASE=bitnami_airflow
      - POSTGRESQL_USERNAME=bn_airflow
      - POSTGRESQL_PASSWORD=bitnami1
      - ALLOW_EMPTY_PASSWORD=yes
  redis:
    image: docker.io/bitnami/redis:6.0-debian-10
    volumes:
      - 'redis_data:/bitnami'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
  airflow-scheduler:
    image: docker.io/bitnami/airflow-scheduler:2-debian-10
    environment:
      - AIRFLOW_DATABASE_NAME=bitnami_airflow
      - AIRFLOW_DATABASE_USERNAME=bn_airflow
      - AIRFLOW_DATABASE_PASSWORD=bitnami1
      - AIRFLOW_EXECUTOR=CeleryExecutor
    volumes:
      - airflow_scheduler_data:/bitnami
  airflow-worker:
    image: docker.io/bitnami/airflow-worker:2-debian-10
    environment:
      - AIRFLOW_DATABASE_NAME=bitnami_airflow
      - AIRFLOW_DATABASE_USERNAME=bn_airflow
      - AIRFLOW_DATABASE_PASSWORD=bitnami1
      - AIRFLOW_EXECUTOR=CeleryExecutor
    volumes:
      - airflow_worker_data:/bitnami
  airflow:
    image: docker.io/bitnami/airflow:2-debian-10
    environment:
      - AIRFLOW_DATABASE_NAME=bitnami_airflow
      - AIRFLOW_DATABASE_USERNAME=bn_airflow
      - AIRFLOW_DATABASE_PASSWORD=bitnami1
      - AIRFLOW_EXECUTOR=CeleryExecutor
    ports:
      - '8080:8080'
    volumes:
      - airflow_data:/bitnami
volumes:
  airflow_scheduler_data:
    driver: local
  airflow_worker_data:
    driver: local
  airflow_data:
    driver: local
  postgresql_data:
    driver: local
  redis_data:
    driver: local
cs

 

다음과 같이 변경하여 Jupyter Notebook를 설치하고 dag 파일의 위치를 함께 설정해 줍니다.

아래의 내용에서 Jupyter Notebook의 PASSWORD는 1234입니다. (제가 미리 Hash값을 뽑아서 임의로 넣었습니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
version: '2'
 
services:
  jupyter:
    image: 'jupyter/base-notebook:latest'
    volumes:
        - ./dags:/usr/local/airflow/dags
    ports:
        - "8888:8888"
    command: "start-notebook.sh \
              --NotebookApp.password='sha1:b70a055565b1:854e3f96f91c51cc0c91da371ea5dfbf7c1a61a1' \
              --sudo mkdir /usr/local/airflow/dags"
  postgresql:
    image: 'docker.io/bitnami/postgresql:10-debian-10'
    volumes:
      - 'postgresql_data:/bitnami/postgresql'
    environment:
      - POSTGRESQL_DATABASE=bitnami_airflow
      - POSTGRESQL_USERNAME=bn_airflow
      - POSTGRESQL_PASSWORD=bitnami1
      - ALLOW_EMPTY_PASSWORD=yes
  redis:
    image: docker.io/bitnami/redis:6.0-debian-10
    volumes:
      - 'redis_data:/bitnami'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
  airflow-scheduler:
    image: docker.io/bitnami/airflow-scheduler:2-debian-10
    environment:
      - AIRFLOW_DATABASE_NAME=bitnami_airflow
      - AIRFLOW_DATABASE_USERNAME=bn_airflow
      - AIRFLOW_DATABASE_PASSWORD=bitnami1
      - AIRFLOW_EXECUTOR=CeleryExecutor
      - AIRFLOW_LOAD_EXAMPLES=no
      - AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS=false
      - AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE=Asia/Seoul
      - AIRFLOW__CORE__DEFAULT_TIMEZONE=Asia/Seoul
    volumes:
      - ./dags:/opt/bitnami/airflow/dags
 
  airflow-worker:
    image: docker.io/bitnami/airflow-worker:2-debian-10
    environment:
      - AIRFLOW_DATABASE_NAME=bitnami_airflow
      - AIRFLOW_DATABASE_USERNAME=bn_airflow
      - AIRFLOW_DATABASE_PASSWORD=bitnami1
      - AIRFLOW_EXECUTOR=CeleryExecutor
      - AIRFLOW_LOAD_EXAMPLES=no
      - AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS=false
      - AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE=Asia/Seoul
      - AIRFLOW__CORE__DEFAULT_TIMEZONE=Asia/Seoul
    volumes:
      - ./dags:/opt/bitnami/airflow/dags
    
  airflow:
    image: docker.io/bitnami/airflow:2-debian-10
    environment:
      - AIRFLOW_DATABASE_NAME=bitnami_airflow
      - AIRFLOW_DATABASE_USERNAME=bn_airflow
      - AIRFLOW_DATABASE_PASSWORD=bitnami1
      - AIRFLOW_EXECUTOR=CeleryExecutor
      - AIRFLOW_LOAD_EXAMPLES=no
      - AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS=false
      - AIRFLOW__WEBSERVER__DEFAULT_UI_TIMEZONE=Asia/Seoul
      - AIRFLOW__CORE__DEFAULT_TIMEZONE=Asia/Seoul
    ports:
      - '8080:8080'
    volumes:
      - ./dags:/opt/bitnami/airflow/dags
volumes:
  postgresql_data:
    driver: local
  redis_data:
    driver: local
cs

 

※ yaml 파일 변경 시 주의 사항 

  • postgresql 과 redis의 username / password는 변경하면 오류가 납니다. 
    • docker file을 수정하는게 아니고 보시면 postgresql/redis 모두 bitnami의 docker file을 쓰기 때문에 file을 수정하지 않을 경우 위에서 명시 된 user / password를 사용하지 않으면 처음에 올라 갈때 정보가 맞지 않아서 오류가 납니다. (그대로 쓰길 권장) 
    • 만약에 본인이 그게 싫을 경우 bitnami postgresql , redis docker file을 받아서 수정 해야 합니다. 
  • dags 위치
    • volumes에서 위치를 변경 할 경우 문제가 있습니다. 이 문제도 위와 똑같습니다. 기본적으로 dag이 저곳에 저장 되도록 되어 있기 때문에 Jupyter Notebook의 위치도 똑같이 맞췄습니다.

이제 위의 yaml 파일을 실행해서 Airflow를 올려 보겠습니다.

 

 

4. Airflow 올리기

 

이제 docker-compose를 이용해서 yaml을 실행 하겠습니다.

1
2
sudo su 
mkdir /usr/local/airflow
cs

 

우선 저는 파일을 모두 /usr/local/airflow에 몰아서 넣었습니다. 한곳에서 관리 하는 것이 편할거 같아서 이렇게 했습니다.

이곳에 다음과 같이 vi 편집기를 이용해서 yaml 파일을 복사+붙여넣기를 합니다.

 

1
vi docker-compose.yml
cs

 

편집기에서 복사+붙여넣기를 한 뒤에 이를 docker-compose를 통해서 실행 시킵니다.

1
docker-compose -f docker-compose.yml up -d
cs

※ 혹시 오류가 나시는 분들은 (진행중) -d를 빼고 실행하면 터미널 창에 어떠한 문제로 뜨지 못하는지 나타납니다. -d가 백그라운드에서 실행 하는 것을 의미 합니다.

 

처음에 docker-file을 가져오는 부분이 있어서 다음과 같이 나타납니다. 

가져오는 동안 시간이 조금 걸립니다.

docker pull

 

이렇게 모두 설치가 되면 다음과 같이 명령어를 날려서 상태를 볼 수 있습니다.

1
docker ps
cs

아래와 같이 나와야 합니다. STATUS에 아무 문제 없이 표시 되어야지 정상적으로 동작 중 입니다. 

만약에 저기에 Abort 또는 Restart가 나오면 문제가 있다는 뜻 입니다. 그럴때는 위에서 언급한 방법(-d를 빼고 실행)으로 확인해야 합니다.

docker ps

 

 

5. Airflow / Jupyter Notebook 접속

 

이제 Airflow / Jupyter Notebook에 접속해 보겠습니다. 접속을 하실때는 해당 서버의 IP주소:8080 / 8888 입니다. 기본적으로 세팅 값은 Airflow는 8080 Port를 사용하고 Jupyter Notebook의 경우 8888을 사용 합니다. (기본 Port입니다.) 

 

만약에 해당 서버의 IP주소가 123.0.0.0 이라면 123.0.0.0:8080은 Airflow를 123.0.0.0:8888은 Jupyter Notebook을 의미 합니다.

그리고 접속을 위해서는 방화벽을 설정해 주셔야 합니다. (방화벽 설정)

 

접속하면 다음과 같은 화면이 나옵니다.

Airflow 초기화면

 

Jupyter Notebook은 다음과 같이 초기 화면이 나옵니다.

Jupyter Notebook 초기화면

 

 

Airflow의 초기 접속 정보는 다음과 같습니다.

 

Username : user

Password : bitnami

 

초기에 이렇게 세팅되어 있으므로, 접속해서 계정을 추가하고 해당 계정은 지우셔도 괜찮습니다.

User 생성

 

아래의 화면에서 유저를 생성 가능 합니다. 아래에 기본 유저도 보이네요

User 생성 화면

 

Jupyter Notebook의 초기 Password는 1234 입니다.

Jupyter Notebook 접속 화면

 

 

 

6. Airflow Dag 만들기

 

 

접속 이후에 Jupyter Notebook에 Dag파일을 올리면 Dag이 보입니다.  단순하게 Print하는 Dag을 하나 시험 삼아 만들어 보겠습니다.

 

그런데 Dag을 만들려고 시도 했는데 다음과 같이 나오네요? 권한이 없습니다...

권한을 부여 해야겠네요.

권한 문제 발생

 

해당 서버에서 dag파일을 저장하는 곳의 소유자가 아마도 root라서 그럴거에요. 

처음에 만들때 sudo su로 만들다보니... 그래서 root 이외에 아무도 무엇을 할 수 없는데 Airflow의 경우 root가 아니기에 권한을 줘야 합니다. 다음과 같이 줄 수 있습니다.

 

아래에 보면 dag폴더가 root로 되어 있는 것을 볼 수 있습니다.

소유자 변경 전

다음과 같이 권한을 줄 수 있습니다.

1
sudo chown -1000:1000 /usr/local/airflow/dags/
cs

 

소유자가 변경 되었습니다.

소유자 변경 후

 

소유자를 변경하고 Jupyter Notebook에서 파일을 만들어 보겠습니다.

이제 잘 만들어집니다. 여기에 print를 통해서 dag으로 print를 찍어 보겠습니다.

Jupyter Notebook 새로운 파일 만들기

 

아래와 같이 기본 Dag을 하나 만들고 python파일을 실행 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from datetime import datetime
from airflow import DAG
from airflow.operators.bash import BashOperator
 
default_args = {
    'owner''joo',
    'email': ['waws01@naver.com'],
    'email_on_failure'False,
    'email_on_retry'False,
    'start_date': datetime(2021,3,5)
}
 
with DAG(
        dag_id='Airflow_first_dag'
        description='first dag',
        schedule_interval = '0 10 * * *',
        default_args=default_args,
        tags=['test']
        ) as dag:
 
 t1 = BashOperator(
    task_id='test',
    bash_command='python3 /opt/bitnami/airflow/dags/first_dag.py',
    dag=dag)
 
 t1
 
cs

 

 

아래와 같이 정상적으로 Dag이 잘 보입니다. 

Airflow dag

 

상태를 활성화해서 Dag이 실행 되도록 하겠습니다.

Airflow dag 실행
Trigger DAG

 

잘 실행이 되었다면, 로그를 통해서 Dag이 잘 끝났는지 볼 수 있습니다.

Dag Log 확인

 

Print를 잘 찍었습니다.

이 Dag의 경우 매우 단순했는데요. 더욱 복잡하게도 여러분이 응용해서 만들 수 있습니다.

Dag 실행 결과

 

 

마치며...

 

제일 기본적으로 Airflow를 세팅 해봤습니다. 

이곳에는 네트워크 보안 등등의 여러가지 문제는 최소로 하였으며 실제 본인의 회사 규모와 여건에 따라서 다양하게 다르게 세팅이 가능 합니다. 하지만 기본적인 설치 및 구성은 별로 다르지 않습니다.

 

그리고 2.0 버전을 운영하면서 예전에 1.10.3 버전에서 발생하던 CPU가 높게 점유되는 현상이 있었는데요. 이 2.0 버전에서도 똑같이 발생 합니다. 링크를 클릭해서 들어가시면 패치 방법이 나옵니다. ( 링크

 

패치 하실때 docker exec를 통해서 접속하시면 airflow.cfg 파일은 /opt/bitnami/airflow 에 있습니다.

airflow.cgf 위치

 

많은 분들이 손쉽게 Airflow를 설치해서 사용 하시길 바랍니다. 

 

 

감사합니다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.