{"id":18103,"date":"2020-02-10T15:21:43","date_gmt":"2020-02-10T14:21:43","guid":{"rendered":"https:\/\/www.inovex.de\/blog\/?p=18103"},"modified":"2022-11-22T10:19:58","modified_gmt":"2022-11-22T09:19:58","slug":"prefect-das-zeitgemaesse-airflow","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/","title":{"rendered":"Prefect: Das zeitgem\u00e4\u00dfe Airflow?"},"content":{"rendered":"<p>Was nicht passt wird passend gemacht! Das dachten sich vermutlich die Entwickler:innen von Prefect, als die Idee f\u00fcr ihr Projekt entstand. Es will sich als eine Art Weiterentwicklung des Workflow-Management und Orchestrierungs-Tools Apache Airflow verstanden wissen. Ein Upgrade, das die Unzul\u00e4nglichkeiten von Airflow ausmerzt und dadurch besser auf die sich st\u00e4ndig erweiternden Anforderungen der Data Engineering Branche zugeschnitten ist. Auf der <a href=\"https:\/\/www.prefect.io\/\">offiziellen Webseite<\/a> betitelt man sich bereits als \u201eThe Global Leader of Dataflow Automation\u201c. Dass das ganz der Wahrheit entspricht darf bezweifelt werden, zumal Prefect sich noch in der Entwicklungsphase befindet. Trotzdem lohnt es sich sich mal reinzuschauen, denn hier steckt ohne Zweifel mehr dahinter als ein blo\u00dfer Airflow-Klon im neuen Gewand.<!--more--><\/p>\n<p>Prefect ist in zwei Teile untergegliedert:\u00a0<b>Prefect Core<\/b>, die\u00a0open-source Einheit und Kern des Tools, sprich die Automatisierungs- und Scheduling-Engine sowie das kostenpflichtige Upgrade <b>Prefect<\/b> <strong>Cloud<\/strong>.<b>\u00a0<\/b>Dieses bietet zus\u00e4tzlich die Orchestrierung von Workflows und Logs in der Cloud sowie eine Web-basierte UI f\u00fcr das Monitoring der Workflows, \u00e4hnlich wie man es von Airflow kennt.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Prefect-Core\" >Prefect Core<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Tasks\" >Tasks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Datenfluss\" >Datenfluss<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Flows\" >Flows<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Visualisierung-und-Debugging\" >Visualisierung und Debugging<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Dynamische-Workflows\" >Dynamische Workflows<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Scheduling\" >Scheduling<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Parametrisierte-Workflows\" >Parametrisierte Workflows<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Versionierte-Workflows\" >Versionierte Workflows<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Und-vieles-mehr-%E2%80%A6\" >Und vieles mehr &#8230;<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Prefect-Cloud\" >Prefect Cloud<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Interaktion-mit-Prefect-Cloud\" >Interaktion mit Prefect Cloud<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Weitere-Voraussetzungen\" >Weitere Voraussetzungen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Deployment-Anpassen\" >Deployment Anpassen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Kostenmodell\" >Kostenmodell<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#Fazit\" >Fazit<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Prefect-Core\"><\/span>Prefect Core<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Wie eingangs erw\u00e4hnt ist Prefect mit der Intention entstanden, die Schwachstellen von Airflow aufzugreifen und in eigene St\u00e4rken umzuwandeln. Aus dieser Idee heraus bringt Prefect einige interessante Aspekte mit sich, von denen wir uns die Wichtigsten anschauen werden. Bevor es aber losgeht, muss\u00a0Prefect installiert werden. F\u00fcr die Code-Beispiele sind au\u00dferdem folgende Imports notwendig:<\/p>\n<pre class=\"lang:python decode:true\">from prefect import task, Flow, Client\r\n\r\nfrom prefect.schedules import Schedule\r\n\r\nfrom prefect.schedules.clocks import IntervalClock\r\n\r\nfrom prefect.environments.storage import Docker\r\n\r\nfrom prefect.environments import DaskKubernetesEnvironment\r\n\r\nfrom datetime import timedelta, datetime\r\n\r\n<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Tasks\"><\/span>Tasks<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>In Prefect wird jeder Teilschritt eines Workflows als <b>Task <\/b>bezeichnet, vergleichbar mit einem <em>Operator<\/em> in Airflow. Um eine Python-Funktion als Task zu deklarieren, muss man nichts weiter tun als sie mit einem <b>@task<\/b>\u00a0Annotator zu versehen. Sehr simpel, wie man anhand eines &#8222;Hello World&#8220;-Beispiels sehen kann:<\/p>\n<pre class=\"lang:python decode:true\" title=\"Einfacher Prefect Task\">@task\r\n\r\ndef say_hello():\r\n\r\n    print(\"Hello, world!\")<\/pre>\n<h3 id=\"Prefect-Datenfluss\"><span class=\"ez-toc-section\" id=\"Datenfluss\"><\/span>Datenfluss<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Unn\u00f6tig kompliziert werden Workflows mit Airflow oft durch die mangelnde Unterst\u00fctzung f\u00fcr den Austausch von Daten\u00a0zwischen Tasks. In der Dokumentation verweist man darauf, dass Tasks nach M\u00f6glichkeit unabh\u00e4ngig voneinander laufen sollen, denn Airflow will auch eine verteilte Ausf\u00fchrung auf mehreren Maschinen unterst\u00fctzen. Zwei Tasks, die Daten miteinander austauschen m\u00fcssen, k\u00f6nne man ja zu einem gro\u00dfen Task zusammenfassen.<\/p>\n<p>Immerhin, f\u00fcr den Fall, dass es eben doch nicht anderes geht, gibt es sogenannte<b> &#8222;XCom&#8220;<\/b>s, mit denen der Datenaustausch letztendlich doch m\u00f6glich ist. Das Problem ist allerdings, dass <em>XComs<\/em> daf\u00fcr konzipiert worden sind, nur Metadaten zu \u00fcbertragen. Sie werden in die Airflow Metadaten-Datenbank geschrieben, mit der Folge, dass diese maximal so gro\u00df wie die von der Datenbank unterst\u00fctzte Gr\u00f6\u00dfe eines BINARY LARGE OBJECT (BLOB) sein d\u00fcrfen. In der Praxis ist es damit nicht einmal m\u00f6glich, eine handels\u00fcbliche HTML-Seite abzuspeichern, ganz zu schweigen von gr\u00f6\u00dferen Listen oder Dataframes. Nat\u00fcrlich lassen sich zahlreiche Wege finden, diese Einschr\u00e4nkung zu umgehen. Dennoch festigt sich damit Eindruck, dass Airflow nicht so recht daf\u00fcr geeignet ist um <em>Data-Pipelines<\/em> aufzubauen.<\/p>\n<p>Mit Prefect l\u00e4sst sich der Datenfluss genauso intuitiv wie einfach implementieren: Upstream-Daten werden einem Task (=&gt; Python-Funktion) als Parameter \u00fcbergeben, Downstream-Daten entsprechen dem R\u00fcckgabewert der Funktion. Zur Veranschaulichung dient im Folgenden ein stark vereinfachtes\u00a0<strong>ETL (Extract \u2013 Transform \u2013 Load)<\/strong> Bespiel:<\/p>\n<pre class=\"lang:python decode:true\">@task\r\n\r\ndef extract():\r\n\r\n    return range(10)\r\n\r\n@task\r\n\r\ndef transform(x):\r\n\r\n    return [i * 10 for i in x]\r\n\r\n@task\r\n\r\ndef load(y):\r\n\r\n    for i in y:\r\n\r\n        print(\"Received i: {}\".format(i))<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Flows\"><\/span>Flows<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Abh\u00e4ngigkeiten von Tasks und deren Daten werden in Prefect durch <b>Flows <\/b>beschrieben. Die API erinnert dabei stark an Tensorflow-Sessions. Das ist einleuchtend, denn einen von Tensorflow erstellten C<em>omputational Graph\u00a0<\/em>kann man genau so gut durch das Wort Workflow ersetzen. Umgekehrt gilt nat\u00fcrlich dasselbe. Prefect erstellt nichts anderes als einen <em>computational graph<\/em>, der einen Workflow repr\u00e4sentiert.\u00a0In Airflow wird dieses Konzept bekannterma\u00dfen als\u00a0<b>DAG (Directed Acyclic Graph)<\/b> bezeichnet.<\/p>\n<p>Der Flow setzt sozusagen die einzelnen Bausteine eines Workflows zusammen. Dabei k\u00f6nnen Abh\u00e4ngigkeiten zwischen Tasks definiert werden, indem instanziierte Downstream-Tasks als Upstream-Parameter des jeweils n\u00e4chsten Tasks \u00fcbergeben werden. Schlussendlich wird mit der\u00a0<b><em>run()<\/em>\u00a0<\/b>Methode der Workflow lokal ausgef\u00fchrt. Und das war es auch schon. Mehr Code ist nicht notwendig um einen Workflow in Prefect zu definieren.<\/p>\n<pre class=\"lang:python decode:true\" title=\"Sample Text\">with Flow(\"ETL\") as flow:\r\n\r\n    e = extract()\r\n\r\n    t = transform(e)\r\n\r\n    l = load(t)\r\n\r\nflow.run()<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Visualisierung-und-Debugging\"><\/span>Visualisierung und Debugging<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Es f\u00e4llt auf, dass in diesem lokalen Szenario weder eine Backend Datenbank aufgesetzt noch ein Scheduler-Prozess gestartet werden musste. Letzteres gilt auch, wenn anders als im vorangegangenen Beispiel ein Scheduler f\u00fcr die automatisierte Ausf\u00fchrung eines Workflows verwendet wird. Bevor man einen Workflow deployed, ist es also ohne gro\u00dfen Aufwand m\u00f6glich, ihn lokal zu testen und zu debuggen.\u00a0Die <b><em>visualize()<\/em> <\/b>Methode ist eine weitere M\u00f6glichkeit, um lokal einen besseren \u00dcberblick \u00fcber einen Flow zu bekommen und m\u00f6gliche Fehler in den Abh\u00e4ngigkeiten von Tasks sichtbar zu machen. F\u00fcr einen Flow Run kann man sich auch die Zust\u00e4nde der einzelnen Tasks (z.B. SUCCESS, FAILED oder SKIPPED) direkt zur\u00fcckgeben lassen und anschlie\u00dfend der <em>visualize()<\/em> Methode als Parameter \u00fcbergeben. Die verschiedenen Zust\u00e4nde werden dabei entsprechend farblich hervorgehoben (hier: gr\u00fcn f\u00fcr SUCCESS). Unter der Ausgabe ist zudem ein Schaubild dargestellt, das alle Zust\u00e4nde beinhaltet, die Prefect Tasks annehmen k\u00f6nnen.<\/p>\n<pre class=\"lang:python decode:true\">task_states = flow.run()\r\n\r\nflow.visualize(flow_state=task_states)\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<figure id=\"attachment_18073\" aria-describedby=\"caption-attachment-18073\" style=\"width: 1294px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-18073\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/state_inheritance_diagram.svg\" alt=\"\" width=\"1294\" height=\"324\" \/><figcaption id=\"caption-attachment-18073\" class=\"wp-caption-text\">\u00dcberblick \u00fcber die verschiedenen Zust\u00e4nde von Prefect Tasks<\/figcaption><\/figure>\n<h3><span class=\"ez-toc-section\" id=\"Dynamische-Workflows\"><\/span>Dynamische Workflows<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>H\u00e4ufig ist es der Fall, dass es innerhalb eines Workflows einen Task gibt, den man mit einer vorerst unbekannten Anzahl von Wiederholungen ausf\u00fchren m\u00f6chte. Beispielsweise in folgendem Szenario: Task A durchsucht eine Datenbank nach neuen Kundeneintr\u00e4gen. Jeder Eintrag muss anschlie\u00dfend einem Task B \u00fcbergeben werden, der diesen weiter verarbeitet. Mit Airflow ist man nun gezwungen, Task B so zu implementieren, dass es als Eingabe die komplette Liste der Eintr\u00e4ge nimmt und dar\u00fcber iteriert. Was passiert allerdings in einem Szenario, in dem die Verarbeitung eines Eintrags auf irgendeine Weise fehlschl\u00e4gt? Richtig, der gesamte Task B schl\u00e4gt fehl. Er muss unter Ber\u00fccksichtigung von Idempotenz komplett neu ausgef\u00fchrt werden.<\/p>\n<p>Viel einfacher w\u00e4re es nat\u00fcrlich, wenn es eine M\u00f6glichkeit g\u00e4be, nur die eine fehlgeschlagene Operation erneut auszuf\u00fchren. Prefects <b>Task-Mapping <\/b>l\u00f6st dieses Problem auf einfache Art und Weise. Es erlaubt n\u00e4mlich die dynamische Generierung von Task-Instanzen zur Laufzeit. Die Mappings k\u00f6nnen dann ohne Probleme auch parallel ausgef\u00fchrt werden wodurch dynamischen parallelen Daten-Pipelines nichts mehr im Wege steht.<\/p>\n<p>Wir definieren nun unser ETL-Beispiel ein wenig um, sodass\u00a0transform() und load() nur noch einzelne Elemente bearbeiten. Die Magie findet nun im Bereich der Flow-Deklaration statt. Die <b><em>map()<\/em><\/b><em>&#8211;<\/em>Funktion ist daf\u00fcr verantwortlich, dass f\u00fcr jedes Element aus der Liste der Upstream-Daten ein eigenst\u00e4ndiger Task erzeugt wird. Wenn wir uns nun erneut ein Szenario vorstellen, in dem einer dieser Tasks fehlschl\u00e4gt, erkennt Prefect automatisch, dass diese einzelne Task-Instanz wiederholt werden muss. Der Vollst\u00e4ndige Code sieht nun wie flogt aus:<\/p>\n<pre class=\"lang:python decode:true\">@task\r\n\r\ndef extract():\r\n\r\n    return range(10)\r\n\r\n@task\r\n\r\ndef transform(x):\r\n\r\n    return x * 10\r\n\r\n@task\r\n\r\ndef load(y):\r\n\r\n    print(\"Received y: {}\".format(y))\r\n\r\nwith Flow(\"ETL Example\") as flow:\r\n\r\n    e = extract()\r\n\r\n    t = transform.map(e)\r\n\r\n    l = load.map(t)\r\n\r\nflow.run()<\/pre>\n<p>Noch einmal kurz und knapp: Task-Mapping erm\u00f6glicht es, parallelisierbare For-Schleifen zur Laufzeit in parallele Pipelines zu verwandeln.\u00a0F\u00fcr Situationen, die ein While-Schleifenmuster w\u00e4hrend der Laufzeit erfordern, gibt es analog dazu das\u00a0<b>Task-Looping.<\/b><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Scheduling\"><\/span>Scheduling<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nun kommen wir zum eigentlichen Herzst\u00fcck eines jeden Workflow-Tools, das <b>Scheduling<\/b>. Prefect betreibt Schedules anhand zweier wichtiger Parameter. Das <i>clock-<\/i>Objekt beschreibt, wie oft ein neuer Flow Run initiiert werden soll, gegebenenfalls erg\u00e4nzt durch ein Start- und\/oder Endzeitpunkt der Aktivit\u00e4t. Zudem k\u00f6nnen ein oder mehrere Filter einschr\u00e4nken, welche Flow Runs tats\u00e4chlich ausgef\u00fchrt werden. Denkbar w\u00e4re ein Szenario, in dem ein Filter\u00a0Flow Runs nur an Wochentagen oder w\u00e4hrend der Gesch\u00e4ftszeiten zul\u00e4sst.<\/p>\n<p>In unserem Beispiel verwenden wir ein <i>IntervalClock-<\/i>Objekt, welches beginnend ab jetzt ein Jahr lang jede Stunde einen Flow Run ausl\u00f6st und wir verzichten auf Filter. Anschlie\u00dfend ruft die Methode <i>next(5) <\/i>die n\u00e4chsten f\u00fcnf festgelegten Zeitpunkte ab. Nun ist nur noch zu beachten, dem Flow bei seiner Erstellung das\u00a0<i>Schedule-<\/i>Objekt zu \u00fcbergeben.<\/p>\n<pre class=\"lang:python decode:true\">schedule = Schedule(clocks=[IntervalClock(timedelta(hours=1), start_date=datetime.now(), end_date= datetime.now() + timedelta(years=1))])\r\n\r\nschedule.next(5)\r\n\r\nwith Flow(\"ETL Example\", schedule=schedule) as flow:\r\n\r\n    ...<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Parametrisierte-Workflows\"><\/span>Parametrisierte Workflows<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Ein weiteres Konzept von Prefect sind <b>Parameter<\/b>. Sie werden innerhalb von Flows definiert und werden intern genau wie Tasks behandelt. Der Unterschied ist, dass sie anders als Tasks keine Funktion ausf\u00fchren sondern lediglich einen Wert enthalten, der einem Task als Input \u00fcbergeben werden kann. Parameter sind besonders n\u00fctzlich, weil man sie auch zur Laufzeit und in Echtzeit ver\u00e4ndern kann. Es ist beispielsweise m\u00f6glich \u00fcber die Prefect Cloud UI Parameter von Workflows zu setzen, ohne sie aus dem Scheduler nehmen oder stoppen zu m\u00fcssen. Ein Einsatzszenario daf\u00fcr k\u00f6nnte eine Datenbank oder Tabelle sein, die von einem Task abgerufen wird. Wird beispielsweise deren Namen extern ge\u00e4ndert, kann man den Parameter f\u00fcr den Namen in der UI einfach auch neu setzen.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Versionierte-Workflows\"><\/span>Versionierte Workflows<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Das Versionieren von Workflows ist eine h\u00e4ufig gestellte Anforderung f\u00fcr das Deployment. Airflow bietet dieses Feature von Haus aus nicht, sodass man ein eigenes Versionierungssystem implementiert muss, wenn man nicht darauf verzichten will. Bei Prefect Cloud werden Workflows mittels Docker-Container deployed. Sobald das Programm feststellt, dass eine neue Version eines bereits bekannten Workflows eingetroffen ist, wird diese automatisch als Folgeversion der alten abgespeichert. Mit der Prefect Cloud UI lassen sich dann nicht nur die aktuelle Version sondern auch alle alten Versionen eines Workflows betrachten und aktivieren.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Und-vieles-mehr-%E2%80%A6\"><\/span>Und vieles mehr &#8230;<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nat\u00fcrlich besitzt Prefect noch weitere interessante Ans\u00e4tze und Ideen, die aus Gr\u00fcnden der Ausf\u00fchrlichkeit hier nicht explizit aufgef\u00fchrt sind. Dem interessierten Leser sei daf\u00fcr die sehr \u00fcbersichtliche und angenehm lesbar geschriebene <a href=\"https:\/\/docs.prefect.io\/core\/\">Prefect Dokumentation<\/a> mit an die Hand gegeben.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Prefect-Cloud\"><\/span>Prefect Cloud<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nun wissen wir, wie Workflows in Prefect aussehen und was ihre Vorteile sind. Dem Begriff Workflow-Management-Tool folgend fehlt also noch der zweite Teil: das Management bzw. die Orchestrierung. Sie umfasst neben dem Steuern und \u00dcberwachen von Workflows auch ein <i>User Interface (UI)<\/i>, mit dem diese T\u00e4tigkeiten auf benutzerfreundliche Weise ausgef\u00fchrt werden k\u00f6nnen. <b>Prefect Cloud <\/b>haben die Entwickler es getauft.<\/p>\n<p>Gerade die UI ist dank ihrer zahlreichen M\u00f6glichkeiten eine der St\u00e4rken von Prefects Konkurrent Airflow. Doch auch Prefect verspricht hier einen gr\u00f6\u00dftm\u00f6glichen Funktionsumfang. Zu sehen ist davon allerdings noch nicht ganz so viel, da Prefect Cloud noch in den Kinderschuhen steckt. Man muss aber fair bleiben und erw\u00e4hnen, dass die Entwickler gerade in den letzten Monaten gro\u00dfe Fortschritte in Richtung eines vermarktbaren Produktes gemacht haben. Zu den bereits implementierten Features z\u00e4hlen:<\/p>\n<ul>\n<li>Projekt-, Flow-, Flow Run-, Task- und Task Run-Dashboard<\/li>\n<li>Logs anschauen und filtern<\/li>\n<li>Gruppenfunktion<\/li>\n<li>Interaktive GraphQL API<\/li>\n<li>Interaktion mit Workflows: Starten, Flow-Parameter \u00e4ndern, States von Task Runs und Flow Runs \u00e4ndern, Schedules starten\/stoppen<\/li>\n<\/ul>\n<p>Zus\u00e4tzlich zu den genannten Funktionen w\u00e4ren zwei Dinge in naher Zukunft w\u00fcnschenswert. Zum einen die Visualisierung von Flow Runs, \u00e4hnlich zu der Ausgabe der <i>visualize()-<\/i>Methode. Momentan sieht man nur die Zust\u00e4nde der Tasks einzeln aber nicht den gro\u00dfen Zusammenhang. Zum anderen die M\u00f6glichkeit, die bereits modular angelegte Benutzungsoberfl\u00e4che nach eigenen W\u00fcnschen anpassen zu k\u00f6nnen.<\/p>\n<p>Die folgenden Screenshots sind hilfreich, um einen ersten Eindruck von der UI zu bekommen:<\/p>\n<figure id=\"attachment_18064\" aria-describedby=\"caption-attachment-18064\" style=\"width: 1006px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-18064\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/project.png\" alt=\"Prefect project dashboard screenshot\" width=\"1006\" height=\"551\" \/><figcaption id=\"caption-attachment-18064\" class=\"wp-caption-text\">Projekt-Dashboard: Projektweite Informationen und Statistiken zu allen Workflows<\/figcaption><\/figure>\n<figure id=\"attachment_18058\" aria-describedby=\"caption-attachment-18058\" style=\"width: 1023px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-18058\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow.png\" alt=\"Prefect flow dashboard screenshot\" width=\"1023\" height=\"671\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow.png 1580w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow-300x197.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow-1024x671.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow-768x504.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow-1536x1007.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow-400x262.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flow-360x236.png 360w\" sizes=\"auto, (max-width: 1023px) 100vw, 1023px\" \/><figcaption id=\"caption-attachment-18058\" class=\"wp-caption-text\">Flow-Dashboard: Statistiken und Informationen zu einem bestimmten Workflow, Auflistung vergangener Flow Runs<\/figcaption><\/figure>\n<figure id=\"attachment_18059\" aria-describedby=\"caption-attachment-18059\" style=\"width: 1058px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-18059\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/flowrun.png\" alt=\"Prefect flow run dashboard screenshot\" width=\"1058\" height=\"825\" \/><figcaption id=\"caption-attachment-18059\" class=\"wp-caption-text\">Flow Run-Dashboard: Informationen \u00fcber eine spezifische Ausf\u00fchrung eines Workflows, zeitliche Darstellung der Tasks im Gantt-Diagramm<\/figcaption><\/figure>\n<figure id=\"attachment_18062\" aria-describedby=\"caption-attachment-18062\" style=\"width: 1047px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-18062\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/task.png\" alt=\"Prefect task dashboard screenshot\" width=\"1047\" height=\"757\" \/><figcaption id=\"caption-attachment-18062\" class=\"wp-caption-text\">Task-Dashboard: Informationen zu einem bestimmten Tasks, Darstellung der Upstream- und Downstream-Dependencies, Auflistung vergangener Task Runs<\/figcaption><\/figure>\n<figure id=\"attachment_18063\" aria-describedby=\"caption-attachment-18063\" style=\"width: 1064px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-18063\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/taskrun.png\" alt=\"Prefect task run dashboard screenshot\" width=\"1064\" height=\"629\" \/><figcaption id=\"caption-attachment-18063\" class=\"wp-caption-text\">Task Run-Dashboard: Informationen zur spezifischen Ausf\u00fchrung eines Tasks, Darstellung der Upstream- und Downstream-Dependencies<\/figcaption><\/figure>\n<figure id=\"attachment_18061\" aria-describedby=\"caption-attachment-18061\" style=\"width: 1048px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-18061\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/logs.png\" alt=\"Prefect log screenshot\" width=\"1048\" height=\"782\" \/><figcaption id=\"caption-attachment-18061\" class=\"wp-caption-text\">Inspektion des Logs von einem Flow Run, verschiedene Filterm\u00f6glichkeiten<\/figcaption><\/figure>\n<h3><span class=\"ez-toc-section\" id=\"Interaktion-mit-Prefect-Cloud\"><\/span>Interaktion mit Prefect Cloud<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Wie so oft im Leben gibt es auch mit Prefect Cloud verschiedene Wege, um ans Ziel zu kommen. F\u00fcr die meisten Belange sind es vier St\u00fcck an der Zahl:<\/p>\n<ul>\n<li>Command Line Interface (CLI)<\/li>\n<li>Python<\/li>\n<li>Schaltfl\u00e4chen der UI<\/li>\n<li>Interaktive GraphQL API in die UI integriert (<a href=\"https:\/\/graphql.org\/\">GraphQL<\/a> ist eine open-source Abfragesprache, mit der sich alle erdenklichen Daten und Parameter der internen Prefect Cloud Datenbank abfragen (<i>query)<\/i> und manipulieren (<i>mutation<\/i>) lassen)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-18056 size-full\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/perfectcloud-Page-1-1-1.png\" alt=\"Prefect Cloud interaction\" width=\"699\" height=\"275\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/perfectcloud-Page-1-1-1.png 699w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/perfectcloud-Page-1-1-1-300x118.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/perfectcloud-Page-1-1-1-400x157.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/01\/perfectcloud-Page-1-1-1-360x142.png 360w\" sizes=\"auto, (max-width: 699px) 100vw, 699px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Der Benutzer interagiert in drei Schritten mit Prefect Cloud:<\/p>\n<ol>\n<li><em>Lokalen Rechner authentifizieren:<\/em> Am einfachsten ist es, sich daf\u00fcr \u00fcber die Web UI anzumelden. Ebenfalls ist es \u00fcblich, sich mit einem zuvor erstellten Token \u00fcber das CLI zu authentifizieren:\n<pre class=\"lang:default decode:true\">prefect auth login -t &lt;USER-TOKEN&gt;<\/pre>\n<\/li>\n<li><em>Flows in Prefect Cloud registrieren:<\/em> Wir greifen nun zur\u00fcck auf das Beispiel des Task-Mapping-Abschnitts. Anstatt den Flow durch <i>flow.run() <\/i>lokal auszuf\u00fchren, machen wir ihn zun\u00e4chst mit der <i><strong>register()<\/strong>\u00a0<\/i>Methode Prefect Cloud bekannt:\n<pre class=\"lang:python decode:true\">with Flow(\"ETL Example\") as flow:\r\n\r\n    e = extract()\r\n\r\n    t = transform.map(e)\r\n\r\n    l = load.map(t)\r\n\r\n    flow.register(&lt;OPTIONS&gt;)<\/pre>\n<\/li>\n<li><em>Hochgeladene Workflows ausf\u00fchren (Flow Runs erstellen):<\/em> Dieser Schritt ist in unserem Beispiel nicht zwingend notwendig, da das Scheduling des Workflows mit dessen Registrierung sofort aktiv ist. Der Vollst\u00e4ndigkeit halber erstellen wir aber einen weiteren Flow Run abseits des Schedules. Das geschieht durch des <i>Client-<\/i>Objekt, welches die Methode <i>create_flow_run()\u00a0<\/i>aufruft.\n<pre class=\"lang:python decode:true\">with Flow(\"ETL Example\", schedule=schedule) as flow:\r\n\r\n    ...\r\n\r\n    flow_id = flow.register(\"My ETL Project\")\r\n\r\n    c = Client()\r\n\r\n    c.create_flow_run(flow_id=flow_id<\/pre>\n<\/li>\n<\/ol>\n<h3><span class=\"ez-toc-section\" id=\"Weitere-Voraussetzungen\"><\/span>Weitere Voraussetzungen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Damit Prefect Cloud die Flow Runs schlie\u00dflich ausf\u00fchrt, ist es notwendig auf der ausf\u00fchrenden Maschine einen <b>Agent<\/b> zu starten. Das ist ein Prozess, der Prefect Cloud kontinuierlich nach anstehenden Flow Runs abfragt. Er sorgt dann f\u00fcr die richtige Ausf\u00fchrung und weist dem Flow Run Ressourcen daf\u00fcr zu. Wenn also der Agent-Prozess nicht im Hintergrund l\u00e4uft, wird auch Prefect Cloud keine Flow Runs abarbeiten. Gestartet wird ein Agent beispielsweise \u00fcber das CLI:<\/p>\n<pre class=\"lang:default decode:true\">prefect agent start -t &lt;RUNNER-TOKEN&gt;<\/pre>\n<p>Wie bei der Authentifizierung des User-Token muss man dem Agent ein zuvor generiertes Runner-Token \u00fcbergeben, damit er wei\u00df mit welcher Prefect Cloud Instanz er sich in Verbindung setzen muss.<\/p>\n<p>Es ist problemlos m\u00f6glich, Workflows lokal abzuspeichern und somit auch lokal von Prefect Cloud ausf\u00fchren zu lassen. Das ist vor allem f\u00fcr das Testen und Kennenlernen von Prefect Cloud sinnvoll. In einer Produktionsumgebung hingegen ist es unerl\u00e4sslich, die Verf\u00fcgbarkeit von Flows \u00fcber den eigenen Rechner hinaus zu gew\u00e4hrleisten. Ab diesem Zeitpunkt muss zus\u00e4tzlich <b>Docker<\/b> installiert sein und laufen.<\/p>\n<p>Bei der Registrierung eines neues Workflows in Prefect Cloud wird dann das <em>Flow<\/em>-Objekt serialisiert und in einem Docker Container abgelegt. Ohne weiteres Zutun verwendet Prefect Cloud ein Default Docker Image. Es ist aber genauso m\u00f6glich und manchmal auch notwendig, ein eigenes Image zu verwenden, vor allem wenn es darum geht, Dependencies zu installieren. PyPI-Dependencies lassen sich ganz einfach \u00fcber einen entsprechenden Befehl in Zusammenhang mit der Registrierung eines Flows mit einbinden. Alle anderen muss man nach jetzigem Stand der Dinge in einem benutzerdefinierten Container \u201eper Hand\u201c einf\u00fcgen. Als letzten Schritt gibt man bei der Registrierung noch eine Docker Registry an, auf die das Image gepusht werden soll.<\/p>\n<p>Bei der Ausf\u00fchrung eines neues Workflows wird das Image, das den Flow beherbergt, von der Registry geladen. Der Agent sorgt daf\u00fcr, dass alle Infrastrukturanforderungen erf\u00fcllt sind und f\u00fchrt den Flow Run mit dem spezifizierten Wo und Wie aus.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Deployment-Anpassen\"><\/span>Deployment Anpassen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Die zwei zentralen Fragen, die man im Zusammenhang mit dem Deployment kl\u00e4ren muss, sind:<\/p>\n<ol>\n<li>Wo will ich meine Flows speichern?<\/li>\n<li>Wie und wo sollen meine Flow Runs ausgef\u00fchrt werden?<\/li>\n<\/ol>\n<p>F\u00fcr die erste Angelegenheit ist das\u00a0<b>Storage<\/b>-Objekt der richtige Ansprechpartner. Angeschnitten haben wir bereits den \u201eLocal Storage\u201c f\u00fcr die Speicherung auf dem eigenen Rechner sowie den \u201eDocker Storage\u201c f\u00fcr eine universelle Verf\u00fcgbarkeit in einer Docker Registry. Das ist sicherlich f\u00fcr die meisten Use Cases absolut zweckm\u00e4\u00dfig. Falls man aber dennoch Cloud-Speicher der g\u00e4ngigen Anbieter bevorzugt, bietet Prefect Cloud auch daf\u00fcr die Schnittstellen. Nachfolgend die komplette Liste der aktuell verf\u00fcgbaren Optionen:<\/p>\n<ul>\n<li>Lokal (Default)<\/li>\n<li>Docker Registry<\/li>\n<li>Azure Blob<\/li>\n<li>AWS S3<\/li>\n<li>Google Cloud<\/li>\n<\/ul>\n<p>Das Environment wiederum spezifiziert, wo und wie der Flow Run ausgef\u00fchrt werden soll und ob es irgendwelche zus\u00e4tzlichen Infrastrukturanforderungen gibt. Daf\u00fcr stehen aktuell folgende Spezifikationen zur Verf\u00fcgung:<\/p>\n<ul>\n<li>Remote Environment (Default)<\/li>\n<li>Dask Kubernetes Environment<\/li>\n<li>Kubernetes Job Environment<\/li>\n<li>Fargate Task Environment<\/li>\n<li>Custom Environment<\/li>\n<\/ul>\n<p>Es gilt noch zu beachten, dass die Wahl des Environments auch den Agent beeinflusst. Will man beispielsweise seine Workflows auf einem Kubernetes Cluster ausf\u00fchren, gibt es daf\u00fcr eigens einen Kubernetes Agent, der die Workflows direkt als Kubernetes Jobs ausf\u00fchrt.<\/p>\n<p>Zum Abschluss gibt es nochmal ein Beispiel in kompletter Ausf\u00fchrung. Als Neuheit wird das <em>Flow<\/em>-Objekt dabei mit einem <em>Storage<\/em>&#8211; und einem <em>Environment<\/em>-Parameter erg\u00e4nzt. Dadurch wird der Workflow in einem Docker Image gespeichert, welches das PyPI-Package\u00a0<em>numpy <\/em>installiert hat\u00a0und auf das angegebene Registry <em>gcr.io\/dev<\/em>\u00a0gepusht wird. Au\u00dferdem wird der Workflow jetzt\u00a0auf Kubernetes mit einem automatisch skalierenden Dask-Cluster ausgef\u00fchrt.<\/p>\n<pre class=\"lang:python decode:true\">@task\r\n\r\ndef extract():\r\n\r\n    return range(10)\r\n\r\n@task\r\n\r\ndef transform(x):\r\n\r\n    return x * 10\r\n\r\n@task\r\n\r\ndef load(y):\r\n\r\n    print(\"Received y: {}\".format(y))\r\n\r\nschedule = Schedule(clocks=[IntervalClock(timedelta(hours=1), start_date=datetime.now(), end_date= datetime.now() + timedelta(years=1))])\r\n\r\nschedule.next(5)\r\n\r\nstorage = Docker(registry_url=\"gcr.io\/dev\/\", python_dependencies=[\"numpy\"])\r\n\r\ndask_kubernetes_env = DaskKubernetesEnvironment(min_workers=1, max_workers=3)\r\n\r\nwith Flow(\"ETL Example\", schedule=schedule, storage=docker_storage, environment=dask_kubernetens_env) as flow:\r\n\r\n    e = extract()\r\n\r\n    t = transform.map(e)\r\n\r\n    l = load.map(t)\r\n\r\n    flow_id = flow.register(\"My ETL Project\")<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Kostenmodell\"><\/span>Kostenmodell<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Kommen wir abschlie\u00dfend zur Monetarisierung. Prefect Core ist wie bereits erw\u00e4hnt open-source und kostet somit nichts. Prefect Cloud kann man aktuell in der Early-Access-Phase f\u00fcr 30 Tage kostenlos testen. Anschlie\u00dfend werden monatliche Kosten f\u00e4llig. Anfangs sind die Entwickler der Idee nachgegangen, dass es verschiedene Kostenstufen geben soll, mit denen z.B. 10.000, 100.000, oder 1.000.000 erfolgreiche Task Runs pro Monat m\u00f6glich sind.\u00a0Das Kostenmodell mutete aber ein wenig seltsam an, denn durch die Abrechnung nach erfolgreichen Tasks pro Monat k\u00f6nnte man sich dazu veranlasst sehen, gr\u00f6\u00dfere anstelle von kleineren Tasks zu bevorzugen. Genau das widerspricht aber den genannten Konzepten des Datenflusses und des Tasks-Mappings. M\u00f6glicherweise war das einer der Gr\u00fcnde, warum das Team von Prefect nun doch einen anderen Weg eingeschlagen hat. Nun ist n\u00e4mlich eine freie Version von Prefect Cloud geplant \u2013 tats\u00e4chlich mit unbegrenzt vielen Task und Flow Runs. Diese Version soll daf\u00fcr aber einen begrenzten Umfang an hochladbaren Flows und eine eingeschr\u00e4nkte Flow Run History haben sowie lediglich als Single-User-System verf\u00fcgbar sein. Wem diese Einschr\u00e4nkungen zu viel sind, der muss auf die kostenpflichtige Version zur\u00fcckgreifen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Fazit\"><\/span>Fazit<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Vorteile:<\/p>\n<ul>\n<li>Im Gegensatz zu Airflow unterst\u00fctzt Prefect den Datenfluss zwischen Tasks vollst\u00e4ndig<\/li>\n<li>Dynamische\/parametrisierte Workflows ohne Mehraufwand m\u00f6glich<\/li>\n<li>Task-Mapping und Task-Looping erlauben dynamische Generierung von Tasks zur Laufzeit<\/li>\n<li>Lokales Testen von Workflows sehr leicht m\u00f6glich<\/li>\n<li>Code f\u00fcr das Definieren von Tasks und Flow \u00fcbersichtlicher als in Airflow<\/li>\n<li>Voraussichtlich weitere spannende Features in naher Zukunft<\/li>\n<\/ul>\n<p>Nachteile:<\/p>\n<ul>\n<li>Bisher eingeschr\u00e4nkter Funktionsumfang von Prefect Cloud<\/li>\n<li>Tauglichkeit f\u00fcr gro\u00dfe Projekte noch nicht unter Beweis gestellt<\/li>\n<li>Prefect Cloud in seinem vollen Funktionsumfang kostenpflichtig, Airflow hingegen komplett kostenlos<\/li>\n<\/ul>\n<p>Alles in allem macht Prefect einen sehr ordentlichen Eindruck und bringt die Voraussetzungen mit, Airflow von der Spitze der Workflow-Management-Tools zu verdr\u00e4ngen. Ob das tats\u00e4chlich passiert ist nat\u00fcrlich eine andere Frage. Eines kann aber mit hoher Wahrscheinlichkeit gesagt werden: Dadurch dass sich Prefect in einigen Punkten doch stark von Airflow abhebt, werden sich immer gen\u00fcgend Ans\u00e4tze finden, in denen Prefect den Data Engineers das Leben einfacher machen kann.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was nicht passt wird passend gemacht! Das dachten sich vermutlich die Entwickler:innen von Prefect, als die Idee f\u00fcr ihr Projekt entstand. Es will sich als eine Art Weiterentwicklung des Workflow-Management und Orchestrierungs-Tools Apache Airflow verstanden wissen. Ein Upgrade, das die Unzul\u00e4nglichkeiten von Airflow ausmerzt und dadurch besser auf die sich st\u00e4ndig erweiternden Anforderungen der Data [&hellip;]<\/p>\n","protected":false},"author":111,"featured_media":18183,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[71],"service":[414],"coauthors":[{"id":111,"display_name":"Hendrik Pauthner","user_nicename":"hpauthner"}],"class_list":["post-18103","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-cloud","service-cloud"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Prefect: Das zeitgem\u00e4\u00dfe Airflow? - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Prefect ist ein neues Workflow-Management-Tool das Airflow den Kampf angesagt hat und es mittelfristig von der Spitze verdr\u00e4ngen will. Mit einer leicht verst\u00e4ndlichen Einf\u00fchrung erfahrt ihr hier, ob das Projekt seinen Ambitionen gerecht werden kann.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Prefect: Das zeitgem\u00e4\u00dfe Airflow? - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Prefect ist ein neues Workflow-Management-Tool das Airflow den Kampf angesagt hat und es mittelfristig von der Spitze verdr\u00e4ngen will. Mit einer leicht verst\u00e4ndlichen Einf\u00fchrung erfahrt ihr hier, ob das Projekt seinen Ambitionen gerecht werden kann.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2020-02-10T14:21:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-11-22T09:19:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hendrik Pauthner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hendrik Pauthner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Hendrik Pauthner\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/\"},\"author\":{\"name\":\"Hendrik Pauthner\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/bda691532639bbb06f096196759a77f6\"},\"headline\":\"Prefect: Das zeitgem\u00e4\u00dfe Airflow?\",\"datePublished\":\"2020-02-10T14:21:43+00:00\",\"dateModified\":\"2022-11-22T09:19:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/\"},\"wordCount\":3070,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/02\\\/prefect-apache-airflow.png\",\"keywords\":[\"Cloud\"],\"articleSection\":[\"Analytics\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/\",\"name\":\"Prefect: Das zeitgem\u00e4\u00dfe Airflow? - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/02\\\/prefect-apache-airflow.png\",\"datePublished\":\"2020-02-10T14:21:43+00:00\",\"dateModified\":\"2022-11-22T09:19:58+00:00\",\"description\":\"Prefect ist ein neues Workflow-Management-Tool das Airflow den Kampf angesagt hat und es mittelfristig von der Spitze verdr\u00e4ngen will. Mit einer leicht verst\u00e4ndlichen Einf\u00fchrung erfahrt ihr hier, ob das Projekt seinen Ambitionen gerecht werden kann.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/02\\\/prefect-apache-airflow.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2020\\\/02\\\/prefect-apache-airflow.png\",\"width\":1920,\"height\":1080,\"caption\":\"Ein stilisierter Flow Chart mit dem Prefect Logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/prefect-das-zeitgemaesse-airflow\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Prefect: Das zeitgem\u00e4\u00dfe Airflow?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/bda691532639bbb06f096196759a77f6\",\"name\":\"Hendrik Pauthner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b829beaa1d97b2cf83d46b831e10b724d2928377ff7022b5556e384019613ce4?s=96&d=retro&r=ga1b5a7b2721294efb908e49fe6c1b123\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b829beaa1d97b2cf83d46b831e10b724d2928377ff7022b5556e384019613ce4?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b829beaa1d97b2cf83d46b831e10b724d2928377ff7022b5556e384019613ce4?s=96&d=retro&r=g\",\"caption\":\"Hendrik Pauthner\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/hpauthner\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Prefect: Das zeitgem\u00e4\u00dfe Airflow? - inovex GmbH","description":"Prefect ist ein neues Workflow-Management-Tool das Airflow den Kampf angesagt hat und es mittelfristig von der Spitze verdr\u00e4ngen will. Mit einer leicht verst\u00e4ndlichen Einf\u00fchrung erfahrt ihr hier, ob das Projekt seinen Ambitionen gerecht werden kann.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/","og_locale":"de_DE","og_type":"article","og_title":"Prefect: Das zeitgem\u00e4\u00dfe Airflow? - inovex GmbH","og_description":"Prefect ist ein neues Workflow-Management-Tool das Airflow den Kampf angesagt hat und es mittelfristig von der Spitze verdr\u00e4ngen will. Mit einer leicht verst\u00e4ndlichen Einf\u00fchrung erfahrt ihr hier, ob das Projekt seinen Ambitionen gerecht werden kann.","og_url":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2020-02-10T14:21:43+00:00","article_modified_time":"2022-11-22T09:19:58+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow.png","type":"image\/png"}],"author":"Hendrik Pauthner","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Hendrik Pauthner","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten","Written by":"Hendrik Pauthner"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/"},"author":{"name":"Hendrik Pauthner","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/bda691532639bbb06f096196759a77f6"},"headline":"Prefect: Das zeitgem\u00e4\u00dfe Airflow?","datePublished":"2020-02-10T14:21:43+00:00","dateModified":"2022-11-22T09:19:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/"},"wordCount":3070,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow.png","keywords":["Cloud"],"articleSection":["Analytics","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/","url":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/","name":"Prefect: Das zeitgem\u00e4\u00dfe Airflow? - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow.png","datePublished":"2020-02-10T14:21:43+00:00","dateModified":"2022-11-22T09:19:58+00:00","description":"Prefect ist ein neues Workflow-Management-Tool das Airflow den Kampf angesagt hat und es mittelfristig von der Spitze verdr\u00e4ngen will. Mit einer leicht verst\u00e4ndlichen Einf\u00fchrung erfahrt ihr hier, ob das Projekt seinen Ambitionen gerecht werden kann.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2020\/02\/prefect-apache-airflow.png","width":1920,"height":1080,"caption":"Ein stilisierter Flow Chart mit dem Prefect Logo"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/prefect-das-zeitgemaesse-airflow\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Prefect: Das zeitgem\u00e4\u00dfe Airflow?"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/bda691532639bbb06f096196759a77f6","name":"Hendrik Pauthner","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/b829beaa1d97b2cf83d46b831e10b724d2928377ff7022b5556e384019613ce4?s=96&d=retro&r=ga1b5a7b2721294efb908e49fe6c1b123","url":"https:\/\/secure.gravatar.com\/avatar\/b829beaa1d97b2cf83d46b831e10b724d2928377ff7022b5556e384019613ce4?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b829beaa1d97b2cf83d46b831e10b724d2928377ff7022b5556e384019613ce4?s=96&d=retro&r=g","caption":"Hendrik Pauthner"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/hpauthner\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/18103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/111"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=18103"}],"version-history":[{"count":4,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/18103\/revisions"}],"predecessor-version":[{"id":38896,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/18103\/revisions\/38896"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/18183"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=18103"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=18103"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=18103"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=18103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}