LLM WikiAccess-protected knowledge portal

WIKI

실행기(Executor) 비교

Executor란 무엇인가 Airflow Scheduler는 어떤 Task를 언제 실행할지 결정하지만, 그 Task를 어디서, 어떤 방식으로 실행할지는 Executor 가 담당한다. Executor는 Airflow의 실행 계층이며, 개발 환경부터 대규모 프로덕션까지 상황에 맞는 선택이 중요하다. 주요 Executor 한눈에 보기 Executor 실행 위치 병렬성 추가 인프라 주 용도 SequentialExecutor Sched

경로human/study/content/airflow/04-executor-comparison.md
카테고리Study
태그#airflow #comparison #content #executor #kubernetes #mysql #study

Executor란 무엇인가

Airflow Scheduler는 어떤 Task를 언제 실행할지 결정하지만, 그 Task를 어디서, 어떤 방식으로 실행할지는 Executor가 담당한다. Executor는 Airflow의 실행 계층이며, 개발 환경부터 대규모 프로덕션까지 상황에 맞는 선택이 중요하다.

# airflow.cfg
[core]
executor = LocalExecutor

주요 Executor 한눈에 보기

Executor실행 위치병렬성추가 인프라주 용도
SequentialExecutorScheduler 프로세스 내순차 (1개)없음테스트·디버깅
LocalExecutorScheduler 서버 내 서브프로세스O (CPU 코어 수까지)없음소규모 프로덕션
CeleryExecutor별도 Worker 서버O (수평 확장)Celery + 브로커(Redis/RabbitMQ)중대규모 프로덕션
KubernetesExecutorK8s Pod (Task마다 1개)O (Pod 단위)Kubernetes 클러스터자원 격리·동적 스케일링

SequentialExecutor

설치 직후 SQLite와 함께 사용되는 기본 Executor다. Task를 하나씩 순서대로 실행하며, 병렬 실행이 불가능하다.

LocalExecutor

Scheduler 프로세스 Task 스케줄링 LocalExecutor
서브프로세스 (같은 서버) Worker Process 1 Worker Process 2 Worker Process N
LocalExecutor 실행 구조

Scheduler와 같은 머신에서 서브프로세스를 fork해 Task를 병렬 실행한다.

[core]
executor = LocalExecutor
parallelism = 32   # 동시 실행 Task 수 상한

CeleryExecutor

Scheduler Task 큐에 전송
브로커
(Redis / RabbitMQ)
Task 메시지 큐
별도 Worker 서버들 Celery Worker 1 Celery Worker 2 Celery Worker N
CeleryExecutor 분산 실행 구조

Task를 메시지 브로커(Redis 또는 RabbitMQ)를 통해 별도 Worker 서버에 분배한다. Worker를 수평으로 확장할 수 있어 높은 처리량을 달성할 수 있다.

[core]
executor = CeleryExecutor

[celery]
broker_url = redis://redis:6379/0
result_backend = db+postgresql://user:pass@postgres/airflow

업계에서는 중규모 이상의 프로덕션 Airflow 환경의 60% 이상이 CeleryExecutor를 사용한다고 알려져 있다.

KubernetesExecutor

Scheduler Pod 스펙 생성
Kubernetes API Pod 스케줄링
K8s 노드들 Pod: task_A Pod: task_B Pod: task_C
완료 후 Pod 종료
KubernetesExecutor: Task마다 독립 Pod 생성

Task가 시작될 때마다 Kubernetes Pod를 하나 생성하고, Task 완료 후 Pod를 종료한다. Task별로 컨테이너 이미지·CPU·메모리·환경변수를 독립적으로 지정할 수 있다.

# Task별 리소스 지정 예시
from kubernetes.client import models as k8s

@task(
    executor_config={
        "pod_override": k8s.V1Pod(
            spec=k8s.V1PodSpec(
                containers=[
                    k8s.V1Container(
                        name="base",
                        resources=k8s.V1ResourceRequirements(
                            requests={"cpu": "2", "memory": "4Gi"},
                            limits={"cpu": "4",   "memory": "8Gi"},
                        ),
                    )
                ]
            )
        )
    }
)
def heavy_ml_task():
    ...

Airflow 3.0: 복수 Executor 동시 사용

Airflow 3.0에서 CeleryKubernetesExecutor 같은 정적 하이브리드 Executor가 제거됐다. 대신 단일 DAG 안에서 Task별로 다른 Executor를 지정하는 방식이 도입됐다.

# airflow.cfg — 두 Executor 동시 등록
[core]
executor = CeleryExecutor,KubernetesExecutor
@task(executor="KubernetesExecutor")   # 이 Task만 K8s Pod에서 실행
def heavy_task():
    ...

@task(executor="CeleryExecutor")       # 이 Task는 Celery Worker에서
def light_task():
    ...

이 방식은 혼합 워크로드(일부 Task는 빠른 Celery, 일부는 격리된 K8s Pod 필요)를 유연하게 처리할 수 있다.

Executor 선택 가이드

시작: 실행 환경 결정
단일 서버?
소규모 팀?
LocalExecutor
|
트래픽 높음?
수평 확장 필요?
CeleryExecutor
|
K8s 운영 중?
Task 격리 필요?
KubernetesExecutor
Executor 선택 흐름
상황권장 Executor
로컬 개발·테스트LocalExecutor
소규모 단일 서버 프로덕션LocalExecutor
중대규모, Worker 수평 확장 필요CeleryExecutor
Kubernetes 환경, Task별 격리KubernetesExecutor
혼합 워크로드 (Airflow 3.0+)복수 Executor 동시 사용

References