Loading Academy Hub...
Master Apache Airflow 2 internals: the Multi-Scheduler HA architecture, Metadata Database (PostgreSQL), Webserver, DAG file processor, and Executor types (Celery vs Kubernetes vs Local).
[!NOTE] Apache Airflow is the industry standard for programmatic workflow orchestration. Airflow does not process data itself; it orchestrates external compute engines (Databricks, Snowflake, BigQuery, Spark) through directed acyclic graphs (DAGs).
2026 Airflow 3 Standard): Task Isolation, DAG Versioning & ExecutorsScheduler + Triggerer + API Server in Airflow 3): Airflow 3 cleanly separates metadata database access behind an internal Task Execution API (Edge/API Server) so remote workers no longer need direct Postgres credentials, adds native DAG Versioning, and supports event-driven Asset-Aware Scheduling.Celery vs Kubernetes vs CeleryKubernetes): Use CeleryExecutor (with Autoscaling KEDA workers) for high-frequency lightweight tasks (<3s startup overhead); use KubernetesExecutor when tasks need strict per-task Docker image/dependency isolation or wildly varying GPU/RAM profiles (1 pod per task, ~15–30s pod spinup); use EdgeExecutor for remote on-prem/hybrid compute.PythonOperator worker RAM—dispatch heavy work to Spark/EMR Serverless, Databricks, Snowflake, or BigQuery.Review the production code, company interview Q&As, incident traces, and comprehension quiz inside this lesson.
from airflow import DAG
from airflow.operators.empty import EmptyOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'data_platform',
'depends_on_past': False,
'email_on_failure': True,
'email': ['dataops@company.com'],
'retries': 3,
'retry_delay': timedelta(minutes=5),
'execution_timeout': timedelta(hours=1)
}
with DAG(
dag_id='enterprise_lakehouse_orchestration',
default_args=default_args,
description='Daily medallion lakehouse sync',
schedule='0 2 * * *', # Daily at 02:00 UTC
start_date=datetime(2026, 1, 1),
catchup=False,
tags=['lakehouse', 'prod']
) as dag:
start = EmptyOperator(task_id='pipeline_start')
end = EmptyOperator(task_id='pipeline_end')
start >> endProcessPIDTimeout: The scheduler heartbeat has not been received in 120 seconds. Process may be deadlocked.