본문 바로가기
MLOps/Airflow

[Airflow] Airflow란?

by AteN 2023. 1. 12.

Airflow 소개

Airflow은 워크 플로를 개발하고 모니터링하기 위한 오픈 소스 솔루션이다. Airflow의 주요 기능은 유연한 파이썬 프레임워크를 사용해 쉽게 데이터 파이프라인을 구축할 수 있게 해주며, 최신 기술 환경에서 접하게 되는 서로 다른 기술들을 연결할 수 있는 다양한 빌딩 블록을 제공한다

Airflow는 거미줄의 거미와 같이 데이터 프로세스 과정에서 중요한 역할을 하며 다양한 (분산) 시스템에서 발생하는 작업을 조율한다. 여기서 Airflow는 직접적으로 데이터 처리 작업을 수행하지는 않지만 데이터 처리를 위한 구성 요소를 조정한다

  • DAG (Directed A cyclic Graph : 방향성 비순환 그래프)
    • 태스크 간의 의존성을 명확하게 확인하는 방법 중 하나는, 데이터 파이프라인을 그래프로 표현하는 것이다. 이 그래프에서 태스크는 노드로 표시되고 태스크 간의 의존성은 태스크 노드 간의 방향으로 표시되는데, 화살표의 최종 끝점은 태스크 A에서 태스크 B로 연결되고, 태스크 B가 시작되기 전에 태스크 A를 완료해야 한다는 것을 의미한다. 이러한 형태의 그래프 방향성을 가지기 떄문에, 방향성 그래프 (directed graph)라고 한다
  • 파이썬 코드로 유연한 파이프라인 정의
    • Airflow는 파이썬 스크립트로 DAG의 구조를 설명하고 구성한다. (DAG 파일 안에 파이썬 코드를 사용하여 DAG를 정의함) 따라서 일반적으로 각 DAG 파일은 주어진 DAG에 대한 태스크 집합과 태스크 간의 의존성을 기술하고, Airflow는 DAG 구조를 식별하기 위해 코드를 파싱(parsing) 한다.
    • 그 외에도 DAG 파일에는 Airflow의 실행 방법과 시간 등을 정의한 몇 가지 추가 메타 데이터가 포함될 수 있다
    • Airflow 파이프 라인은 DAG 파일 안에 파이썬 코드를 사용하여 DAG를 정의한다. 일반적으로 각 DAG 파일은 서로 다른 태스크와 해당 의존성을 기술하는 하나의 DAG에 대해 정의한다. 그 외에도 DAG 파일에는 Airflow의 실행 방법과 시간 등을 정의한 몇 가지 추가 메타 데이터가 포함될 수 있다
  • 파이프 라인 스케줄링 및 실행
    • DAG로 파이프 라인 구조를 정의하고 나면, Airflow가 파이프라인을 언제 실행할 것인지 각각의 DAG의 실행 주기를 정의할 수 있다. 이를 통해 Airflow가 매시간, 매일, 매주 등 DAG를 실행하거나 Cron과 같은 표현식으로 더 복잡한 스케줄을 사용할 수 있다
      • Airflow 스케줄러 - DAG를 분석하고 현재 시점에서 DAG의 스케줄이 지난 경우 Airflow 워커에 DAG의 태스크를 예약
      • Airflow 워커 - 예약된 태스크를 선택하고 실행
      • Airflow 웹 서버 - 스케줄러에서 분석한 DAG를 시각화하고 DAG 실행과 결과를 확인할 수 있는 주요 인터페이스
  • 모티터링 과 실패 처리
    • Airflow는 DAG의 예약과 실행 기능 이외에도, DAG를 확인하고 실행 결과에 대해 모니터링이 가능한 웹 인터페이스를 제공한다. 예를 들면 개별 DAG의 태스크와 의존서엥 대한 그래프 뷰 (Graph View) 화면 제공한다. 이 기능은 DAG의 구조(태스크 간의 의존성에 대한 세세한 정보를 제공) 와 개별 DAG에 대한 실행 겨로가를 확인하는데 유용한다
    • Airflow는 그래프 뷰 외에도 특정 DAG에 대한 모든 실행 현황과 기록을 트리 (tree)를 통해 확인할 수 있다. 이를 통해 DAG가 시간 순으로 어떻게 수행되었는지 빠르게 확인할 수 있으며, 실패한 태스크에 대해서도 확인할 수 있는 좋은 기능이다.
    • 기본적으로 Airflow는 태스트 실패 시에 재시도 (재실행 시간의 간격을 설정할 수도 있음) 할 수 있기 때문에 오류 발생 시에 태스크를 복구할 수 있다. 재시도가 실패하면 Airflow는 태스크가 실패했음을 기록하고 사용자에게 실패를 통보한다. (사용자가 알림을 설정했을 경우). 트리 뷰를 통해 실패한 태스크를 보고 로그를 확인할 수 있으므로 디버깅을 쉽게 할 수 있다. 또한, 트리 뷰에서 개별 태스크 결과를 삭제하고 종속된 태스크를 모두 재실행 할 수 있다
  • 점진적 로딩 및 백필
    • Airflow의 스케줄 기능 중 강력한 것은 DAG에 정의된 특정 시점에 트리거할 수 있을 뿐만 아니라 (ex. Cron과 유사한) 최종 시점과 예상되는 다음 스케줄 주기를 상세하게 알려주는 것이다. 이를 통해 각각의 주기로 나누고 각 주기별로 DAG를 실행할 수 있다. 이와 같이 데이터 파이프라인을 점진적으로 실행할 수 있도록 구성이 가능하기 때문에 효율적인 데이터 파이프라인 구축이 가능하다. 이러한 점진적인 파이프라인에서 각 DAG는 매번 전체 데이터 세트를 다시 처리할 필요없이 해당 시간 슬롯(델타: delta 데이터)에 대한 데이텀ㄴ 처리한다. 특히 대규모 데이터를 처리해야 할 경우에 기존 결과에 대한 태스크 전체를 다시 수행하는 것을 방지하여 많은 시간과 비용을 절감할 수 있게 한다
    • 스케줄 주기가 백필 개념과 결합하여 스케줄 주기를 더욱 강력하게 활용할 수 있으며, 이를 통해 새로 생성한 DAG를 과거 시점 및 기간에 대해 실행이 가능하다. 이 기능을 통해 과거 특정 기간에 대해 DAG를 실행해 새로운 데이터 세트를 손쉽게 생성 (또는 백필)할 수 있다. 또한, 과거 실행 결과를 삭제한 다음, 태스크 코드를 변경한 후에 삭제된 과거 태스크를 쉽게 재실행할 수 있기 때문에 필요할 때 전체 데이터 세트를 간단하게 재구성해 처리할 수 있다

언제 Airflow를 사용해야 할까?

Airflow를 선택하는 이유

Airflow가 배치 지향 (Batch-oriented) 데이터 파이프라인을 구현하는데 적합한 이유는

  • 파이썬 코드를 이용해 파이프라인을 구현할 수 있기 때문에 파이썬 언어에서 구현할 수 있는 대부분의 방법을 사용하여 복잡한 커스텀 파이프 라인을 만들 수 있다
  • 파이선 기반의 Airfllow는 쉽게 확장이 가능하고 다양한 시스템과 통합이 가능하다. 실제로 Airflow 커뮤니티에서 다양한 유형의 데이터 베이서,, 클라우드 서비스 등과 통합할 수 있는 수 많은 애드온이 존재한다
  • 수많은 스케줄링 기법은 파이프라인을 정기적으로 실행하고 점진적(증분 : incremental) 처리를 통해 전체 파이프라인을 재실행할 필요 없는 효율적인 파이프라인 구축이 가능한다
  • 백필 기능을 사용하면 과거 데이터를 손쉽게 재처리할 수 있기 때문에 코드를 변경한 후 재생성이 필요한 데이터 재처리가 가능한다
  • Airflow의 훌륭한 웹 인터페이스는 파이프라인 실행 결과를 모니터링할 수 있고 오류를 디버깅하기 위한 편리한 뷰를 제공한다
  • 또 다른 장점은 Airflow는 오픈 소스라는 것이다. 때문에 특정 벤더에 종속되지 않고 Airflow를 사용할 수 있다. 또한 몇몇 회사에서는 Airflow를 설치 관리 및 실행에 대한 유연성을 제공하는 관리형 (managed) Airflow 솔루션 또한 제공하고 있다.

Airflow가 적합하지 않는 경우

  • Airflow는 반복적이거나 배치 태스트에 적합하여, 스트리밍(실시간 데이터 처리) 워크플로 및 해당 파이프라인 처리에 적합하지 않을 수 있다
  • 추가 및 삭제 태스트가 빈번한 동적 파이프라인의 경우에는 적합하지 않을 수 있다 (동적 태스크를 구현할 수 있지만, 웹 인터페이스는 DAG의 가장 최근 실행 버전에 대한 정의만 표현, 따라서 airflow는 실행되는 동안 구조가 변경되지 않은 파이프라인에 좀 더 적합)
  • 파이썬 언어로만 구현 되어있고, DAG를 구현
  • 파이썬 코드로 DAG를 작성하는 것은 파이프라인 규모가 커지면 광장히 복잡해 질 수 있다. 때문에 장기적으로 Airflow DAG를 유지 관리 위해서는 초기 사용 시점에서부터 엄격한 관리가 필요하다

파이프라인 그래프 실행

  • DAG는 파이프라인 실행을 위한 단순한 알고리즘을 제공한다는 이점을 제공한다. 알고리즘을 개념적으로 설명하면, 다음 단계로 구성한다
    • 그래프 안에 데이터는 각각 개방된(open) 상태이며(=미완료) 다음과 같은 단계를 수행한다.
      • 각각의 화살표 끝점은 Task 를 향하며 다음 Task로 향하기 전에 이전 Task가 완료되었는지 확인한다
      • Task가 완료되면 다음에 실행해야 할 Task를 대기열에 추가한다
    • 실행 대기열에 있는 Task를 실행하고 Task 수행이 완료되면 완료 표시로 한다
    • 그래프의 모든 태스크가 완료될 때까지 1단계로 돌아간다
  • DAG 구성을 사용하여 데이터 파이프인상의 정해진 순서로 태스크를 실행한다. 알고리즘을 통한 각 루프 태스크 상태를 확인하여 파이프라인에서 실행(종료 상태) 과정을 보여준다
  • 주요 워크 플로 특성에 대한 개요

name 회사 워크플로 개발 언어 백필 UI 플랫폼 설치 수평 확장

Airflow Airbnb Python Python Y Y Anywhere Y
Argo Applatix YAML Go 3rd Party Y Kubernetes Y
Azkaban LinkedIn YAML Java Y Y Anywhere  
Conductor Netflix JSON Java N Y Anywhere Y
Luigi Spotify Python Python N Y Anywhere Y
Make   Custom DSL C N N Anywhere N
Metaflow Netflix Python Python N N Anywhere Y
Nifi NSA UI Java Y Y Anywhere Y
Oozie   XML Java Y Y Hadoop Y
  • 백필(Backfilling) : 하나의 플로 (Airflow에서는 DAG)를 특정 옵션(기간) 기준으로 다시 실행할 수 있는 기능을 말한다. 태스크가 며칠 동안 실패하거나 새롭게 만든 플로를 과거의 특정 시점부터 순차적으로 실행하고 싶을 때 수행한다

주요 개념

DAG(Directed A cyclic Graph)

  • Airflow DAG는 여러 Task로 이루어져있다. Operator나 sensor가 하나의 Task로 만들어 진다.

Airflow는 기본적인 Task를 위해 다양한 Operator를 제공

  • DAG는 비순환 그래프로써 순환하는 싸이클 없는 그래프이다. 즉, 노드와 노드가 단방향으로 연결되어 있어 그 노드로 향하게 되면 돌아오지 않는 특성을 가지고 있다. airfllw에서는 Task의 연결관계를 DAG로 관리하고, Webserver를 통해서도 DAG구조를 시각적으로 확인할 수 있다

Airflow에서 기본적으로 제공하는 Opeartor 외에도 커뮤니티에서 만든 수 많은 Operator 들이 Data Engineer의 작업을 편하게 한다

Celery Executor는 Task를 메시지 브로커에 전달하고, Celery worker가 Task를 가져가서 실행하는 방식

Worker 수를 스케일 아우 할 수 있다는 장점이 있지만, 메시지 브로커를 따로 관리해야하고 워커 프로세스에 대한 모니터링도 필요하다는 단점이 있다

MetaData DB

: 작업 및 파이프라인의 메타 데이터 저장소

예를 들어 Task Status (queued, scheduled, running, success, failded, etc)가 저장된다

Airflow 를 처음 다운로드하면 기본적으로 빠른 시작을 위해 SQLite가 설치

본격적으로 사용하기 위해선 Mysql 이나 Postgres를 연결해야 한다

Web server

깔끔한 UI 또한 airflow의 특장점 중 하나.

UI뿐만 아니라 실행 중인 작업을 한 눈에 볼 수 있는 다양한 View 기능도 제공합니다.

다만 새로 작성한 작업을 업로드하는 업데이트 기능은 따로 없다는 점이 조금 불편합니다.

Scehduler

Airflow 구성요소의 핵심. 일 다했어? 그럼 이거 시작해! 하는 역할이에요.

모든 작업과 DAG을 모니터링하다가 Metadatabase 내 모든 작업의 status를 모니터링합니다.

특정 작업의 dependency가 만족되면 이를 실행시킬 뿐만 아니라, 이런 모든 작업의 실행 순서 또한 결정합니다.

  • Executor - 스케쥴러와 함께 동작하는 구성요소입니다. status가 queued인 태스크를 확인하며 실제 어떤 리소스가 투입되어 실행이 될 것인지를 결정합니다. 흔히 쓰이는 것으로는 Local Executor, Celery Executor, Kubernetes Executor 등이 있습니다.

Worker

실제 태스크를 수행하는 구성요소입니다.

필요에 따라 Scale-out 되어 병렬 작업이나 동시에 여러 태스크를 진행할 수도 있습니다.

Executor 및 airflow.cfg 에 의해 작업 환경 구성이 완성됩니다.

 

Airflowg.cfg

전반적인 airflow configuration을 담당하는 파일입니다.

대표적으로는 DAG 파일들을 어느 위치에 놓을 건지, log는 어디 저장할 건지 등등부터해서 엄청 다양한 설정을 할 수 있습니다.

 

 

댓글