

Apache Airflow is an open source platform to programmatically author, schedule, and monitor workflows.
Apache Airflow는 프로그래밍 방식으로 워크플로우를 작성, 예약 및 모니터링하는 오픈 소스 플랫폼입니다.

Airflow의 아키텍처는 여러 구성 요소로 이루어져 있다. 아래 내용은 각 구성 요소의 기능과 해당 구성 요소가 airflow 설치를 위해 무조건 설치해야하는 컴포넌트인지, 아니면 Airflow의 scalability, extensibility, performance를 더 높이기 위한 선택할 수 있는 컴포넌트인지를 설명한다.
아래 컴포넌트들은 extensibility, scalability, performance을 위해 옵션으로 설치할 수 있는 컴포넌트들이다.
모든 컴포넌트들은 python application이다. 추가로 패키지를 설치할 수 있으며, 이는 custom operators or sensors를 설치하고 custom plugin을 통해 airflow 기능을 확장하기에 좋다
Airflow는 단일 머신에서 실행되거나 스케줄러와 웹 서버만 배포되는 간단한 설치로 실행될 수 있지만, Airflow는 확장성과 보안을 염두에 두고 설계되어 Airflow는 분산 환경에서의 실행도 가능하다. 여러 machine에서 다양한 components가 동작할 수 있으며, 각기 다른 보안 경계 내에서 실행될 수 있다. 또한 위에 언급된 구성 요소의 여러 인스턴스를 실행하여 확장할 수도 있다.
components의 분리는 각 구성 요소를 서로 격리하고 서로 다른 작업을 수행할 수 있게 함으로써 보안을 강화할 수 있다. 예를 들어 DAG 프로세서를 스케줄러와 분리하면 스케줄러가 DAG 파일에 접근하지 못하게 하고, DAG 작성자가 제공한 코드를 실행하지 못하도록 보장한다.
또한 한사람이 airflow 설치를 실행하고 관리할 수 있지만, 더 복잡한 설정에서는 여러 사용자가 다양한 역할을 담당할 수 있도록 한다. 이를 통해 시스템의 각 component와 상호작용할 수 있고, 이는 Airflow deployment의 보안 측면에서 중요하다. 역할에 대한 자세한 내용은 Airflow Security Model에 기재되어 있으며, 일반적으로 아래와 같다.
💡 근데 basic installation으로 단일 머신에 airflow를 설치하더라도 위 3개의 역할로 나누어 담당할 수 있을거 같음
아래 다어이그램들은 다양한 Airflow 배포 방법에 대해 설명한다. 단순한 "단일 머신" 및 한 사람이 관리하는 배포 방식에서 점차적으로, 구성 요소가 분리되고 사용자 역할이 구분되며, 최종적으로 더 격리된 보안 경계를 갖는 더 복잡한 배포 방식으로 발전할 수 있다.
아래 다이어그램에서 다양한 connection type은 아래와 같다.
가장 단순한 방법. 이 배포 방법은 보통 LocalExecutor을 사용하고, 이는 scheduler와 workers가 같은 python process에 있고(worker가 scheduler component에 포함되어 있음), scheduler가 File System에서 DAG 파일들을 직접 읽는다. webserver는 scheduler가 설치된 같은 machine 안에서 동작한다. triggerer component는 따로 없으며, 이는 작업 연기(task deferral)가 불가능함을 의미한다.
이러한 설치는 user role을 분리하지 않는다. deployment, configuration, operation, authoring and maintenance 작업들이 한 사람의 의해 행해지고, 컴포넌트 사이에 보안 경계도 없다.

여러 machine에 airflow를 설치할 수 있으며 Deployment Manager, DAG author, Operations User와 같은 여러 사용자 롤을 도입할 수 있는 방법. 더 다양한 역할에 대해서는 Airflow Security Model을 권장.
이 방식의 경우 컴포넌트들의 보안을 고려하는 것이 중요하다. webservers는 DAG를 직접 읽지 않는다. UI의 Code 탭의 코드는 metadata database를 통해 읽어온다. webserver는 DAG author가 작성한 코드를 실행(execute)할 수 없다. (오직) Deployment Manager가 설치한 패키지나 플러그인으로 설치된 코드를 실행할 수 있으며, Operations User는 UI에 대한 접근만 가능하고 DAG와 task를 trigger만 할 수 있다. 즉 DAG는 작성하지 못한다.
💡 webserver에서 dag를 왜 수정하지 못하게 되어 있을까 생각했는데(수정할 수 있으면 굉장히 편리할거 같았음) 이런 role 구분을 위해 그렇게 만들었다는 것을 알 수 있었다.
DAG files는 모든 컴포넌트 간에 동기화되어야 한다. DAG files를 동기화하는 여러 방법이 있는데 가장 전형적인 방법은 Manage DAGs files 에 소개되어 있듯이 Helm chart를 사용하는 것이다. Helm chart는 k8s cluster 내에서 airflow를 배포하는 방법 중 하나이다.

보안과 격리가 중요한 더 복잡한 설치 환경에서는 스케줄러가 DAG 파일에 접근하지 못하도록 분리할 수 있도록 독립형 DAG 프로세서(DAG Processor) 구성 요소를 사용할 수도 있다. Airflow는 multi-tenant 기능을 지원하지는 않지만, DAG author가 작성한 코드가 scheduler 측에서 실행되지 않도록 할 수 있다. 즉 기존에 dag파일을 파싱한 후 이를 스케줄링 작업을 scheduler가 했는데, DAG Processor를 설치하면 dag 파일을 파싱하는 작업을 DAG Processor에게 할당하고 scheduler는 dag 파일을 직접적으로 읽지 않도록 할 수 있음.

💡 개인적으로 worker도 dag file에 직접 파일을 읽어들이지 않고 db에 있는 데이터를 가져와서 코드를 실행할 수는 없나 생각이 든다. 아마 스케줄링할때는 dag file 중 스케줄링 관련한 내용한 가져와서 사용하면 되기에 metadata DB를 사용할 수 있는거겠지? 그렇다면 dag file을 worker가 직접 읽어야 하긴 하겠다. 코드가 길어지고 파일구조가 복잡해질수록 DB에 넣는게 어려울 테니깐…
metadata DB에 어떤 데이터가 들어가는지 확인해보면 좋겠다.
task 타입으로 아래 3가지가 존재
@task, which is a custom Python function packaged up as a Task.내부적으로 이들은 모두 Airflow’s BaseOperator의 subclass이고, task와 operator의 개념은 어느정도 교환 가능(interchangeable)하다. 하지만 이를 다른 개념이라고 생각하는 것이 더 좋다. Operators와 Sensors는 템플릿 개념이며, DAG 파일에서 이를 호출할때 task를 생성하게 된다. (즉 task는 인스턴스 개념)
task는 서로 dependencies를 갖는데, 아래 2가지 방법을 통해 정의 가능하다
>> 와 << 기호를 통해 dependencies 정의
first_task >> [second_task, third_task]
fourth_task << third_task
set_upstream and set_downstream 함수를 통해 dependencies 정의
first_task.set_downstream([second_task, third_task])
fourth_task.set_upstream(third_task)
upstream task가 진행된 후 downstream이 진행될 수 있지만 Branching, LatestOnly, and Trigger Rules 기능을 통해 이를 커스텀마이징할 수 있다. Branching은 조건에 따라 다른 경로를 선택하게 하고, LatestOnly는 가장 최신 실행만 허용하며, Trigger Rules는 Task 실행 규칙을 설정하는 데 사용됩니다.
데이터를 task간에 교환하기 위해서 아래 3가지 방법이 있다.
airflow는 task를 실행하기 위해 가용할 공간이 생긴 worker에 보낸다. 따라서 한 DAG 내에 있는 모든 task가 같은 worker 또는 같은 machine 내에서 실행된다는 보장이 없다.
DAG를 작성하다 보면 굉장히 복잡해질 수 있는데, airflow는 좀 더 효율적으로 관리할 수 있는 여러 메커니즘을 제공한다. SubDAGs는 다른 DAG에 포함할 수 있는 "재사용 가능한" DAG를 생성하고, TaskGroups은 UI에서 시각적으로 task를 그룹화한다.
또한, 데이터 저장소와 같은 중앙 리소스에 쉽게 사전 구성된 액세스를 제공하기 위한 Connections & Hooks,
그리고 limiting concurrence을 위한 Pools 을 제공한다.