13. 6.

Přecházíme na pokročilý scheduler – Azkaban

Jak řešíte pravidelnou údržbu Vašeho *NIX systému? Používáte Cron? My donedávna také.

Proč jsme opustili Cron

S přibývajícími komponentami do naší Sklik elektrárny přibývají další odpovědnosti a úkoly.

Pravidelně je u nás potřeba vypočítat nové statistiky, vyúčtovat převody peněz v peněženkách, synchronizovat vybraná data napříč clustery, komprimovat staré databázové tabulky a další činnosti.

Časem je naplánovaných úloh pro Cron tolik, že se v tom dá jen těžko
vyznat. Nabízí se napsat vlastní řešení, které vše zpřehlední a
umožní např. sledovat historii všech běhů včetně logů na webovém
rozhraní s řízeným přístupem.

Proč si ale psát vlastní řešení, když už něco určitě existuje?

Co máme na výběr?

Při hledání něčeho, co spolehlivě nahradí služby Cronu a
zároveň přinese nějakou přidanou hodnotu (např. integrace Hadoopu) jsme našli několik možností:

Velmi se nám zalíbil Azkaban. Po jeho vyzkoušení jsme zjistili, že
naplňuje naše očekávání a vzhledem k tomu, že byl již pár let před jeho
otevřením vyvíjen společností LinkedIn,  šli jsme do toho na plné
obrátky.

Pokud vás nic z výše uvedeného neoslovilo, pak ještě existuje
možnost si napsat vlastní řešení s použitím velmi slibného a veřejně
opěvovaného Luigi python balíku.

Co čekat od Azkabanu?

Znáte to, ať už uděláte cokoliv, nikdy se všem nezavděčíte. Ačkoliv
má Azkaban svoje mouchy, stále je pro nás v porovnání s Cronem velmi
mocným nástrojem.

Co oceňujeme

  • řízený přístup do webového rozhraní
  • práva pro čtení, zapisování, spouštění a plánování jobů
    • ve spojení s LDAP skupinami lze snadno odlišit administrátory od
      vývojářů (těm jsme u nás na produkci dali práva jen číst a spouštět)
  • promyšlenou architekturu (flow/job)
    • k tomu se ještě vrátím
  • přehlednou historii spouštění
    • v detailu flow na vás vykoukne krásný graf, odkud se můžete proklikat na kterékoliv spuštění z minulosti a podívat se na logy
  • možnost jednorázově spustit job z webového rozhraní
    • toto využíváme pro nepřímý přístup vývojářů do produkce, kde můžou znova spustit job, který například selhal
    • dokonce je možné jednorázově změnit parametry příkazu, ale ne příkaz samotný
  • rozdělení na executor (worker) a web server (manager)
    • oba mohou běžet na různých strojích
  • nativní integraci Hadoopu
    • lze konfigurovat i webový HDFS explorer
  • existenci API (i když je celkem těžkopádné)

Co by se dalo vylepšit

  • velmi povrchní dokumentace (pro verzi menší a rovnu 3.0)
    • spoustu věcí si musíte vyzkoušet sami abyste zjistili, jak se Azkaban chová za určitých okolností
  • neintuitivní webové rozhraní
    • dá se snadno ztratit a zprvu je těžké cokoliv najít
  • složité vytváření jobů
    • všechny flows a jobs musejí splňovat předem definovanou adresářovou strukturu, kde flow představuje adresář a job soubor uvnitř něj
    • lepší by byla možnost definovat strukturu projektu např. pomocí yaml nebo json, čímž by se umožnilo vytváření flows přímo v rozhraní a byla by snazší obsluha API (nyní musíte adresářovou strukturu zazipovat a tu nahrát na rozhraní)
  • předávání secretů (tajných proměnných) tak, aby nešly vidět z rozhraní ani z API
  • přidat nativní podporu kontejnerů (třeba docker)
    • tím by minimálně odpadla nutnost spravovat a instalovat závislosti jobů na všech executorech, kde mají běžet

Jak fungují flow/job?

Flow je soubor jobů, které se mají vykonat v rámci jednoho běhu. Vždy obsahuje alespoň jeden job, ty ale mezi sebou mohou mít závislosti spouštění.

Namísto jednoho jobu se může použít vnořená flow, což efektivně umožňuje znovu použít už existující definici flow, ale s jinými parametry.

Když dojde na spouštění, můžete si vybrat, jestli chcete spustit celou flow, nebo jednotlivé joby (nebo všechny joby, co selhaly při jednom běhu). Jestli ale nechcete všechno pouštět ručně, můžete kterékoliv existující flow přiřadit schedule definovanou Quartz Cron syntaxí, čímž naplánujete pravidelný běh jedné flow.

Bohužel ale nelze plánovat jednotlivé joby. To se dá řešit tak, že se vytvoří nová flow určená výhradně pro konkrétní job. Jestli má ale tento job na něco navazovat, tak se tato nová flow vloží jako vnořená do jiné flow a je po problému.

Pár slov na závěr

Na rozrůstající se skripty v Cronu s přidanou hodnotou webového přehledu, co se kdy spustilo a jak to dopadlo, je Azkaban celkem fajn. Není to ale žádná klikací samospoušť. Něco stojí integrace LDAPu, něco prvotní nastavení vývojové workflow a chvíli je potřeba si zvykat na složitější nasazování do „lepšího Cronu”.

Za nás je ale Azkaban osvědčený nástroj, který nám zpřehlednil údržbu našeho systému a oproti Cronu přinesl spoustu nového.

Jiří Kozlovský

Programátor