2023. 9. 30. 17:54ㆍBACKEND
Airflow의 개념과 용어 - Dag, Task, Operator 등 - 을 이해하는 것이 본 포스팅의 목표입니다.
안녕하세요.
이번에는 짧게 Airflow 시리즈를 작성해보려고 합니다.
본 포스팅은 Airflow에 대한 가장 기본이 되는 개념을 다룹니다.
Apache Airflow 는 배치 워크플로우를 개발과 스케줄링, 그리고 모니터링하기 위한 오픈 소스 플랫폼입니다.
데이터를 관리하기 위한 데이터의 플로우를 지정 할 수 있을 뿐 아니라,
특정 서비스를 호출하는 등 배치 작업을 수행할 수 있습니다
기본으로 지원되는 GUI 웹 인터페이스를 통해 Aitflow 사용성을 크게 향상시킵니다.
Airflow는 넓은 범위, 그리고 다양한 크기의 배치를 지원하며,
다양한 배포 방식을 사용 할 수 있습니다.
What is Airflow?
Airflow는 Workflows as code 도구로, 모든 워크플로우가 Python 코드로 정의됩니다.
간단히 실제 Airflow 코드를 보면서 Airflow가 무엇인지에 대해 알아보겠습니다.
from datetime import datetime
from airflow import DAG
from airflow.decorators import task
from airflow.operators.bash import BashOperator
# ① A DAG represents a workflow, a collection of tasks
with DAG(dag_id="demo", start_date=datetime(2022, 1, 1), schedule="0 0 * * *") as dag:
# ② Tasks are represented as operators
hello = BashOperator(task_id="hello", bash_command="echo hello")
@task()
def airflow():
print("airflow")
# ③ Set dependencies between tasks
hello >> airflow()
① Scheduling
"demo"라는 이름지어진 DAG는 2022년 1월 1일 부터 시작해서 하루에 한 번 실행됩니다.
DAG는 Airflow에서 사용하는 하나의 workflow 을 의미합니다.
② Tasks
아래의 총 두 가지의 Task가 실행됩니다.
Task는 Airflow에서 사용하는 가장 기본이 되는 작업 단위입니다.
1. Bash 스크립트를 실행하는 BashOperator
2. @task
를 사용하여 정의한 Python 함수
③ Dependencies
dependency를 고려하여 진행할 작업들의 순서를 >>
기호로 정의하여, 실행할 순서를 제어합니다.
Airflow는 위와 같은 스크립트를 읽어,
각 작업들의 순서와 각 작업 사이의 간격을 평가한 후 순서대로 작업을 실행합니다.
Overview
Airflow는 아래와 같은 구성으로 동작됩니다.
✔️ Scheduler
: 예약된 워크플로우를 트리거하고, Executor에게 작업을 전달하고 실행
✔️ Executor
: 실행 중인 작업을 처리하는 실행 프로그램
기본적으로 Airflow 를 설치하면 스케줄러 내부의 모든 것을 실행하지만,
Production 을 위한 Airfow 작업에서는 Worker에게 작업을 전달합니다.
✔️ DAG Directory
: /dags
. 정의한 DAG 파일을 포함하는 폴더
Scheduler와 Executor, 그리고 Executor가 가진 모든 Worker 가 읽는 폴더입니다.
✔️ Metadata Database
: scheduler, executor 및 webserver가 상태를 저장하는 데 사용하는 데이터베이스
✔️ Webserver
: 사용자의 편의성을 위해 DAG와 Task의 동작을 검사하고 트리거하고, 디버깅할 수 있는 UI를 제공하는 웹 서버
가령, 아래와 같이 기본 제공되는 웹 UI를 통해 확인할 수 있습니다.
지금부터는 Airflow의 기본 개념인, 용어에 대해 살펴보도록 하겠습니다.
DAG
: Directed Acyclic Graph
DAG 는 Airflow의 핵심 개념입니다.
작업들을 모아서, 각 작업의 의존 모듈 (이하 dependency)와 관계를 구성하여
각 실행의 진행 방식을 명시합니다.
특정 작업(이하 Task)들의 의존성들을 나타내는 방식 중 하나는,
데이터 파이프라인을 Directed Graph로 표시하는 것입니다.
Directed Graph
Directed Graph는 작업들을 'Node'와 '방향성을 가진 Edge'를 가진 그래프를 표시하는 방식입니다.
가령, Task A 부터B, C 있다고 가정한다면, 위 세 개를 순차적으로 연결한다고 해봅시다.
Task A >> Task B >> Task C
Task A가 성공적으로 완료 되었을 때, Task B가 실행되기 시작합니다.
또, Task B가 성공적으로 완료 되었을 때, Task C가 실행되기 시작합니다.
그렇다면, DAG - Directed Acyclic Gragh 의 가운데 단어인 "Acyclic"은 어떤 의미일까요?
이는 Acyclic graph를 나타내며,
비순환 의존의 그래프, 즉 Loop 나 Cycle을 갖지 않는 Graph를 의미합니다.
이를 통해 Deadlock 등과 같이 순환 의존으로 인해 발생될 수 있는 문제를 방지하는 역할을 합니다.
아래 그림에서 위 그림이 Acyclic graph, 아래 그림이 Cyclic graph 입니다.
4개의 작업 A, B, C, D 을 정의한 후에,
언제 실행되어야 할지, 또 어떤 작업에 의존되어 있는지에 대한 정의를 명시합니다.
또한 DAG에 실행 빈도를 작성할 수도 있는데,
"내일부터 5분마다" 또는 "2020년 1월 1일 이후 매일" 와 같이 일정 시기를 지정하고 싶을 때 사용합니다.
DAG는 각 작업이 어떤 일을 하는지 관심이 없으며,
오로지 작업 실행 순서, 작업 재시도 횟수, 시간 초과가 있는 경우 등과 같은 작업을 실행하는 방법에만 관심이 있습니다.
Advantages
Airflow는 작성되어, 복잡하거나, 규모가 크거나, 스케줄링 작업이 필요한 곳에 적합합니다.
Airflow를 사용해야 한다면, 그 이유는 무엇일지 확인해보겠습니다.
1. Python
Python은 Data science 분야를 포함한 광범위한 분야에 사용되고 있습니다.
때문에, 많은 다양한 툴들과 라이브러리들이 제공되고 있습니다.
적은 노력, 그리고 적은 코드로 구현할 수 있는 Python의 장점을 그대로 응용할 수 있습니다.
2. Workflow as a code
Airflow는 Workflow as a code로, 모든 Airflow 작업은 코드로 정의됩니다.
간혹 DAG를 동적으로 정의한다고 해보겠습니다.
수 많은 파라미터들과 작업들을 보관해야만 하는 상황일 때,
코드를 통해 자동화시켜 생성해낼 수 있습니다.
3. Out of the box
특별히 Airflow를 사용하기 위한 코드 작업없이,
Airflow를 이해만 하고 있다면 바로 사용할 수 있는 형태입니다.
스케줄러를 의도에 맞게 설정만 한다면
복잡하거나 병렬 작업이 필요한 작업 등을 알아서 여러 스케줄러에 걸쳐 실행시킬 수도 있습니다.
Disadvantages
Airflow의 단점은 아래와 같습니다.
1. Learning curve
Airflow를 사용하기 위해선 Airflow에서 사용되는 개념이나 동작에 대한 이해가 필요합니다.
또한, Python 사용자가 아니라면 새로운 언어를 배워야 하는 어려움이 있습니다.
2. Insufficient docs
Airflow 공식 페이지를 보면 튜토리얼부터 용어 설명에 대해 명세되어 있습니다.
그럼에도 불구하고, 실제 Airflow를 사용할 때의 디테일이나 설명이 명료하지 못한 부분들로 어려움을 겪을 수 있습니다.
3. No versioning
많은 사용자들이 원하는 기능 중에 하나인 버전 관리도 하나의 단점이 됩니다.
변화된 이력을 기록하고 추적하는 기능이 필요해 보이지만, 현재로서는 지원되지 않습니다.
Task
Airflow의 가장 기본적인 실행 단위입니다.
Task들을 이용해서 DAG 들을 원하는 실행 순서로 배열하고, 작업이 가진 Dependency를 고려한 순서를 조정하게 됩니다.
기존적으로, 아래와 같이 세 종류의 Task가 존재합니다.
✔️ Operator: DAG의 대부분을 빠르게 구성할 수 있는 미리 정의되어진 작업 템플릿 predefined task template
✔️ Sensor: 외부 이벤트 발생을 대기하는 Operator를 특정지어 정의한 Operator 하위 클래스
✔️@task
: Python 함수를 커스텀한 TaskFlow를 위한 decorator
Operator
개념적으로 Operator는 미리 정의되어진 Task의 템플릿을 의미합니다.
모든 Operator는 특정한 하나의 작업을 실행한다는 기본적인 목적이 있으며, 가령 아래와 같은 종류가 있습니다.
✔️ BashOperator: Bash command/script 실행 시 사용
✔️ PythonOperator: Python 함수를 실행하는 데 사용
✔️ EmailOperator: 이메일을 보내는 데 사용
✔️ SimpleHTTPOperator: HTTP 엔드포인트를 호출하는 데 사용
📌 Operator vs Task?
Operator와 Task라는 단어가 종종 혼용되어 사용되곤 합니다.
일부 사람들은 이 둘이 동일한 동작을 할 수 있고, 서로를 대체할 수 있다고 주장합니다.
사실 여기엔 작은 차이점이 있는데요, 차이점을 기준으로 정리하면 다음과 같습니다.
Operator: 수행할 일을 처리하는 템플릿처럼 사용가능한 클래스
Task: Operator를 구현해서 수행할 일을 정의한 것
가령 위에서 확인했듯이, Airflow는 BaseOperator라는 클래스가 있는데
이로부터 상속되는 PythonOperator, EmailOperator, OracleOperator 등이 존재합니다.
Operator는 수행해야 할 작업에 집중할 수 있고,
Task를 통해서는 조금 더 정밀한 작업의 실행이 가능합니다.
Task Depencencies
주로 배치를 작성할 때, 하나의 작업이 동작하기 보다는 여러 작업들이 연쇄적으로 실행하는 형식입니다.
다른 작업의 결과에 의존하여 실행하는 작업(upstream)과 다른 작업이 의존하는 작업(downstream)이 있습니다.
작업 사이에 이러한 의존성을 선언함으로써, DAG 구조를 구성합니다.
각 작업 dependency를 선언하는 기본적인 방법으로는, 크게 두 가지가 있습니다.
첫 번째로, 권장하는 방법인 >>
와 <<
연산자 입니다.
first_task >> [second_task, third_task]
third_task << fourth_task
두 번째로, set_upstream
과 set_downstream
메소드를 통해 명시적으로 정의할 수 있습니다.
first_task.set_downstream(second_task, third_task)
third_task.set_upstream(fourth_task)
조금 더 복잡한 dependency 정의는 cross_downstream
, chain 메소드를 통해 정의할 수 있으며,
해당 내용은 공식 페이지를 참고해주시기 바랍니다.
| Reference |
https://airflow.apache.org/docs/
https://www.altexsoft.com/blog/apache-airflow-pros-cons/
⌜Data Pipelines with Apache Airflow⌟ - Oreilly
'BACKEND' 카테고리의 다른 글
Apache Airflow, 어렵지 않게 시작하기 (4) | 2023.10.04 |
---|---|
Apache Airflow, 제대로 이해하기 - Schedule (0) | 2023.10.03 |
Hexagonal Architecture, 어렵지 않게 이해하기 (6) | 2023.08.03 |
HTTP/3, 제대로 이해하기 (0) | 2023.01.01 |
Circuit Breaker, 제대로 이해하기 (0) | 2022.12.28 |
Backend Software Engineer
𝐒𝐮𝐧 · 𝙂𝙮𝙚𝙤𝙣𝙜𝙨𝙪𝙣 𝙋𝙖𝙧𝙠