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):
| 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.)