Zum Hauptinhalt springen

Apache Airflow

Definition

Apache Airflow ist eine Open-Source-Plattform zum programmatischen Erstellen, Planen und Überwachen von Workflows. Workflows werden als Directed Acyclic Graphs (DAGs) in Python ausgedrückt, was Ingenieuren die volle Ausdruckskraft einer Programmiersprache gibt, um komplexe Abhängigkeiten, Verzweigungslogik, dynamische Task-Generierung und Wiederholungsrichtlinien zu definieren. Airflow wurde ursprünglich 2014 bei Airbnb erstellt und später an die Apache Software Foundation gespendet; es hat sich zum De-facto-Standard für die Batch-Workflow-Orchestrierung in Data Engineering und MLOps entwickelt.

Im ML-Kontext orchestriert Airflow den gesamten Modell-Lebenszyklus: Daten-Ingestion, Vorverarbeitung, Feature Engineering, Modelltraining, Evaluierung, Artefakt-Registrierung und Bereitstellung. Es führt die Berechnung nicht selbst durch — stattdessen delegiert es an spezialisierte Systeme (Spark, dbt, SageMaker, Kubernetes) über sein umfangreiches Operator-Ökosystem. Diese Trennung von Orchestrierung und Ausführung ist eine wichtige architektonische Stärke: Sie können die zugrunde liegende Rechenschicht austauschen, ohne die DAG-Logik zu ändern.

Funktionsweise

DAGs und Task-Abhängigkeiten

Ein DAG ist eine Python-Datei, die ein airflow.DAG-Objekt instanziiert und Tasks mit Operatoren definiert. Abhängigkeiten zwischen Tasks werden mit dem >>-Operator oder set_downstream/set_upstream-Aufrufen deklariert. Der Scheduler liest diese Dateien aus dem DAGs-Ordner, berechnet den Abhängigkeitsgraphen und löst Task-Instanzen aus, wenn alle Upstream-Abhängigkeiten im success-Zustand sind.

Operatoren, Sensoren und Hooks

Operatoren sind die atomaren Arbeitseinheiten in Airflow. PythonOperator führt ein Python-Callable aus; BashOperator führt einen Shell-Befehl aus; SparkSubmitOperator sendet einen Spark-Job. Sensoren sind eine spezielle Operatorklasse, die blockiert, bis eine Bedingung erfüllt ist. Hooks bieten wiederverwendbare Verbindungen zu externen Systemen.

XComs und Inter-Task-Kommunikation

XComs ermöglichen Tasks das Schieben und Ziehen kleiner Werte — Strings, Zahlen, JSON-Blobs — zwischen Task-Instanzen innerhalb desselben DAG-Laufs. XComs werden in der Airflow-Metadatenbank gespeichert und eignen sich ideal zum Weitergeben von Modellbewertungsmetriken, Artefaktpfaden oder Entscheidungs-Flags.

Scheduler-Architektur

Der Airflow-Scheduler ist ein Python-Prozess, der DAG-Dateien in einem konfigurierbaren Intervall analysiert, berechnet, welche Task-Instanzen ausgeführt werden können, und sie an den Executor übermittelt. Mit KubernetesExecutor erhält jede Task-Instanz einen eigenen isolierten Kubernetes-Pod.

Wann verwenden / Wann NICHT verwenden

Verwenden wennVermeiden wenn
Sie Batch-Workflow-Orchestrierung mit komplexen Abhängigkeiten benötigenIhre Arbeitslast Sub-Minute-Latenz erfordert oder ereignisgesteuert ist
Ihr Team Workflows in Python schreiben möchteSie einen Low-Code-Workflow-Builder bevorzugen
Sie umfangreiche Integration mit Cloud-Diensten benötigenIhre DAGs extrem einfach sind und ein Cron-Job ausreicht
Sie detaillierte Audit-Trails, Wiederholungen und Alarmierung benötigenSie einen verwalteten Zero-Ops-Orchestrierungsdienst benötigen

Vergleiche

KriteriumApache AirflowPrefect
BenutzerfreundlichkeitMittel — erfordert DAG-Modell, Scheduler-Setup, ExecutorsHoch — Pythonische Flows mit minimalem Boilerplate
SkalierbarkeitHoch — KubernetesExecutor skaliert Tasks unabhängigHoch — Prefect Cloud oder Self-hosted mit Work Pools
UI-QualitätGut — DAG-Graph, Gantt, Task-LogsHervorragend — moderne UI
LernkurveSteil — DAG-Semantik, XComs, ProviderSanft — fühlt sich wie reguläres Python an

Vor- und Nachteile

VorteileNachteile
Reifes Ökosystem mit Hunderten von Provider-IntegrationenErheblicher operativer Overhead (Scheduler, Worker, Metadaten-DB)
Volle Python-Ausdruckskraft für dynamische DAG-GenerierungDAG-Parsing-Fehler können den Scheduler stillschweigend unterbrechen
Starke Community und Enterprise-Support (MWAA, Cloud Composer)Nicht geeignet für Streaming oder Sub-Minute-Scheduling
KubernetesExecutor ermöglicht Task-RessourcenisolationXComs sind in der Größe begrenzt — nicht für große Artefakte geeignet

Codebeispiel

from __future__ import annotations
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.python import PythonOperator

default_args = {
"owner": "ml-team",
"retries": 2,
"retry_delay": timedelta(minutes=5),
"email_on_failure": True,
"email": ["ml-alerts@example.com"],
}

def extract_data(**context) -> None:
import pandas as pd, pathlib
df = pd.DataFrame({"feature_a": [1.0, 2.0], "feature_b": [0.1, 0.4], "label": [0, 1]})
output_path = "/tmp/airflow/training_data.parquet"
pathlib.Path(output_path).parent.mkdir(parents=True, exist_ok=True)
df.to_parquet(output_path, index=False)
context["ti"].xcom_push(key="data_path", value=output_path)

def train_model(**context) -> None:
import pandas as pd, mlflow, mlflow.sklearn
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

data_path = context["ti"].xcom_pull(task_ids="extract_data", key="data_path")
df = pd.read_parquet(data_path)
X = df[["feature_a", "feature_b"]].values
y = df["label"].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
with mlflow.start_run(run_name="airflow-logistic-regression"):
model = LogisticRegression()
model.fit(X_train, y_train)
accuracy = accuracy_score(y_test, model.predict(X_test))
mlflow.log_metric("accuracy", accuracy)
mlflow.sklearn.log_model(model, artifact_path="model")

with DAG(
dag_id="ml_training_pipeline",
description="Extract -> Train pipeline for nightly model refresh",
default_args=default_args,
start_date=datetime(2024, 1, 1),
schedule="0 2 * * *",
catchup=False,
tags=["ml", "training"],
) as dag:
extract = PythonOperator(task_id="extract_data", python_callable=extract_data)
train = PythonOperator(task_id="train_model", python_callable=train_model)
extract >> train

Praktische Ressourcen

Siehe auch