Apache Airflow je mocný nástroj pro správu pracovních toků, který umožňuje plánovat a monitorovat úkoly na základě definovaných DAG (Directed Acyclic Graphs). Pro vykonání těchto úkolů ve frontě však existuje více možností, jakým způsobem budou úkoly prováděny, a to v závislosti na specifických obchodních cílech a požadavcích. Apache Airflow je možné nainstalovat a spustit několika způsoby, jako na místním stroji, na jednom stroji nebo na distribuované síti více strojů. Každý z těchto přístupů přináší jiné výhody a úrovně složitosti a vyžaduje odlišného exekutora.

Exekutory v Apache Airflow určují, jakým způsobem budou úkoly vykonávány v prostředí Airflow. Jsou modulární, což umožňuje týmům měnit exekutory podle konkrétních obchodních cílů a potřeb. Každé prostředí Airflow může mít nastaven pouze jeden exekutor v daném okamžiku, který je definován v konfiguračním souboru. Mezi nejběžnější exekutory patří SequentialExecutor, LocalExecutor, CeleryExecutor, CeleryKubernetesExecutor, DaskExecutor a KubernetesExecutor. Všechny mají své specifické použití, výhody a nevýhody, které se liší v závislosti na složitosti a požadavcích na škálovatelnost.

SequentialExecutor a LocalExecutor: Jednoduchost vs. paralelismus

Pokud jste se řídili návodem pro instalaci Apache Airflow a neprovedli žádné změny v konfiguraci, výchozím exekutorem bude SequentialExecutor. Tento exekutor je vhodný pro jednoduché scénáře, kde je úkoly třeba vykonávat postupně, jeden po druhém. V takovém případě není potřeba žádná složitá infrastruktura, a to je výhodné zejména pro testovací prostředí nebo malé vývojové projekty. U tohoto exekutora však existuje jedno omezení – může zpracovávat pouze jeden úkol současně, což může výrazně zpomalit výkon při větší zátěži.

Pro vyšší výkonnost je tu LocalExecutor, který přidává paralelismus a umožňuje spouštění více úkolů současně. Tento exekutor je ideální pro prostředí, kde je třeba provádět více úkolů ve stejnou dobu, ale bez potřeby distribuovaných systémů nebo složitého nastavení. LocalExecutor používá Pythonovu knihovnu pro paralelní zpracování a umožňuje tak efektivnější využívání prostředků počítače, na kterém je Airflow spuštěn. V konfiguraci je potřeba změnit volbu exekutora na LocalExecutor, což je jednoduché a nenáročné na údržbu.

Vhodné případy pro použití LocalExecutor

Tento exekutor je ideální pro:

  • Vývojové prostředí: Pro jednoduchost a nízké nároky je LocalExecutor často používán v testovacím prostředí, kde vývojáři mohou snadno spouštět DAGy a úkoly bez složitého nastavování infrastruktury.

  • Malé až střední pracovní zátěže: Pokud váš systém nevyžaduje vysoký paralelismus (například méně než pět současně běžících úkolů), může být LocalExecutor dostatečný pro produkční nasazení, a to i bez potřeby silné škálovatelnosti.

Mezi výhody LocalExecutor patří:

  • Paralelismus: Tento exekutor umožňuje spouštění více úkolů současně, čímž výrazně zrychluje celý proces vykonávání DAGů.

  • Jednoduchost: Na rozdíl od jiných exekutorů, které vyžadují složitější infrastrukturu (například Celery nebo Kubernetes), LocalExecutor je jednoduchý na konfiguraci a údržbu.

  • Lokalizace úkolů: Pokud není potřeba distribuovat úkoly napříč více uzly nebo kontejnery, LocalExecutor umožňuje efektivní využití prostředků jednoho stroje bez zbytečného přetížení sítě.

  • Nízká režie: Absence externích systémů pro odesílání úkolů vede k nižší síťové latenci a jednoduchému monitorování.

Limitace LocalExecutor

I když LocalExecutor přináší mnoho výhod, je omezený svou schopností provádět pouze určitou úroveň paralelismu. Pokud vaše pracovní toky vyžadují větší paralelismus nebo potřebu škálování na více strojích, budete muset zvážit použití složitějších exekutorů, jako je například CeleryExecutor nebo KubernetesExecutor.

Paralelismus a jeho síla v Apache Airflow

Paralelismus je klíčovým faktorem pro efektivní vykonávání úkolů v Airflow. Když používáme LocalExecutor, který umožňuje spouštět úkoly paralelně, můžeme výrazně zrychlit celý proces ve srovnání s SequentialExecutor, který vykonává úkoly jeden po druhém. To je důležité zejména pro dlouhotrvající úkoly, které by v případě sekvenčního zpracování trvaly dlouho. U LocalExecutor lze nastavovat maximální úroveň paralelismu, což umožňuje přizpůsobit exekutor výkonu vašeho stroje.

Pro ilustraci si představme situaci, kdy máme tři nezávislé úkoly, které by SequentialExecutor zpracovával jeden po druhém. Každý úkol by vyžadoval několik cyklů pro dokončení. Naopak, LocalExecutor umožňuje provádět tyto úkoly současně, čímž výrazně zkracuje dobu potřebnou pro zpracování celého pracovního toku.

Pokud váš systém začne vyžadovat více úkolů, je třeba přemýšlet o přechodu na jiný typ exekutora, který bude mít vyšší kapacitu pro paralelní zpracování a distribuovanou výpočetní zátěž.

Jak implementovat strojové učení v rámci pracovního toku s použitím Airflow a Kubernetes

V této fázi procesu se zaměřujeme na přípravu dat, která jsou nezbytná pro modely strojového učení. Tento krok zahrnuje několik zásadních fází, jako je zpracování dat z CSV souborů, jejich uložení do objektového úložiště a následné zajištění, že data budou dostupná pro další fáze pracovního toku. Vytváření a správa datových rámců, které budou obsahovat vektorové reprezentace uživatelů a filmů, je klíčovou součástí tohoto procesu.

Prvním krokem je stažení souborů obsahujících hodnocení a informace o filmech. Tyto soubory jsou uloženy na S3 bucketu, odkud jsou načteny pomocí funkce xcom_pull a následně zpracovány. Tento krok zahrnuje i kontrolu integrity a správnosti dat před jejich použitím v dalších částech pipeline. Je důležité, aby byl tento proces co nejvíce oddělen od kódu, který souvisí přímo s Airflow, což umožňuje rychlé testování a ladění.

Po stažení dat přichází fáze jejich zpracování. CSV soubory jsou převedeny na datové rámce, které obsahují vektorové reprezentace, jež se následně ukládají do databáze. Tento krok není vždy jednoduchý, protože vyžaduje nejenom technické zpracování dat, ale i zajištění, že při případných chybách budou data správně znovu načtena a zpracována. Použití systémů jako XCom v Airflow pro přenos metadat a klíčů mezi různými úkoly je nezbytné pro správnou koordinaci a sledování dat.

Pokud jde o fázi, kdy je třeba vytvořit a uložit vektorové reprezentace pro model kolaborativního filtrování, je možné, že budete muset použít pokročilou databázi, která umožňuje dotazování na podobnosti mezi vektory. Tento proces zahrnuje i přípravu databáze, která bude schopná rychle a efektivně provádět tyto dotazy. V tomto případě se používá PostgreSQL s rozšířením pro vektory, což umožňuje rychlé vyhledávání podobných položek.

Ve fázi trénování modelu, která je klíčová pro strojové učení, se výpočetní nároky mohou výrazně zvýšit. To si vyžaduje použití Kubernetes, který umožňuje flexibilní rozdělení výpočtového zatížení mezi různé uzly. Tento přístup zajišťuje, že výpočty budou prováděny efektivně a v souladu s dostupnou výpočetní kapacitou. Pro tento účel je výhodné použít KubernetesPodOperator, který umožňuje spuštění trénovacího procesu na specifickém uzlu v Kubernetes klastru. Tento přístup nejenom zlepšuje výkon, ale i usnadňuje správu a škálování výpočtů.

Celý proces lze automatizovat pomocí Airflow, což poskytuje robustní rámec pro orchestraci úkolů, které jsou nezbytné pro úspěšné dokončení trénování modelu. Airflow umožňuje snadno definovat a spravovat pracovní toky, monitorovat jejich průběh a zajistit, že každý úkol bude proveden ve správném pořadí. To vše je navrženo tak, aby bylo možné snadno přidávat nové úkoly, testovat jednotlivé části pracovního toku a upravovat procesy podle potřeby.

Důležité je i sledování metadat a informací o modelu, který je trénován. Jakmile je model natrénován, je uložení výsledků a metadat o modelu do objektového úložiště nezbytné pro jeho budoucí využití. K tomu slouží XCom, který umožňuje přenos těchto dat mezi různými částmi pracovního toku a také jejich zpětné předání zpět do Airflow pro další zpracování.

Kromě samotného kódu a implementace je důležité také pochopit, jak správně navrhnout celou infrastrukturu a jak efektivně využívat dostupné nástroje pro orchestraci a výpočetní zdroje. Správná volba databází, rozšíření a nástrojů pro orchestraci, jako je Kubernetes, má zásadní vliv na výkon a efektivitu celého systému. Také je nezbytné zaměřit se na testování a validaci jednotlivých částí pracovního toku, aby bylo zajištěno, že všechny komponenty fungují správně a efektivně spolupracují.