Az Apache Airflow egy robusztus és kiterjeszthető munkafolyamat-kezelő rendszer, amely lehetővé teszi a felhasználók számára, hogy hatékonyan automatizálják és nyomon kövessék az adatfeldolgozási munkafolyamataikat. Az Airflow alapértelmezett felhasználói felülete számos alapvető funkcióval rendelkezik, de gyakran előfordul, hogy egyedi, testreszabott megoldásokra van szükség a munkafolyamatok teljesítményének és egészségének figyelemmel kíséréséhez. Ebben a fejezetben azt fogjuk áttekinteni, hogyan hozhatunk létre egyedi Airflow UI plugineket, amelyek lehetővé teszik az egyedi mérőszámok és dashboardok megjelenítését a munkafolyamatok monitorozásához.
A saját Airflow UI plugin létrehozása különösen hasznos, ha valamilyen domain-specifikus mérőszámot, vizualizációt vagy figyelmeztető eszközt szeretnénk integrálni a rendszerbe. Az Airflow UI pluginek regisztrálása egy Python osztályban történik, amely az airflow.plugins_manager.AirflowPlugin interfészt örökli. Ezen kívül számos más testreszabási lehetőség is elérhető, például Flask alkalmazások, egyedi hook-ok, időzítők és egyéb funkciók, melyeket a fejlesztők az Airflow dokumentációjában részletesen megismerhetnek.
Airflow UI pluginek megértése
A pluginek lehetővé teszik az Airflow felhasználói felületének bővítését. Ezzel a fejlesztők egyedi nézeteket, funkciókat és vizualizációkat adhatnak a rendszerhez, amelyek megfelelnek a vállalati igényeknek. A plugin osztály regisztrálása az Airflow rendszeren belül lehetővé teszi a különböző elemek, például Flask blueprint-ek, alkalmazásbuilder nézetek és egyéb komponensek testreszabását.
A következő kódpélda bemutatja az AirflowPlugin osztály alapjait:
Ezen osztály segítségével különböző Airflow komponensek összekapcsolhatók, és a felhasználói felület funkcionalitása könnyen bővíthető. A Flask alkalmazások blueprints segítségével regisztrálhatók, amelyek az API útvonalakhoz rendelhetők, és lehetővé teszik a statikus fájlok és sablonok kezelését is.
Egyedi méretű dashboard plugin létrehozása
Ebben a részben egy egyszerű méretű mérőszám dashboardot készítünk, amely elérhető lesz az Airflow helyi környezetéből. A vizualizációkhoz a Chart.js könyvtárat fogjuk használni, amely egy könnyen használható JavaScript alapú diagramkészítő könyvtár. A könyvtár számos alapértelmezett diagramtípust kínál, amelyeket könnyen integrálhatunk saját alkalmazásunkba.
A következő lépésekben részletesen bemutatjuk a dashboard plugin létrehozását:
1. Projekt struktúra
Az Airflow pluginok az Airflow home könyvtárában található plugins mappában tárolódnak. Mivel a pluginek alapértelmezetten késleltetve töltődnek be, minden változtatást követően újra kell indítani az Airflow szolgáltatásokat. A pluginok szervezésére célszerű követni az alábbi struktúrát:
2. Dashboard.html sablon
A sablonok (templates) az Airflow webalkalmazás részét képezik, amely HTML fájlokat tartalmaz, és az adatokat dinamikusan jeleníti meg. A dashboard.html sablon tartalmazza a mérőszámok megjelenítésére szolgáló Chart.js-diagramokat és egyéb vizualizációkat.
3. Dashboard.py nézetek
A dashboard.py fájlban találhatók az Airflow-hoz szükséges egyedi nézetek, amelyeket a Flask alkalmazás segítségével regisztrálunk. Itt történik a logika implementálása, amely összekapcsolja a statikus tartalmat az adatbázisban tárolt adatokkal, és biztosítja, hogy a felhasználók interaktívan manipulálhassák a dashboardot.
Használati esettanulmányok
A testreszabott Airflow UI plugin-ek hasznosak lehetnek számos különböző üzleti igény kielégítésére. Például:
-
Metastore böngésző: Az Airflow UI plugin segítségével a felhasználók könnyedén megtekinthetik a Hive Metastore tábláinak részleteit, vagy logokat elemezhetnek.
-
Monitorozási integráció: Az Airflow rendszerébe beépített monitorozó eszközként használható, például a Datadog integrálásával, így a felhasználók egy helyen kezelhetik a DAG-ok monitorozását.
-
SLA státuszok vizualizálása: Egyedi plugin létrehozásával a DAG-ok SLA státuszait egyetlen dashboardon, vizuálisan jeleníthetjük meg.
További szempontok
Bár a fent bemutatott példák és megoldások hasznosak lehetnek, érdemes figyelembe venni, hogy a pluginek fejlesztése és karbantartása időigényes feladat lehet. Fontos, hogy a fejlesztők mindig frissítsék a plugineket az újabb Airflow verziók megjelenésekor, mivel az új verziók új funkciókat és javításokat hozhatnak, amelyek befolyásolhatják a pluginok működését. Az Airflow közösségi fórumain és dokumentációs oldalain érdemes követni a legújabb fejlesztéseket, hogy mindig naprakészen tudd, miként bővítheted tovább a rendszert.
Hogyan készíthetünk saját metrikák kezelőpanelt Flask és Airflow segítségével?
A következő lépésekben bemutatjuk, hogyan építhetünk egy egyszerű metrikák kezelőpanelt Flask alapú alkalmazással, amelyet az Airflow rendszeren belül használhatunk a DAG futások statisztikai adatainak megjelenítésére. A példa egy plugin modult használ, amely a backend kódot és a frontend HTML sablonokat integrálja, hogy a felhasználók valós időben hozzáférhessenek a fontos statisztikai mutatókhoz.
Első lépésként az __init__.py fájlban regisztráljuk a plugin modult és a Flask blueprint-et. A sablonok mappában találhatóak a kezelőpanel megjelenítéséhez szükséges frontend HTML kódok, míg a views/dashboard.py fájl tartalmazza a backend kódot, amely felelős a webes nézet kezeléséért.
Backend nézet implementálása
A backend kód implementálása a views/dashboard.py fájlban történik, ahol az Airflow adatbázisból lekérdezhetjük a szükséges statisztikai adatokat. Ehhez először beállítjuk azokat az importokat, amelyek szükségesek a dashboard nézethez:
A has_access_view dekorátor biztosítja, hogy a felhasználó rendelkezzen a szükséges jogosultságokkal a weboldal megtekintéséhez. A provide_session dekorátor biztosítja, hogy a route függvény a lekérdezésekhez szükséges adatbázis munkamenetet kapjon. A BaseView osztályt használjuk alapértelmezett nézetként a MetricsDashboardView osztály számára.
Ezután definiáljuk a MetricsDashboardView osztályt, amely meghatározza a weboldal útvonalát:
A fenti kódban a default_view meghatározza azt a funkciót, amelyet a Flask a fő útvonalhoz fog használni, ebben az esetben az index függvényt. Az index függvény felelős a szükséges lekérdezések végrehajtásáért, amelyek az Airflow adatbázisból az aktuális DAG futásokat és azok sikerességi statisztikáit nyerik ki.
A lekérdezés az összes aktív DAG futásait vonja be, és azokat három különböző időintervallumra (1 nap, 7 nap, 30 nap) aggregálja, hogy kiszámolja a sikeres és sikertelen futásokat. A lekérdezés eredményét egy dag_run_stats nevű szótárlistába mentjük el, amelyet a Flask sablon tovább használ majd.
Metrikai dashboard HTML sablon
Most, hogy a backend kód kész, létre kell hoznunk a HTML sablont a metrikák dashboardjának megjelenítéséhez a templates/dashboard.html fájlban. Az Airflow alapértelmezett sablonjaiban található Bootstrap CSS-t fogjuk használni, hogy a kezelőpanel reszponzív és felhasználóbarát legyen.
A fenti HTML sablonban a {{ title }} változó az oldal címét jeleníti meg, míg a két <canvas> elem a sikeres és sikertelen DAG futásokat fogja ábrázolni. Az elemeken JavaScript segítségével ábrázoljuk a statisztikai adatokat, amelyeket a backend által megadott dag_run_stats lista tartalmaz.
További szempontok
A bemutatott megoldás alapvető, de számos lehetőség van annak bővítésére. Például a dashboard grafikus megjelenítését dinamikusabbá tehetjük JavaScript könyvtárakkal, mint például a Chart.js, hogy még több vizuális elemet adjunk hozzá. Ezen kívül érdemes lenne a rendszer teljesítményét monitorozni, különösen akkor, ha több ezer DAG futást kell követnünk. Ezen kívül a felhasználói jogkörök finomhangolása is elengedhetetlen, hogy a metrikák ne csak az arra jogosultak számára legyenek elérhetőek.
Hogyan készíthetünk egyéni Airflow szolgáltatót?
Az Airflow szolgáltató egy olyan csomag, amely lehetővé teszi, hogy külső rendszerekkel kommunikáljunk és integráljuk őket az Airflow munkafolyamatainkba. Egy szolgáltató saját modulokat, operátorokat, horgokat és teszteket tartalmazhat, hogy a kívánt funkcionalitást biztosítsa. Az alábbiakban bemutatjuk, hogyan hozhatunk létre és oszthatunk meg egyéni szolgáltatót az Airflow környezetében.
A szolgáltatók elkészítése előtt fontos megérteni az alapvető struktúrát, amely biztosítja a szolgáltató megfelelő működését az Airflow-ban. Az alábbiakban bemutatott mappa- és fájlszerkezet egy általánosan elfogadott és javasolt struktúrát követ, amelyet érdemes alkalmazni a közösségi szabványoknak megfelelően.
A fő mappastruktúra az alábbi elemeket tartalmazhatja:
-
Hooks mappa: Az itt található fájlok felelősek a külső szolgáltatásokkal való kapcsolat létrehozásáért, azaz a különféle horgok implementálásáért.
-
Operators mappa: Ez tartalmazza azokat az operátorokat, amelyek az Airflow DAG-okban (Directed Acyclic Graphs) használhatók. Minden operátornak rendelkeznie kell egy
executemetódussal, amely felelős a végrehajtásért. -
Sensors mappa: A sensorok olyan speciális operátorok, amelyek valamilyen külső eseményt figyelnek, és amíg az esemény nem következik be, folyamatosan várakoznak.
-
Triggers mappa: Speciális elhalasztott operátorokhoz használt triggerek találhatóak itt.
-
Dev mappa: Fejlesztési környezetet biztosít, például Docker-fájlokat és
docker-compose.yaml-t tartalmaz, amelyek lehetővé teszik a szolgáltató helyi tesztelését és demonstrálását. -
Example DAGs mappa: Itt találhatók a példákként szolgáló DAG-ok, amelyek bemutatják a szolgáltató működését.
-
Tests mappa: Tesztelés céljából találhatók benne a különféle egység- és integrációs tesztek.
A szolgáltató csomagjaival kapcsolatos további fontos fájlok a következők:
-
setup.pyéssetup.cfg: Ezek tartalmazzák a csomag metaadatait és biztosítják, hogy a szolgáltató csomagja megfelelően telepíthető legyen. -
A
setup.cfgfájl segítségével a szolgáltató információit, mint például a név, leírás és verzió, az Airflow számára hozzáférhetővé tesszük, hogy a felhasználói felületen, parancssori eszközökön és API-n keresztül láthatóvá váljon.
Fontos megjegyezni, hogy bár technikailag a mappastruktúra és elnevezési konvenciók nem kötelezőek, az Airflow közössége már hosszú ideje ezt a struktúrát használja. Így a szolgáltatók készítésekor célszerű követni ezeket az irányelveket, hogy a többi Airflow felhasználó könnyebben megértse és használja a kódunkat.
A szolgáltató kódjának írásakor fontos figyelembe venni, hogy az Airflow Scheduler folyamatosan elemzi a DAG-okat, és ha egy __init__ metódusban harmadik fél API-jait hívunk meg, azok a kód betöltődésekor lefutnak. Emiatt fontos, hogy az inicializáló metódusok ne tartalmazzanak olyan hívásokat, amelyek csak futás közben adnak vissza érvényes értékeket. Ehelyett Jinja sablonokat és makrókat kell használni a konfigurációk kezelésére a DAG-okban.
A szolgáltató regisztrálása során elengedhetetlen, hogy a csomagunk tartalmazza a megfelelő metainformációkat. Az apache_airflow_provider specifikációval regisztrálhatjuk a szolgáltatót az Airflow rendszerében. Ehhez létre kell hoznunk egy get_provider_info nevű függvényt, amely visszaad egy szótárat a csomag nevéről, leírásáról és verziójáról. A csomag telepítésekor az Airflow felismeri ezt a bejegyzést, és megjeleníti a szolgáltatót a felhasználói felületen.
Az operátorok működéséhez elengedhetetlen, hogy helyesen implementáljuk az egyes interfészeket. A példánkban egy TeaPotHook horgot készítünk, amely lehetővé teszi az Airflow számára, hogy egyszerű HTTP kérdésekkel kommunikáljon a teapottal. A horgon keresztül leírt kapcsolat részletezése biztosítja, hogy a külső rendszerrel való interakció során megfelelő adatok kerüljenek feldolgozásra.
A hook kódja a következő elemeket tartalmazza:
-
conn_name_attr: A kapcsolati név attribútuma, amelyet az Airflow használ a kapcsolat azonosítására. -
get_connection_form_widgets: Ez a statikus metódus lehetővé teszi, hogy a kapcsolat adatainak megjelenítése az Airflow webes felületén történjen, ahol az egyes adatmezők testreszabhatók.
A megfelelő kapcsolati űrlapok és az Airflow webes felületének testreszabása segít a felhasználóknak a szolgáltató integrálásában, anélkül hogy bonyolult konfigurációval kellene szembenézniük.
Az Airflow szolgáltatók készítése nem csupán kódolásról szól. A tesztelés, dokumentáció és a közösségi szabványoknak való megfelelés elengedhetetlen a sikeres integrációhoz. Az alapos tesztelés biztosítja, hogy a szolgáltató megbízhatóan működjön, és az esetleges hibák gyorsan kiderüljenek.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский