Migra­tion zu Apa­che Air­flow im DWH



Die Migra­tion zu Apa­che Air­flow beschreibt den lau­fen­den Moder­ni­sie­rungs­pro­zess einer gewach­se­nen, eigen­ent­wi­ckel­ten On-Prem-Orches­trie­rung hin zu einer eta­blier­ten, Python-basier­ten Work­flow-Platt­form. Wäh­rend die bestehende ser­vice­ba­sierte Steue­rung wei­ter­hin zuver­läs­sig arbei­tet, ist sie zuneh­mend von his­to­risch gewach­se­nen Kon­fi­gu­ra­ti­ons­struk­tu­ren und manu­el­len Betriebs­ab­läu­fen geprägt.

Die aktu­elle Orches­trie­rung läuft als per­ma­nen­ter Ser­vice. Sie wird regel­mä­ßig über Cron­jobs ange­sto­ßen, koor­di­niert Pro­zesse über Socket-Kom­mu­ni­ka­tion und steu­ert Lade­läufe auf Basis von JSON-Defi­ni­tio­nen sowie einer zen­tra­len Meta­da­ten­bank. Die zugrunde lie­gen­den Pro­gramme bestehen aus Python-2-Tools, die auf­grund des offi­zi­el­len End-of-Life von Python 2 per­spek­ti­visch abge­löst wer­den müssen.

Obwohl diese Archi­tek­tur sta­bil funk­tio­niert, bringt sie über die Jahre tech­ni­schen Alt­be­stand mit sich, wie ver­teilte Kon­fi­gu­ra­tio­nen, kom­plexe Abhän­gig­kei­ten und manu­ell nach­voll­zieh­bare Pro­zess­ket­ten. Gleich­zei­tig wächst mit der zuneh­men­den Kom­ple­xi­tät der täg­li­chen Lade­pro­zesse der Bedarf nach einer Platt­form, die Trans­pa­renz schafft, Wie­der­hol­bar­keit ermög­licht und sich fle­xi­bel erwei­tern lässt.

Vor die­sem Hin­ter­grund ent­steht par­al­lel eine neue Orches­trie­rungs­struk­tur auf Basis von Apa­che Air­flow. Ziel der Migra­tion zu Apa­che Air­flow ist es nicht nur, bestehende Tech­nik zu erset­zen, son­dern die Steue­rungs­lo­gik kla­rer zu modellieren.

Aus­gangs­lage vor der Migration

Das der­zei­tige Sys­tem basiert auf einer eigen­ent­wi­ckel­ten, ser­vice­ba­sier­ten On-Prem-Orchestrierung. 

Der Dis­patcher liest JSON-Defi­ni­tio­nen ein, prüft Abhän­gig­kei­ten in der Meta­da­ten­bank und star­tet anschlie­ßend die jewei­li­gen Ver­ar­bei­tungs­schritte. Er über­nimmt damit zugleich Sche­du­ling, Abhän­gig­keits­auf­lö­sung und Sta­tus­ver­wal­tung inner­halb des bestehen­den Systems.

Die Archi­tek­tur besteht aus meh­re­ren inein­an­der­grei­fen­den Schich­ten. Jobs beinhal­ten Python-2-Pro­gramme, die die Orches­trie­rungs­auf­ga­ben aus­füh­ren. JSON-Dateien defi­nie­ren die Steu­er­lo­gik, wäh­rend die zen­trale Meta­da­ten­bank Abhän­gig­kei­ten, Sta­tus­werte und Lade­zy­klen ver­wal­tet. Jeder Bestand­teil ist in einer sepa­ra­ten JSON-Datei definiert.

Die gesamte Ver­ar­bei­tung folgt einer kla­ren Struk­tur (Abbil­dung 1):

  • Dis­patcher initi­iert täg­li­che oder monat­li­che Ladezyklen.
  • Pläne struk­tu­rie­ren die Ver­ar­bei­tung ent­lang des Daten­mo­dells (z. B. Anker‑, Versions‑, Dimensionsobjekte).
  • Lade­grup­pen fas­sen fach­lich zusam­men­hän­gende Lade­ein­hei­ten zusammen.
  • Jobs füh­ren zu orches­trie­ren­den Arbei­ten aus, etwa SQL-Ope­ra­tio­nen und ETL-Workflows.

Obwohl diese Struk­tur funk­tio­nal und sta­bil ist, ist sie his­to­risch gewach­sen und ent­spre­chend kom­plex im Betrieb. Ände­run­gen müs­sen kon­sis­tent an meh­re­ren Stel­len vor­ge­nom­men und manu­ell impor­tiert wer­den. Zudem lässt sich ein voll­stän­di­ger Über­blick über Plan- und Job­ab­hän­gig­kei­ten oft nur über gezielte Daten­bank­ab­fra­gen oder durch manu­elle Ana­lyse in den JSON-Dateien gewinnen.

Abbil­dung 1: Struk­tur der der­zei­ti­gen Dis­patcher-basier­ten On-Prem-Orches­trie­rung vor der Migra­tion zu Apa­che Airflow.

Gren­zen der alten Struktur

Mit stei­gen­der Kom­ple­xi­tät der Lade­pro­zesse wird deut­lich, dass die Dis­patcher-basierte Struk­tur zuneh­mend an ihre struk­tu­rel­len Gren­zen gelangt. Die enge Ver­zah­nung von lau­fen­dem Ser­vice, Steu­er­lo­gik und Aus­füh­rung sorgt zwar für ein kon­sis­ten­tes Gesamt­sys­tem, erhöht jedoch den Auf­wand bei struk­tu­rel­len Anpas­sun­gen. Trans­pa­renz über Abhän­gig­kei­ten und Lauf­zu­stände ist grund­sätz­lich vor­han­den, setzt jedoch gezielte Ana­lyse und fun­dierte Sys­tem­kennt­nis voraus.

Dar­über hin­aus steht nur eine ein­ge­schränkte nutz­bare GUI zur Ver­fü­gung, die aus­schließ­lich unter macOS ver­füg­bar ist.

Hinzu kommt ein tech­ni­scher Platt­form­wech­sel im On-Prem-Umfeld. Mit der Migra­tion auf RHEL 9 ist Python 2 nicht mehr Bestand­teil der Instal­la­tion. Da die vor­han­de­nen Pro­gramme auf Python 2 basie­ren und Python 2 offi­zi­ell End-of-Life ist, ent­steht ein kon­kre­ter Moder­ni­sie­rungs­be­darf. Zudem wächst das DWH sowohl tech­nisch als auch fach­lich über das ursprüng­li­che Design­kon­zept der Orches­trie­rung hinaus.

Die Not­wen­dig­keit einer moder­nen und fle­xi­blen Orches­trie­rungs­lö­sung wird damit deutlich.

Work­flows in Apa­che Air­flow - wie Air­flow funktioniert

Apa­che Air­flow ist eine Python-basierte Open-Source-Orches­trie­rungs­soft­ware zur Defi­ni­tion, Pla­nung und Über­wa­chung von Work­flows. Sie wird ein­ge­setzt, um kom­plexe Daten­pro­zesse struk­tu­riert, nach­voll­zieh­bar und auto­ma­ti­siert aus­zu­füh­ren. Ein wesent­li­cher Vor­teil von Apa­che Air­flow besteht in der tech­no­lo­gie­un­ab­hän­gi­gen Orches­trie­rung unter­schied­lichs­ter Sys­teme. Zudem stellt Air­flow eine Viel­zahl von Ope­ra­to­ren für unter­schied­lichste Auf­ga­ben bereit.

Zusätz­lich las­sen sich eigene Ope­ra­to­ren ent­wi­ckeln, falls spe­zi­elle Anfor­de­run­gen bestehen. Dadurch lässt sich Air­flow fle­xi­bel in bestehende Sys­tem­land­schaf­ten inte­grie­ren und ist nicht auf eine bestimmte Tech­no­lo­gie oder Lauf­zeit­um­ge­bung beschränkt.

In Apa­che Air­flow wer­den Work­flows als DAGs (Direc­ted Acy­clic Graphs) model­liert. Der DAG beschreibt dabei, wel­che Schritte aus­ge­führt wer­den, in wel­cher Rei­hen­folge sie ablau­fen und unter wel­chen Bedin­gun­gen sie star­ten dür­fen. DAGs wer­den direkt als Python-Code defi­niert und nicht mehr über abs­trakte Kon­fi­gu­ra­ti­ons­da­teien gesteu­ert.

Ein DAG legt außer­dem fest, wann ein Work­flow aus­ge­führt wird und ab wel­chem Zeit­punkt er aktiv ist. Dazu gehö­ren ins­be­son­dere der Zeit­plan (sche­dule), der frü­hest­mög­li­che Start­zeit­punkt (start_date) sowie die Defi­ni­tion der ein­zel­nen Tasks und deren Abhängigkeiten.

Dabei sind Tasks abge­grenzte Arbeits­schritte inner­halb eines Work­flows. Sie wer­den über soge­nannte Ope­ra­to­ren umge­setzt, wel­che wie­derum die zu orches­trie­ren­den Arbei­ten aus­lö­sen, wie SQL-State­ments oder Shell-Kom­man­dos. Die Abhän­gig­kei­ten zwi­schen Tasks wer­den expli­zit im Code defi­niert und bestim­men, unter wel­chen Bedin­gun­gen ein Task aus­ge­führt wird. Dadurch ent­steht ein klar struk­tu­rier­ter und ein­deu­tig nach­voll­zieh­ba­rer Ablauf.

Ins­be­son­dere für umfang­rei­chere Work­flows bie­tet Air­flow zusätz­lich Task Groups, mit denen sich zusam­men­ge­hö­rige Tasks logisch bün­deln las­sen. Abhän­gig­kei­ten kön­nen nicht nur zwi­schen ein­zel­nen Tasks, son­dern auch zwi­schen gan­zen Grup­pen defi­niert wer­den. Task Groups las­sen sich dabei fle­xi­bel im Code erzeu­gen, was ins­be­son­dere bei daten­ge­trie­be­nen oder wie­der­keh­ren­den Lade­pro­zes­sen eine ska­lier­bare Model­lie­rung ermöglicht.

Code­bei­spiel: Ein ein­fa­cher DAG

Nach­fol­gend ist ein ein­fa­ches Code­bei­spiel für einen DAG dargestellt.

from datetime import datetime

from airflow import DAG
from airflow.providers.standard.operators.python import PythonOperator
from airflow.providers.standard.operators.bash import BashOperator


def check_prerequisites():
    print("Checking prerequisites for data load")


def load_data():
    print("Loading data into target system")


with DAG(
    dag_id="daily_data_load",
    start_date=datetime(2026, 1, 1),
    schedule="0 0 * * *",
    catchup=False,
) as dag:

    check = PythonOperator(
        task_id="check_prerequisites",
        python_callable=check_prerequisites,
    )

    load = PythonOperator(
        task_id="load_data",
        python_callable=load_data,
    )

    finalize = BashOperator(
        task_id="finalize_run",
        bash_command="echo Data load completed",
    )

    check >> load >> finalize

Die­ses Bei­spiel zeigt einen ein­fa­chen, täg­li­chen Lade­pro­zess mit ein­deu­tig defi­nier­ten Ver­ar­bei­tungs­schrit­ten und Abhän­gig­kei­ten. Die Rei­hen­folge der Tasks wird am Ende des Codes über die Bit­shift-Ope­ra­to­ren (») fest­ge­legt. Jeder Task über­nimmt eine abge­grenzte Auf­gabe, wäh­rend der DAG den zeit­li­chen Ablauf und die Rei­hen­folge der Aus­füh­rung steu­ert. Der Work­flow star­tet ab dem 1. Januar 2026 und wird anschlie­ßend täg­lich um 00:00 Uhr ausgeführt.

Dar­stel­lung und Moni­to­ring in der Airflow-GUI

Nach­dem der DAG defi­niert und im Code beschrie­ben ist, stellt Air­flow den Work­flow auto­ma­tisch in der gra­fi­schen Benut­zer­ober­flä­che dar. Die Air­flow-GUI bie­tet dabei eine visu­elle Über­sicht über alle Tasks, deren Abhän­gig­kei­ten sowie den aktu­el­len Aus­füh­rungs­sta­tus.
Die Abbil­dung 2 zeigt den zuvor defi­nier­ten Work­flow. Jeder Task erscheint als eige­ner Kno­ten, die Ver­bin­dun­gen ver­deut­li­chen die Abhän­gig­kei­ten und die fest­ge­legte Aus­füh­rungs­rei­hen­folge. Sta­tus­in­for­ma­tio­nen, Lauf­zei­ten, Logs und Code sind einsehbar.

DAG-Visualisierung in Airflow
Abbil­dung 2: DAG-Dar­stel­lung in Air­flow. Die Air­flow-GUI stellt den Work­flow auto­ma­tisch gra­fisch dar und zeigt Tasks, Abhän­gig­kei­ten, Sta­tus­in­for­ma­tio­nen sowie den DAG Code über­sicht­lich auf einen Blick.

Gleich­zei­tig las­sen sich über die Air­flow-GUI auch meh­rere Runs sowie deren Logs über­wa­chen (Abbil­dung 3).

Statusübersicht von DAG-Runs
Abbil­dung 3: Sta­tus­über­sicht von vier DAG-Runs (links) und Task-Log (rechts). Alle dar­ge­stell­ten Aus­füh­run­gen wur­den erfolg­reich abgeschlossen.

Air­flow besteht aus meh­re­ren Kom­po­nen­ten, die gemein­sam einen sta­bi­len Orches­trie­rungs­auf­bau bilden:

Kom­po­nenteAuf­gabe
Sche­du­lerPlant und trig­gert Tasks ent­spre­chend der DAG-Definitionen.
Exe­cu­torFührt die Tasks aus – ent­we­der lokal oder par­al­lel über meh­rere Ausführungseinheiten.
Trig­ge­rerÜber­wacht Ereig­nisse und Abhän­gig­kei­ten, ohne lau­fende Tasks unnö­tig zu blockieren.
API Ser­verStellt sowohl die REST-API als auch die Web-GUI bereit.
DAG-Pro­ces­sorLiest, parst und ver­ar­bei­tet DAG-Dateien getrennt vom Scheduler.

In der ein­ge­setz­ten Instal­la­tion wird der LocalE­xe­cu­tor ver­wen­det, wodurch Tasks par­al­lel über Python-Sub­pro­zesse aus­ge­führt wer­den. Die Air­flow-GUI wird über den inte­grier­ten API-Ser­ver bereit­ge­stellt, sodass ein sepa­ra­ter Web­ser­ver nicht erfor­der­lich ist. DAGs und Ope­ra­to­ren lie­gen ver­sio­niert in Git, Logs wer­den lokal gespei­chert. Dadurch blei­ben Deploy­ments repro­du­zier­bar und Abläufe transparent.

Für eine ver­tie­fende Betrach­tung von Work­flow-Manage­ment und Archi­tek­tur wird auf Work­flow-Manage­ment mit Apa­che Air­flow verwiesen.

Umset­zung der Migra­tion zu Apa­che Airflow

Der Wech­sel zu Air­flow ist nicht nur ein tech­ni­scher Umstieg, son­dern eine grund­le­gende Neu­aus­rich­tung. Ziel ist es, die aktu­ell ein­ge­setzte Logik in eine struk­tu­rierte, pro­gram­mier­bare Form zu über­füh­ren. Die Migra­tion von der alten Orches­trie­rung zu Air­flow erfor­dert eine Über­füh­rung der Logik, ohne dass bestehende Kom­ple­xi­tät in das neue Sys­tem über­tra­gen wird.

Ana­lyse der JSON-Strukturen

Zunächst wer­den die vor­han­de­nen JSON-Kon­fi­gu­ra­tion sowie die rele­van­ten Steu­er­in­for­ma­tio­nen ana­ly­siert und extra­hiert. Dazu zäh­len unter ande­rem Lade­grup­pen, Para­me­ter, Plan- und Job­ab­hän­gig­kei­ten sowie Trig­ger­lo­gi­ken. Viele die­ser Kon­zepte las­sen sich in Air­flow mit weni­gen Zei­len Code deut­lich kom­pak­ter und opti­mier­ter abbilden.

Python-2-Tools zu wie­der­ver­wend­ba­ren Operatoren

Die eigent­li­che Ver­ar­bei­tungs­lo­gik ist bereits im alten Sys­tem in Form von Python-2-Tools vor­han­den. Diese wer­den nach Erfas­sung des Funk­ti­ons­um­fangs als neue Air­flow-Ope­ra­to­ren ent­wi­ckelt. Die Ope­ra­to­ren kap­seln die Tools sau­ber, Para­me­ter und Abhän­gig­kei­ten wer­den direkt im Code defi­niert, und die gesamte Aus­füh­rung ist zen­tral nach­voll­zieh­bar. Dadurch ent­steht eine deut­lich wart­ba­rere und trans­pa­ren­tere Steue­rung als zuvor.

Par­al­lel­be­trieb und kon­trol­lier­ter Übergang

Um Risi­ken zu ver­mei­den, lau­fen altes und neues Sys­tem für einen defi­nier­ten Zeit­raum par­al­lel. Erst nach voll­stän­di­ger Über­ein­stim­mung der Ergeb­nisse wird die alte On-Prem-Orches­trie­rung abgeschaltet.

Ergeb­nisse und Vor­teile in der Praxis

Der Umstieg auf Air­flow bringt unmit­tel­bar spür­bare Ver­bes­se­run­gen. Trans­pa­renz, Feh­ler­ana­lyse und Wie­der­hol­bar­keit sind inte­gra­ler Bestand­teil der Platt­form. Lauf­zei­ten und Logs sind zen­tral ein­seh­bar, ein­zelne Tasks las­sen sich gezielt neu star­ten, und Ände­run­gen erfol­gen ver­sio­niert im Code statt ver­teilt über zahl­rei­che Konfigurationsdateien.

Somit las­sen sich neue Pro­zesse schnel­ler auf Basis von bestehen­der Ope­ra­to­ren ent­wi­ckeln. Gleich­zei­tig sorgt die inte­grierte Feh­ler­be­hand­lung für sta­bile Abläufe, und das Sys­tem kann mit stei­gen­den Anfor­de­run­gen pro­blem­los ska­liert werden.

Mehr als ein tech­ni­sches Upgrade

Die Ein­füh­rung von Apa­che Air­flow bedeu­tet mehr als eine reine Ablö­sung bestehen­der Tech­nik. Sie steht für den Schritt hin zu einer eta­blier­ten, weit ver­brei­te­ten Open-Source-Orchestrierungsplattform.

Work­flows wer­den nicht mehr impli­zit über Kon­fi­gu­ra­ti­ons­da­teien gesteu­ert, son­dern expli­zit als Python-Code model­liert. Dadurch ent­ste­hen klare Struk­tu­ren, ver­sio­nier­bare Ände­run­gen und nach­voll­zieh­bare Abhän­gig­kei­ten. Code-Reviews, Tests und kon­ti­nu­ier­li­che Wei­ter­ent­wick­lung sind fes­ter Bestand­teil des Entwicklungsprozesses.

Damit wird die Orches­trie­rung ins­ge­samt kla­rer, wart­ba­rer und leich­ter erwei­ter­bar. Neue Anfor­de­run­gen kön­nen sys­te­ma­tisch inte­griert wer­den, ohne dass exis­tie­rende Pro­zesse an Über­sicht ver­lie­ren. Dar­über hin­aus steht mit Apa­che Air­flow eine aktiv wei­ter­ent­wi­ckelte Platt­form zur Ver­fü­gung, die tech­no­lo­gisch anschluss­fä­hig bleibt und lang­fris­tige Sta­bi­li­tät bietet.

Fazit zur Migra­tion zu Apa­che Airflow

Der lau­fende Über­gang von der eigen­ent­wi­ckel­ten On-Prem-Orches­trie­rung zu Apa­che Air­flow steht für die Wei­ter­ent­wick­lung einer gewach­se­nen Steue­rungs­struk­tur hin zu einer moder­nen, stan­dar­di­sier­ten Workflow-Plattform.

Wäh­rend das bestehende Sys­tem wei­ter­hin sta­bil arbei­tet, wird mit Apa­che Air­flow die Orches­trie­rung neu struk­tu­riert. Die Abhän­gig­kei­ten sind klar defi­niert, Work­flows sind als Code beschrie­ben und War­tung sowie Erwei­te­rung wer­den ver­ein­facht. Gleich­zei­tig basiert die neue Steue­rung auf einer im Data-Engi­nee­ring-Umfeld eta­blier­ten Platt­form. Apa­che Air­flow orches­triert unter­schied­lichste Tech­no­lo­gien und lässt sich durch vor­han­dene sowie eigene Ope­ra­to­ren fle­xi­bel erweitern.

Dadurch ent­steht eine trag­fä­hige Grund­lage für zukünf­tige Anfor­de­run­gen im DWH- und ETL-Umfeld, die struk­tu­riert, nach­voll­zieh­bar und lang­fris­tig zukunfts­fä­hig ist.