Choosing an Executor

Choosing an Executor for a Single Host

The official file uses the CeleryExecutor with a Redis 2,763 broker and a worker container, mirroring a multi-machine layout. On one host that buys nothing, because the worker shares the same CPUs. The LocalExecutor runs tasks in processes inside the scheduler container (Airflow Executors). Both stacks ran here, measured idle with docker stats (the Celery stack with no DAGs, the Local one after a day of BookNest runs):

Memory of the two Compose stacks (Airflow 3.3.2 129 , idle, shared 4-CPU host)
Container CeleryExecutor (official) LocalExecutor (this book)
API server 265 MiB 320 MiB
Scheduler 325 MiB 533 MiB (8 worker processes)
DAG processor 228 MiB 252 MiB
Triggerer 366 MiB 308 MiB
Celery worker 747 MiB none
Redis 8 MiB none
PostgreSQL 16 1,289 70 MiB 61 MiB
Total 2,009 MiB, 7 containers 1,474 MiB, 5 containers

The LocalExecutor saves a quarter of the memory and two moving parts while still running eight tasks at once. Move to Celery or Kubernetes 5,150 when tasks need other machines or isolation; the executor is configuration, so DAGs move unchanged. (The Celery stack ran redis:8; the pinned 7.2 image would not download here.)