MOC — dny 1 a 2
1. Představení Azure Databricks 2. Výběr a konfigurace compute 3. Objekty v Unity Catalogu 4. Zabezpečení Unity Catalogu 5. Governance Unity Catalogu 6. Datové modelování 7. Ingest dat
MOC — pokračování
8. Čištění a transformace dat 9. Data quality constraints · mimo osnovu 10. Datové pipelines 11. Lakeflow Jobs 12. Vývojový lifecycle · mimo osnovu 13. Monitoring a optimalizace
🏠 Rozcestník kurzu
Pod čarou — den 3
14. Průřez Microsoft Fabric 15. Power BI + Fabric + Databricks 16. Migrace z Oracle
🏠 Rozcestník kurzu
DP-750 · Kapitola 11

Lakeflow Jobs

Konfigurace jobů, triggery, plánování, alerty a automatické restarty
🗂 Automatizace

Cíle kapitoly

  • Vytvořit a nakonfigurovat Lakeflow Job s tasky, závislostmi a vhodným compute
  • Nastavit triggery jobu — scheduled, file arrival, table update a continuous
  • Naplánovat job pomocí cron výrazu a správně zvolit časovou zónu i chování souběžných běhů
  • Nakonfigurovat alerty a notifikace bez rizika alert fatigue
  • Nastavit retry policy a automatické restarty pro spolehlivý provoz
11.1

Anatomie Lakeflow Jobu: tasky, zdroje kódu, compute

Lakeflow Jobs je orchestrátor zabudovaný přímo v Azure Databricks. Job se skládá z jednoho nebo více tasků uspořádaných do DAG (Directed Acyclic Graph) — graf určuje pořadí a paralelismus. Minimální job potřebuje tři věci: task s logikou, compute, na kterém task poběží, a unikátní název.

Job vytvoříte v UI přes Jobs & Pipelines → Create → Job. Každý task má typ, který určuje, co se konfiguruje a kde to běží:

Typ taskuKlíčová konfiguraceCompute
Notebookcesta k notebooku, parametryserverless, classic jobs, all-purpose
Python script / wheelcesta, CLI argumenty / entry pointserverless, classic jobs, all-purpose
SQLquery nebo souborserverless / pro SQL warehouse
Pipelinevýběr existující pipelinepipeline compute
dbtdbt projekt, profilyserverless / classic jobs
JARmain class, parametryserverless, classic jobs
Spark Submitlegacy varianta JARupouze classic jobs compute
Run Jobodkaz na jiný jobdle odkazovaného jobu

Vedle toho existují řídicí tasky If/else a For each pro větvení a iteraci uvnitř jobu. Kód tasku může žít na třech místech: ve workspace (rychlý start, vývoj), v Git repozitáři (job si při spuštění vezme snapshot konkrétního commitu — všechny tasky jobu sdílejí stejnou Git referenci) nebo v volume/cloud storage (pro Python skripty přes abfss:// URI).

💡
Tip: Pro produkční joby používejte zdroj Git. Job pak běží proti definovanému commitu, ne proti tomu, co má zrovna někdo rozpracované ve workspace. „Funguje to u mě v notebooku" přestane být argument.

U compute je dnes výchozí volbou serverless compute — Databricks spravuje infrastrukturu, nic nekonfigurujete a škáluje se automaticky. Classic jobs compute si vyberete, když potřebujete kontrolu nad verzí Sparku, typem instancí nebo knihovnami, které serverless nepodporuje. Když více tasků sdílí stejný cluster, cluster žije, dokud neskončí všechny — ušetříte start-up čas mezi tasky, ale platíte i za případné prostoje.

⚠️
Pozor: Job běží s oprávněními run identity — vlastníka jobu, nebo nakonfigurovaného service principal — nikdy s oprávněními uživatele, který běh spustil. Pokud run identity nemá potřebná Unity Catalog oprávnění, job spadne za běhu na autorizační chybě, i když je konfigurace jinak validní.
SQL
-- opravneni pro service principal, pod kterym job pobezi
GRANT SELECT, MODIFY ON TABLE telconnect.silver.cdr_clean TO `sp-cdr-pipeline`;
GRANT USE SCHEMA ON SCHEMA telconnect.silver TO `sp-cdr-pipeline`;
Úrovně oprávnění k jobu▼

Oprávnění k jobu jsou nezávislá na oprávněních ke compute a mají čtyři úrovně: CAN VIEW (vidí konfiguraci a historii běhů), CAN MANAGE RUN (navíc spouští a ruší běhy), IS OWNER (výchozí identita pro Run as), CAN MANAGE (plná editace včetně schedulů a oprávnění). Každá úroveň zahrnuje práva těch pod sebou. Tvůrce jobu a admini mají automaticky CAN MANAGE. Praktický vzor: pipeline tým CAN MANAGE, operátoři CAN MANAGE RUN, stakeholdeři CAN VIEW.

11.2

Závislosti tasků a parametry jobu

Závislosti definujete u tasku polem Depends on — tím vzniká DAG. Ke každé hraně navíc patří podmínka Run if, která říká, kdy se downstream task vůbec spustí:

Run if podmínkaTask poběží, když…
All succeededvšechny upstream tasky uspěly (výchozí)
At least one succeededuspěl aspoň jeden upstream task
None failedžádný neselhal (některé mohly být přeskočeny)
All donevšechny doběhly — bez ohledu na výsledek
At least one failedaspoň jeden upstream task selhal
All failedselhaly všechny

Kdo čeká, že podmínky slouží jen na „happy path", přichází o nejužitečnější vzory: All done pro úklidové tasky, které musí běžet vždy, a At least one failed pro error-handling větev (zápis do incident tabulky, kompenzační logika).

Job „TelConnect CDR Pipeline" — DAG tasků ingest_cdrs Notebook · serverless clean_cdrs Notebook · serverless aggregate_usage SQL · warehouse detect_fraud Python · classic publish_gold Run if: All succeeded cleanup_tmp Run if: All done plná šipka = All succeeded · čárkovaná = All done (úklid běží i po selhání)
DAG jobu s paralelními tasky a Run if podmínkami — publikace vyžaduje úspěch obou větví, úklid běží vždy.

Job parametry definujete na úrovni jobu jako key-value páry a jsou automaticky dostupné všem taskům. Notebooky je čtou přes widgety, Python skripty je dostanou jako argumenty příkazové řádky. V hodnotách parametrů můžete používat dynamic value references — hodnoty doplněné až při spuštění:

PYTHON
# notebook cte job parametr pres widget
processing_date = dbutils.widgets.get("processing_date")

# hodnota parametru v konfiguraci jobu muze byt dynamicka:
#   {{job.trigger.time.iso_date}}                          -> datum spusteni
#   {{job.trigger.table_update.updated_tables}}            -> ktere tabulky se zmenily
#   {{job.trigger.table_update.<cat.sch.tbl>.version}}     -> verze Delta tabulky
ℹ️
Poznámka: Tagy (labely nebo key-value) pomáhají joby filtrovat podle týmu, projektu či prostředí a propagují se i na job clustery — hodí se pro cost attribution.
11.3

Triggery: scheduled, file arrival, table update, continuous

Trigger určuje, kdy job poběží. Vedle časového plánu (viz sekce 11.4) nabízí Lakeflow Jobs event-based triggery, které reagují na data, ne na hodiny. Trigger přidáte v Job details → Schedules & Triggers → Add trigger.

File arrival trigger hlídá cestu v Unity Catalog external location nebo volume (včetně podadresářů, rekurzivně) a spustí job, když se objeví nový soubor. Kontrola probíhá best-effort zhruba každou minutu. Přepsání existujícího souboru stejným jménem běh nevyvolá — dodávky souborů proto navrhujte s unikátními názvy.

Table update trigger sleduje jednu nebo více Unity Catalog tabulek (managed Delta/Iceberg, external Delta, streaming tables, materialized views i views nad nimi) a reaguje na inserty, updaty, merge i delete. U více tabulek volíte mezi Any table is updated (rychlá reakce) a All tables are updated (počká, až budou aktuální všechny zdroje).

Oba typy sdílejí dvě šikovné volby proti „trigger stormu": Minimum time between triggers (ochranná pauza po doběhnutí) a Wait after last change (odklad, který se resetuje s každou další změnou — dávkuje rychlé série updatů do jednoho běhu).

Continuous trigger drží job v nekonečné smyčce: jakmile běh skončí (i selháním), okamžitě startuje další. Hodí se pro near real-time zpracování; počítejte ale s průběžnou spotřebou compute.

⚠️
Pozor: Continuous joby na serverless compute podporují jen bounded streaming triggery typu Trigger.AvailableNow. Časové triggery ProcessingTime a Continuous na serverless nefungují — pro ně použijte classic jobs compute, případně Lakeflow Spark Declarative Pipelines v continuous režimu.
Který trigger zvolit? Externí systém dodává soubory nepravidelně? File arrival volume / external location ano Navazuje na upstream tabulky v Unity Catalogu? Table update any / all tables updated ano Near real-time, běh nesmí stát? Continuous běh za během, exponential backoff ano ne ne Scheduled interval nebo cron (11.4) jinak: fixní časový plán je nejjednodušší a nejlevnější na provoz
Rozhodovací strom pro volbu typu triggeru podle charakteru datového toku.
Limity file arrival triggerů a file events▼

Bez zapnutých file events na external location platí limit 50 jobů s file arrival triggerem na workspace a max. 10 000 souborů ve sledované lokaci. Se zapnutými file events (jednorázové nastavení, využívá cloud notifikace o změnách) tato omezení odpadají a i table update triggery fungují efektivněji. Přesné aktuální limity ověřte v dokumentaci.

Před vytvořením file arrival triggeru potřebujete workspace s Unity Catalogem, READ na storage lokaci a CAN MANAGE na jobu.

💡
Tip: Triggery lze kdykoli pozastavit (Pause) a obnovit bez ztráty konfigurace — praktické při maintenance oknech. Aktivní běh se nechá doběhnout, jen nestartují nové.
11.4

Plánování: cron, časové zóny, souběžné běhy

Scheduled trigger má dvě podoby. Simple schedule zadáte jako interval („každých 12 hodin") — první běh si scheduler zvolí sám při uložení. Advanced schedule používá cron výraz se šesti až sedmi poli: sekundy, minuty, hodiny, den v měsíci, měsíc, den v týdnu, volitelně rok. Minimální interval mezi běhy je 10 sekund.

Cron výrazVýznam
0 0 12 * * ?každý den v poledne
0 15 10 ? * MON-FRIpracovní dny v 10:15
0 0 8 1 * ?první den měsíce v 8:00
0 30 6 ? * 6Lposlední pátek měsíce v 6:30
0 0 */2 * * ?každé 2 hodiny
Speciální znaky v cron výrazech▼

* = všechny hodnoty · ? = „žádná konkrétní hodnota" (použijte v poli den-v-měsíci nebo den-v-týdnu, když specifikujete to druhé) · - = rozsah (10-12) · , = výčet (MON,WED,FRI) · / = krok (0/15 = každých 15 minut) · L = poslední (den měsíce, 6L = poslední pátek) · # = n-tý výskyt (6#3 = třetí pátek).

Časová zóna není detail. Zóny s letním časem (DST) způsobí, že hodinový job při přechodu jednou za rok přeskočí běh nebo se o hodinu posune. Pravidlo z praxe: reporty pro lidi plánujte v jejich lokální zóně (a přijměte DST posuny), technické pipeline vázané na UTC timestampy nebo přesné intervaly plánujte v UTC.

Co když běh trvá déle než interval? To řídí Maximum concurrent runs — pro joby zapisující do stejných tabulek jej nastavte na 1 — a chování při překročení limitu:

ChováníCo se stane s novým běhemKdy použít
Queuečeká ve frontě, spustí se po uvolnění slotužádný trigger se nesmí ztratit (výchozí volba pro pipeline)
Cancelokamžitě zrušenzastaralý trigger nemá hodnotu
Skipneproběhneobčasné vynechání běhu nevadí

Dokumentace k frontě: „Queued runs consume no compute resources while waiting." Fronta je tedy zadarmo — platí se až samotný běh.

ℹ️
Poznámka: Scheduler není low-latency systém — start jobu se může kvůli síti nebo cloudové službě opozdit o minuty. Neplánujte byznys logiku na sub-minutovou přesnost a mezi závislými pipeline nechte časový polštář.
11.5

Alerty a notifikace

Notifikace konfigurujete na úrovni jobu (Job notifications) i jednotlivých tasků. K dispozici je pět typů událostí:

UdálostKdy se pošleTypické použití
Startběh začalpotvrzení, že scheduled job odstartoval
Successběh úspěšně skončilsignál pro navazující procesy
Failureběh selhalincident response
Duration warningběh překročil práhdetekce degradace výkonu
Streaming backlogbacklog nad prahem po 10 minutzdraví streaming jobů

Cílem může být e-mail nebo system destination: Slack, Microsoft Teams, PagerDuty a generický HTTP webhook. System destinations musí nejdřív založit workspace admin v Admin Settings → Notifications; na job/task lze navěsit max. tři destinace na typ události.

JSON
{
  "event_type": "jobs.on_failure",
  "workspace_id": "your_workspace_id",
  "run": { "run_id": "run_id" },
  "job": { "job_id": "job_id", "name": "job_name" }
}
⚠️
Pozor: Stav Succeeded with failures (job doběhl, ale některé tasky selhaly) se počítá jako úspěch. Pokud potřebujete vidět i částečná selhání, přidejte task-level notifikace. A pozor: job-level notifikace se neposílají při selhání a retry jednotlivých tasků.

Největší nepřítel alertingu je alert fatigue — tým zavalený notifikacemi je přestane číst, včetně těch kritických. Osvědčené zásady: ztlumte notifikace pro skipnuté a zrušené běhy (Mute notifications for skipped/canceled runs — platí jen pro job-level, na taskách je nutné nastavit zvlášť), duration warning nastavujte podle historie běhů (job běžící typicky 30 minut varujte ve 45, ne v 35), a u tasků s retry zapněte Mute notifications until the last retry. A zdokumentujte, proč každý alert existuje a co má příjemce udělat.

💡
Tip: Pokud joby orchestruje Azure Data Factory, kombinujte vrstvy: Databricks notifikace pro job-level události, ADF alerty (Monitor → Alerts & metrics) pro metriky orchestrace — stav pipeline runs, počty aktivit, vytížení Integration Runtime.
📚 Do hloubky na Learn: Reduce notification noise · Monitor with HTTP webhooks (EN)
11.6

Automatické restarty a retry policy

Síťové výpadky a přechodné chyby cloudových služeb jsou v distribuovaných systémech normální provozní stav. Retry policy zajistí, že se job z takového selhání zotaví sám. Výchozí chování ale překvapí: většina jobů se bez explicitní konfigurace neretryuje. Výjimky jsou dvě — serverless joby mají ve výchozím stavu auto-optimalizované retry a continuous joby se restartují vždy, s exponential backoff algoritmem.

Retry nastavujete na úrovni tasku: počet pokusů a interval mezi nimi. Interval se počítá od startu selhaného běhu — při intervalu 60 s a tasku, který padl po 30 s, startuje retry 30 s po selhání. Timeout se přitom vztahuje na každý pokus zvlášť; vypršení timeoutu se počítá jako selhání a spotřebuje pokus.

Životní cyklus běhu jobu Trigger schedule · file arrival table update · manual continuous Concurrency check volno? → run plno? → queue / cancel / skip Run timeout na pokus Success notifikace „Success" Failure / Timed Out zbývá retry? Retry interval; muted notifikace Failure alert e-mail · Slack · PagerDuty ano ne, vyčerpáno nový pokus continuous job: po selhání startuje vždy znovu, s rostoucí čekací dobou (exponential backoff)
Životní cyklus běhu: od triggeru přes kontrolu souběžnosti a běh až po retry smyčku a finální alert.

U continuous jobů funguje exponential backoff takto: po překročení prahu po sobě jdoucích selhání job čeká, každé další selhání čekání prodlouží až do systémového maxima, a úspěšný běh (nebo běh bez selhání po prahovou dobu) sekvenci resetuje. Volbou Task retry mode (On failure / Never) řídíte, zda se selhané tasky zkusí znovu ještě uvnitř běhu. Klasické task-level retry politiky ani závislosti tasků continuous joby nepodporují.

Proti „zombie" taskům nasaďte Metric thresholds → Run duration: hodnota Warning pošle notifikaci, hodnota Timeout task ukončí se stavem Timed Out a předá ho retry logice.

⚠️
Pozor: Retry je bezpečné jen pro idempotentní operace. Job, který při opakovaném běhu duplikuje zápisy, retry politikou nespravíte — naopak. U non-idempotentních serverless jobů vypněte auto-optimalizaci retry.
💡
Tip: Rozumný standard: 1–3 retry s intervalem 30 s až 5 minut. Neomezené retry nikdy — trvalé selhání nevyřeší, jen spálí compute. A sledujte trend: rostoucí podíl běhů zachráněných přes retry bývá první signál infrastrukturního nebo datového problému.
✓
Shrnutí: Restarty řeší přechodné chyby, alerty ty trvalé. Kombinace: retry s mute do posledního pokusu + failure notifikace po vyčerpání pokusů + duration warning. Tak se dozvíte o problému právě jednou — a ve chvíli, kdy už má smysl vstávat.
11.7

Lab 11: Implement Lakeflow Jobs (45 minut)

V roli data engineera telekomunikační firmy TelConnect zautomatizujete pipeline zpracovávající Call Detail Records (CDR) přes bronze → silver → gold vrstvy: postavíte job se dvěma závislými tasky (notebook process_cdrs + SQL summarize_gold), dynamickým parametrem processing_date, file arrival triggerem nad volume, nočním cron schedulem, failure notifikacemi a retry politikou s timeoutem.

▶ Otevřít lab na GitHubu (EN) · Learn modul k tématu — s krátkými výukovými videy

ℹ️
Poznámka: na kurzu lab prochází lektor jako demo. Postup je krokový a samoobslužný — pokud se na něj v rámci dne nedostane, projdete si ho samostatně.
✓
Sebekontrola: 1) Jakou Run if podmínku nastavíte tasku, který má běžet jen po úspěchu všech předchůdců — a jakou úklidovému tasku? 2) Proč file arrival trigger nezareaguje na přepsání existujícího souboru a jak to ovlivní návrh dodávek dat? 3) Job běží každou hodinu a občas trvá 75 minut — jak zajistíte, že se běhy nepřekryjí a žádný se neztratí?