Apache Airflow vs Argo Workflow

강다·2024년 5월 19일

졸업프로젝트 과제로 ADAS Simulation을 위한 클라우드 인프라 구축을 진행하게 되었다. 자율주행 시뮬레이션은 데이터 수집, 전처리, 시뮬레이션 실행, 결과 분석 등 다양한 단계로 구성된다. 이때 방향성 비순환 그래프(DAG)로 모델링하면, 각 단계 간의 종속성과 순서를 정의할 수 있어 올바른 순서로 작업이 실행되도록 보장한다. 이를 통해 잡한 워크플로를 체계적으로 모델링하고 관리할 수 있다.

이런 이유 때문에 이미 Airflow를 시뮬레이션에서 사용하는 사례를 본적이 있지만, 나는 HPC 쿠버네티스 클러스터 구성을 통해 시뮬레이션을 개선하는 과제를 목표로 하고 있어, k8s에 더 친화적인 Argo Workflow를 사용하기로 했다.

그러나, Airflow도 k8s를 지원하긴 해서,,,(물론 k8s면 그냥 argo workflow가 쓰는게) 둘의 차이에 대해서 잘 모르고 있는 것 같아서 이참에 둘을 비교해 보려고 한다.

Workflow

워크플로우는 특정 순서에 따라 발생하는 반복적이고 체계적인 프로세스와 작업을 관리하는 시스템이다.

위 사진처럼 순서들의 흐름을 하나의 목표를 수행하는 것을 하나의 워크플로우라고 하고, 이러한 워크플로우들이 개발자가 정해놓은 간격으로 수행되게 예약하기, 그리고 그것들이 잘 동작했는지, 모니터링, 시각화 한 툴들이 워크플로우 관리 시스템이다.

DAG

DAG는 Directed Acyclic Graph의 약자로 방향성 있는 비순환 그래프라고 불린다. 예를 들어, ETL 파이프라인을 구축한다고 하면 각각의 Taks는 Extract, Trnasform, Load일 것이고 다음과 같은 화살표를 가진 DAG를 만들 수 있다.

복잡한 DAG는 다음과 같이 구성 가능하다.

여러 작업이 있을 때 병렬 작업까지 가능하다.

자세히는 다루지 않겠다. 아래 블로그를 참고하면 좋을듯하다.
https://steemit.com/dag/@cryptodreamers/dag-dag-directed-acyclic-graph

Airflow

  • 프로그래밍 방식으로 워크플로우를 작성, 예약 및 모니터링하는 오픈 소스 플랫폼
  • 작업을 정확한 시간에, 정확한 방법으로, 정확한 순서대로 실행하게 해주는 오케스트레이터이다.
  • 표준 Python 프로그래밍 언어의 DAG로 워크플로우 작성 가능, 자체도 Python
  • 실시간으로 워크플로우를 모니터링 간으한 다양한 도구와 함께 대화형 인터페이스 제공
  • 현존하는 workflow tool 중 가장 오래됐고, 가장 거대한 community 가짐

Argo Workflow

  • Argo Project에서 만든 컨테이너 기반 워크플로우 엔진(Job단위가 프로세스가 아닌 컨테이너)으로 높은 고립성
  • 하나의 역할만을 담당하는 Job을 단일 개발하므로 재사용성 높힐 수 있음
  • Airflow와 비슷하게 원하는 Job을 실행 가능하고, 각 Job간의 종속성을 부여하여 순서대로 실행할 수 있으며 병렬로 여러 Job을 동시에 실행할 수 있다.
  • Kubernetes 컴포넌트를 활용해 개발된 것이므로 Kubernetes native(CRD + Controller)
  • YAML을 이용해 작업을 DAG로 정의, 자체는 golang
  • k8s 자체 Job과 가장 큰 차이는 Job 간의 종속성을 부여하여 workflow를 실행할 수 있다는 점

Kubeflow

처음에는 단순 kubernetes 호환성만 고려해서 Kubeflow와 Argo Workflow 중에도 고민을 했었다. Kubeflow가 어차피 내부적으로 Argo Workflow를 사용하기도(워크플로우 orchestration) 하지만, 이의 목적은 MLOps 전반을 다루는 포괄적인 플랫폼이다. ADAS Simulation에서 어떤 시나리오들 간에는 AI적 요소가 들어가면 더 좋을 수도 있겠다고는 생각하지만, 내 능력 밖이기도 하고 지금은 최소한의 연구 목표(k8s로 hpc환경 구축)만 만족해야하므로 더 순수한 워크플로우 관리 도구인 Argo Workflow를 사용하기로 했다.

Airflow vs Argo workflow

구분AirflowArgo workflow
UIwebserverArgo UI
스케줄러schedulerkube-scheduler
메세지 큐CeleryARgo Controller
메타데이터 DBPostgreSQLetcd
WorkerWorkerNode
DAG 정의Python scriptYAML
Job 단위OperatorContainer

확장성

  • Airflow 는 수평 확장성 을 지원하며 여러 스케줄러를 동시에 실행할 수 있다. 작업과 관련하여 Airflow는 작업을 실행하기 위해 전용 작업자 풀에 의존한다. 따라서 최대 작업 병렬 처리는 활성 작업자 수와 같다.
  • Argo 는 각 작업을 별도의 Kubernetes 포드로 실행하므로 수천 개의 포드와 워크플로를 병렬로 관리할 수 있다. Airflow와 달리 워크플로의 병렬 처리는 Argo의 고정된 작업자 수에 의해 제한되지 않는다. 따라서 시퀀스 및 병렬 단계 종속성이 있는 작업에 가장 적합하다.


Argo workflow가 구글 트렌드로 봤을 때 확실히 화제성은 부족한 것 같다.. Github star로 봐도 그렇고,,

다만, 내가 구축하려는 시뮬레이션 환경에서 실제 시나리오는 매우 복잡할 수 있다. 따라서 요구 사항에 따라 Airflow로 데이터 수집, 전처리, 모델 학습 등의 복잡한 워크플로우를 정의하거나, 개별 시나리오를 더 구체화 하여 세분화 해서 Argo Workflow의 장점을 살리는 법도 고민해봐야겠다.

코드 예시

아래는 동일한 내용을 각각 순서대로 Airflow(Python)와 Argo Workflow(Yaml)에서 정의하는 예시이다.

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

with DAG('example_dag', start_date=datetime(2023, 1, 1), schedule_interval=None) as dag:
    task_A = BashOperator(
        task_id='task_A',
        bash_command='echo hello A'
    )

    task_B = BashOperator(
        task_id='task_B',
        bash_command='echo hello B',
        depends_on_past=True,
        trigger_rule='all_success'
    )

    task_C = BashOperator(
        task_id='task_C',
        bash_command='echo hello C',
        depends_on_past=True,
        trigger_rule='all_success'
    )

    task_A >> task_B >> task_C
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: loops-dag-
spec:
  entrypoint: dag-example
  templates:
  - name: dag-example
    dag:
      tasks:
      - name: A
        template: A
      - name: B
        template: B
        dependencies: [A]
      - name: C
        template: C
        dependencies: [B]

  - name: A
    container:
      image: alpine:3.7
      command: [echo, hello A]

  - name: B
    container:
      image: alpine:3.7
      command: [echo, hello B]

  - name: C
    container:
      image: alpine:3.7
      command: [echo, hello C]

참고

0개의 댓글