Die Menge der zu ver­ar­bei­ten­den Daten ist in den letz­ten Jah­ren extrem gestie­gen. Um diese Big-Data-Men­gen ver­wal­ten zu kön­nen, gibt es eine Viel­zahl von Tools und Frame­works. Dabei kann der Ein­satz vie­ler Tech­no­lo­gien anhand von Work­flow Manage­ment Tools nicht nur auto­ma­ti­siert, son­dern auch sinn­voll orches­triert werden.

Tra­di­tio­nel­ler­weise bestehen viele Work­flows noch aus der star­ren, zeit­ba­sier­ten Aus­füh­rung ein­zel­ner Tasks, z.B. durch Cron­jobs. Nur mit CRON alleine ist es jedoch schwie­rig, kom­plexe Work­flows bzw. die Abhän­gig­kei­ten der Tasks unter­ein­an­der zu ver­wal­ten. Hier kann Apa­che Air­flow als zen­trale Instanz wei­ter­hel­fen, die die Tasks der ein­zel­nen Frame­works koor­di­niert und anstößt.

Was ist Apa­che Airflow?

Apa­che Air­flow ist eine Open-Source-Platt­form, mit der man Work­flows erstel­len, pla­nen und über­wa­chen kann. Ent­wi­ckelt wurde Air­flow von Airbnb um ihr kom­ple­xes Netz­werk an Auf­ga­ben zu ver­wal­ten. Haren­slak und De Rui­ter stel­len Air­flow als Spinne in ihrem Netz dar (siehe Data­pipe­lines with Apa­che Air­flow Haren­slak und De Rui­ter – 2021): Sie sitzt in der Mitte der Daten­pro­zesse und koor­di­niert dabei die Arbei­ten der ver­schie­de­nen Datenframeworks.

Dabei ist Air­flow selbst nicht als eigent­li­ches Daten­pro­zess­tool zu ver­ste­hen, son­dern als Orches­trie­rungs­werk­zeug, das die Daten­pipe­lines der ver­wen­de­ten Tools ver­wal­tet und über­wacht. Der Code für diese Orches­trie­rung wird dabei in Python ver­fasst und kann somit andere Frame­works sehr fle­xi­bel ein­bin­den. Zudem ist Python als Code­ba­sis von Air­flow vor­teil­haft, da es auf­grund des leich­ten Ein­stiegs und der Ein­fach­heit als Pro­gram­mier­spra­che weit ver­brei­tet ist. Die Hür­den sind somit nied­rig, um in Air­flow pro­duk­tiv wer­den zu können.

Als einer der gröss­ten Sup­porter hin­ter Air­flow steht das 2018 gegrün­dete Unter­neh­men Astro­no­mer mit Kun­den in über 35 Län­dern welt­weit. Des­sen Haupt­pro­dukt ist Astro, eine Daten­or­ches­trie­rungs­platt­form, die auf Air­flow basiert und als Cloud­lö­sung ange­bo­ten wird. Zudem wird Air­flow von einer akti­ven Com­mu­nity auf Git­hub von über 2000 Mit­wir­ken­den stän­dig weiterentwickelt.

Vor­teile von Apa­che Air­flow (siehe Medium):
  • Auto­ma­ti­sie­rung: Mit Air­flow kann man Work­flows fle­xi­bel gestal­ten und durch Sche­du­ling leicht automatisieren.
  • Bedie­ner­freund­li­che Ober­flä­che und Logs: Die nut­zer­freund­li­che gra­phi­sche Ober­flä­che schafft einen Über­blick über alle lau­fen­den Work­flows und Tasks und eig­net sich daher sehr gut zum Moni­to­ring und Ver­wal­ten. Die Logs der ein­zel­nen Tasks sind schnell ein­seh­bar und erleich­tern das Debuggen.
  • Kom­pa­ti­bi­li­tät und Erwei­ter­bar­keit: Air­flows Ope­ra­to­ren sind mit den meis­ten Daten­ban­ken und Frame­works kom­pa­ti­bel. So gibt es bei­spiels­weise spe­zi­elle Schnitt­stel­len-Ope­ra­to­ren zu Apa­che Spark, Hive oder Cas­san­dra, aber auch zu vie­len Ama­zon bzw. AWS und Azure Cloud­ser­vices und vie­len wei­te­ren Platt­for­men. Die Basis­ope­ra­to­ren sind um Cus­tom-Ope­ra­to­ren, die indi­vi­du­elle Bedürf­nisse umset­zen kön­nen, erweiterbar.
  • Dyna­mik: Pipe­lines kön­nen mit­hilfe von Python dyna­misch erstellt und instan­zi­iert werden.
  • Resi­li­ence und Alarme: Beim Fehl­schla­gen von Tasks kön­nen auto­ma­ti­sche Retries ein­ge­stellt wer­den sowie die betrof­fe­nen Stake­hol­der auto­ma­tisch per E‑Mail benach­rich­tigt werden.
Wann man Air­flow ein­set­zen sollte:
  • Wenn das Erstel­len von fle­xi­blen Daten­pipe­lines not­wen­dig ist. Die Viel­sei­tig­keit von Air­flow ist auf die zugrun­de­lie­gende Python-Basis zurückzuführen.
  • Zur Aus­füh­rung von Pipe­lines zu einem bestimm­ten Zeit­punkt ist Air­flows Sche­du­ler eine grosse Hilfe.
  • Im Falle von his­to­ri­schen Daten zeich­net sich Air­flow durch seine Back­fill-Fähig­kei­ten aus. So kön­nen über­sprun­gene DAG-Läufe erneut so ein­ge­plant wer­den, dass sie den vor­ge­se­he­nen Zeit­plan wie­der einholen.
  • Inner­halb eines Work­flows kön­nen auch ein­zelne Tasks neu gela­den wer­den. Dies ist res­sour­cen­scho­nend, da nicht gesamte Abläufe neu gela­den wer­den müssen.
  • Bei dyna­misch ver­än­der­ba­ren Pipe­lines. Wie bereits erwähnt, ermög­licht die Fle­xi­bi­li­tät durch die Python Basis Work­flows dyna­misch zu erstel­len. Jedoch war Air­flow bis 2.2.0 nicht für Pipe­lines aus­ge­legt, die sich bei jedem Lauf struk­tu­rell ver­än­dern (siehe Data­pipe­lines with Apa­che Air­flow Haren­slak und De Rui­ter – 2021). Dies wird sich ab der Ver­sion 2.3.0 ändern, die auch das dyna­mi­sche Erstel­len von Tasks zur Lauf­zeit unter­stüt­zen wird.
Wann man Air­flow nicht ein­set­zen sollte:
  • Für Data­strea­ming-Pipe­lines. Air­flow ist haupt­säch­lich für den Ein­satz in bat­ch­ori­en­tier­ten Tasks gedacht.
  • In Teams ohne Python-Erfah­rung. Die Imple­men­tie­rung und War­tung der Air­flow DAGs benö­tigt Python-Exper­tise und Ent­wick­ler-Kapa­zi­tät. Ist diese nicht vor­han­den, würde sich ein gra­phi­scher Work­flow-Mana­ger wie z.B. Azure Data Fac­tory eher anbieten.
Die Archi­tek­tur von Airflow:

Die fol­gende Gra­fik gibt einen Über­blick über die Archi­tek­tur von Airflow:

Abbil­dung 2: Air­flows Architektur
Das Setup von Airflow:

Am ein­fachs­ten lässt sich Air­flow in einem iso­lier­ten Docker­con­tai­ner auf­set­zen. Anlei­tun­gen sind zahl­reich online ver­füg­bar, so z.B. auf Medium.

Grund­le­gende Konzepte:

Im Fol­gen­den wer­den grund­le­gende Kon­zepte und Eck­punkte von Air­flow beleuchtet.

  • DAG und Task:

Ein DAG ist ein «Direc­ted Acy­clic Graph bzw. gerich­te­ter azy­kli­scher Graph», der Work­flows abbil­det und anhand einer Python-Datei defi­niert wird. Eine Task ent­spricht einem Kno­ten in einem DAG. Ein DAG bil­det eine Daten­pipe­line ab, in der Tasks logisch mit­ein­an­der ver­knüpft sind. Die Tasks sind «gerich­tet», da diese jeweils eine vor- sowie nach­ge­la­gerte Task haben müs­sen. «Azy­klisch» bedeu­tet, dass keine Selbst­re­fe­ren­zen erzeugt wer­den dür­fen, um so End­los­schlei­fen zu ver­mei­den. «Graph» bezieht sich auf die Dar­stel­lung der Tasks in einer rela­tio­na­len Struk­tur (s. Data­sci­en­tist).

So sieht eine bei­spiel­hafte gra­phi­sche Dar­stel­lung eines DAGs aus:

Abbil­dung 3: Bei­spiel DAG

In die­sem Bei­spiel wer­den die Tasks „runme_0‑2“ par­al­lel aus­ge­führt. Die fol­gen­den Tasks wer­den erst nach Abschluss der jeweils Vor­her­ge­hen­den getrig­gert. Die Rah­men­farbe der Tasks ändert sich je nach Sta­tus. Die in die­sem Fall grüne Umran­dung bedeu­tet, dass die Tasks erfolg­reich abge­schlos­sen wurde. Wei­tere Sta­tus sind z.B. „run­ning“, „fai­led“, „skip­ped“ oder „up_for_retry“ (siehe obige Darstellung).

  • Ope­ra­to­ren: Ein Ope­ra­tor bestimmt, wie die Tasks aus­ge­führt wer­den. Gene­rell gibt es drei Kate­go­rien an Operatoren:
  • Akti­ons-Ope­ra­to­ren wie z.B. Bash­Op­e­ra­tor (zur Aus­füh­rung von Bash Kom­man­dos), Pytho­n­Ope­ra­tor (zur Aus­füh­rung von Python Funk­tio­nen) oder Trig­ger­D­a­gRu­n­Ope­ra­tor (trig­gert einen ande­ren DAG) füh­ren eine bestimmte Funk­tion aus. Das u.g. Bei­spiel zeigt einen Pytho­n­Ope­ra­tor, der über das Argu­ment „python_callable“ die Python-Funk­tion „print_context“ aufruft:
Abbil­dung 4: Python Operator
  • Trans­fer-Ope­ra­to­ren wie bei­spiels­weise PostgresToS3Operator oder MyS­ql­To­Goo­gle­Cloud­S­to­rage­Ope­ra­tor über­tra­gen Daten von der Quelle zum Ziel.
  • Sen­sor-Ope­ra­to­ren war­ten auf das Fer­tig­stel­len von Tasks. So war­tet der File­Sen­sor-Ope­ra­tor bis eine Datei in einem bestimm­ten Pfad ver­füg­bar ist.
  • Hooks: Hooks ermög­li­chen das Anbin­den von exter­nen APIs und Daten­ban­ken wie z.B. Post­gres, S3, Hive etc. Dabei wer­den sen­si­tive Anmel­de­da­ten auf einer ver­schlüs­sel­ten Meta­da­ten-Daten­bank aufbewahrt.
Die Air­flow Web-Benutzeroberfläche:

Wie bereits erwähnt bie­tet Air­flow eine infor­ma­tive und über­sicht­li­che Web-Benut­zer­ober­flä­che an. Eine gute Gesamt­über­sicht über alle ver­füg­ba­ren DAGs ist hier zu sehen:

Abbil­dung 5: Air­flows Web-UI

Die obige Ober­flä­che gibt Aus­kunft über die Anzahl der erfolg­rei­chen sowie fehl­ge­schla­ge­nen Durch­läufe je DAG. So signa­li­siert die 8 im grü­nen Kreis beim „example_bash_operator“-DAG ein bis­her 8‑mal erfolg­rei­ches Durch­lau­fen, wäh­rend ein roter Kreis ein Fehl­schla­gen bedeu­ten würde. Auch wird rechts der Sta­tus der ein­zel­nen lau­fen­den bzw. abge­schlos­se­nen Tasks dar­ge­stellt. Wei­ter­hin ist im Feld „Sche­dule“ das aktu­ell geplante Zeit­in­ter­vall zur Aus­füh­rung der DAGs abzulesen.

Die Tree-View bie­tet einen guten Über­blick über die bereits gelau­fe­nen DAGs bzw. deren Tasks:

Abbil­dung 6: Tree-View

In die­ser Ansicht wer­den alle mög­li­chen Pfade des DAGs inklu­sive der Art der ver­wen­de­ten Ope­ra­to­ren ange­zeigt und es wird zudem das manu­elle Neu­star­ten von ver­gan­ge­nen Durch­läu­fen ermöglicht.

Der eigent­li­che Python-Code, mit dem der gesamte DAG auf­ge­baut ist, ist in der Web­ober­flä­che auch einsehbar:

Abbil­dung 7: Python-Code des DAGs

Der Rei­ter Admin ist ein wei­te­rer wich­ti­ger Bereich der Web­ober­flä­che. Hier kön­nen Ver­bin­dun­gen zu ande­ren Platt­for­men wie z.B. Daten­ban­ken defi­niert wer­den. Aus­ser­dem las­sen sich hier wie­der­ver­wend­bare Varia­blen und Kon­fi­gu­ra­tio­nen festlegen:

Abbil­dung 8: Air­flow Connections
Fazit:

Zusam­men­fas­send ist Air­flow ein viel­sei­tig ein­setz­ba­res Work­flow­ma­nage­ment-Frame­work, des­sen Fle­xi­bi­li­tät auf Python als Code­ba­sis beruht. Seine Stär­ken sind die Anbin­dungs­mög­lich­keit ver­schie­dens­ter Daten­ban­ken und Daten-Frame­works, auto­ma­ti­sches Aus­füh­ren ver­schie­de­ner Pipe­lines durch Sche­du­ling sowie Back­fil­ling von ver­gan­ge­nen Durch­läu­fen. Zudem ermög­licht die über­sicht­li­che Web­ober­flä­che eine effi­zi­ente Ver­wal­tung sämt­li­cher Daten­pipe­lines bzw. DAGs.