아파치 에어플로우 기본 개념

Apache Airflow(이하 에어플로우)는 작업 흐름을 실행, 관리하는 오픈소스 플랫폼으로, 에어비앤비에 의해 개발되었고 아파치 재단 인큐베이션 단계에 있습니다.

에어플로우가 타 작업 흐름 관리 도구에 비해 나은 점은:

  1. 동적인 작업 흐름 정의: 작업 흐름은 파이썬 코드로 정의되며 동적으로 작성될 수 있습니다.
  2. 확장성: 새로운 연산자와 실행자를 쉽게 정의하고 라이브러리를 확장할 수 있게 합니다.
  3. 간결함: Jinja 템플릿 엔진을 통해 깔끔하게 스크립트 매개 변수를 전달합니다.
  4. 가용성: 모듈 아키텍쳐를 가지며 클러스터로 확장 가능한 메시지 큐를 통해 작업을 관리합니다.

아래 구글 트렌드를 살펴보면 이런 에어플로우의 장점들이 데이터를 다루는 테크 기업들에 어필되고 있음을 알 수 있습니다.

 

두니아

에어플로우의 기본 개념인 작업(task)과 연산자(operator)를 이해하기 위해 무인도에 갇힌 사람들이 하루 두 끼를 해결하는 상황을 생각해 볼게요.

 

DAG

에어플로우는 작업들 사이의 관계와 순서를 DAG(Directed Acyclic Graph; 방향성 비순환 그래프)로 표현합니다. 그래프의 각 노드는 작업을, 방향성을 갖는 링크는 작업 순서를 표현합니다. 비순환성을 통해 같은 작업 시퀀스가 무한히 반복되는 걸 허용하지 않습니다.

두니아에서의 요리 작업 흐름은 나무가지를 모아서(collect_wood) 불을 지피고(start_fire) 물고기를 잡아와(fish) 굽는(cook) 네 가지 작업을 필요로 합니다.  이 작업들 사이에는 다음과 같은 전후/병렬 관계가 존재합니다.

  1. 나무가지를 모으기 전에는 불을 지필 수 없습니다.
  2. 물고기 잡이는 나무가지를 모으거나 불을 지피는 작업과 동시에 수행할 수 있습니다.
  3. 불과 물고기가 준비되면 구이를 만들어 먹을 수 있습니다.

이 작업 흐름은 다음과 같은 DAG로 표현될 수 있습니다.

오전 10시와 오후 4시, 하루 두 번 실행되는 위 DAG는 다음과 같은 파이썬 소스로 표현될 수 있습니다.

from datetime import datetime

from airflow import DAG
from airflow.operators.bash_operator import BashOperator


dag = DAG(
    'dunia',  # DAG id
    start_date=datetime(2018, 6, 26),  # 언제부터 DAG이 시작되는가
    schedule_interval='0 10,16 * * *',  # 10시와 16시에 하루 두 번 실행
    catchup=False)

t1 = BashOperator(task_id='collect_wood', bash_command='echo collect wood', dag=dag)
t2 = BashOperator(task_id='start_fire', bash_command='echo start fire', dag=dag)
t3 = BashOperator(task_id='fish', bash_command='echo fish', dag=dag)
t4 = BashOperator(task_id='cook', bash_command='echo cook', dag=dag)

t1 >> t2 >> t4  # t1이 완료되면 t2 수행 가능; t2가 완료되면 t4 수행 가능
t3 >> t4  # t3가 완료되면 t4 수행 가능

t1, t2, t3, t4는 BashOperator 오브젝트로 정의되는 작업들이며, 이들 간의 전후 관계를 마지막 두 줄에서 >> 연산자로 표현합니다.

DagRun이란 어떤 시점에 실행된 DAG를 의미합니다.  두니아의 예에서는 하루에 두 개의 DagRun이 생성됩니다.

 

연산자

연산자는 각각의 작업을 정의하는 데 사용됩니다.  에어플로우는 다음과 같은 기본 연산자 타입들을 제공합니다.

  • BashOperator: Bash 명령 실행
  • PythonOperator: Python 함수 실행
  • EmailOperator: 이메일 전송
  • HTTPOperator: HTTP 요청 전송
  • MySqlOperator, SqliteOperator, PostgresOperator, MsSqlOperator, OracleOperator, JdbcOperator: SQL 명령 실행
  • Sensor: 특정 시간, 파일, DB 레코드, S3 키 등을 기다림

이 외에도 다양한 연산자가 존재합니다.  파라미터 값이 적용된 연산자의 오브젝트를 작업(task)이라 부릅니다.  위 파이썬 소스의 t1, t2, t3, t4는 모두 작업입니다.

각 작업은 반복되어 실행되어도 같은 결과를 도출하는 속성(idempotency)을 가져야 하며, 작업들 사이에 데이터를 공유하는 방식은 바람직하지 않습니다 (데이터 공유가 필요한 작업은 하나로 합치는 게 좋습니다).  만약 실행 도중 데이터 공유가 꼭 필요하다면 XCom 기능을 사용할 수 있습니다.

특정 시간에서의 작업과 DagRun 조합을 작업 인스턴스라 정의합니다.

task_instance = (task, dag_run, time)

작업 인스턴스는 반드시 상태(queued, running, success, failed, skipped, up for retry)를 나타내게 됩니다.

 

마무리

이상 에어플로우의 기본 개념인 DAG와 연산자, 작업에 대해 알아 봤습니다.  미리 정의된 일정으로 특정 작업을 수행한다는 기본 개념은 리눅스에서 제공되는 crontab과 유사해 보입니다 (실제로 DAG의 schedule_interval은 crontab 형식으로 작성될 수 있습니다).

하지만 에어플로우는 crontab이 구현할 수 없는 다음과 같은 기능들을 갖습니다.

  1. DAG와 각각의 작업을 동적으로 간편하게 변경할 수 있습니다.
  2. 미리 정의된 연산자와 사용자 정의 연산자로 다양한 작업을 정의할 수 있습니다.
  3. 각 작업들에 타임아웃, 재시도 횟수, 우선도 등을 정의할 수 있습니다.
  4. 각 작업에 타임아웃 재시도 등의 예외가 발생되었을 때 관리자에게 쉽게 보고하거나 대처할 수 있습니다.
  5. 작업들이 약하게 결합됩니다.
  6. 작업들을 실행하는 워커 풀이 별개로 존재하며 설정 가능합니다.
  7. 웹 GUI를 통해 DAG를 편리하게 관리/모니터링 할 수 있습니다.

다음 글에서는 에어플로우의 심화 개념과 사용법을 다뤄 보겠습니다.



1 thought on “아파치 에어플로우 기본 개념”

댓글 남기기