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 10

Návrh a implementace datových pipelines

Pořadí operací, notebook vs. Lakeflow Pipelines, návrh jobů a error handling
🗂 Plnění dat do Unity Catalogu, ETL a Pipelines

Cíle kapitoly

  • Navrhnout pořadí operací pipeline od ingestu po servírování podle medallion architektury.
  • Rozhodnout mezi notebooky a Lakeflow Spark Declarative Pipelines podle povahy workloadu.
  • Navrhnout logiku Lakeflow jobu: závislosti tasků, podmínky, iterace a parametry.
  • Implementovat error handling: retry policies, idempotentní operace a karanténu (dead-letter).
  • Postavit pipeline z notebooků i deklarativně přes streaming tables a materialized views.
10.1

Návrh pořadí operací v pipeline

Datová pipeline není jeden skript, ale sekvence fází, kde každá staví na validovaném výstupu předchozí. Learn modul rozlišuje šest fází: ingest → clean & validate → transform → load → serve → monitor. První čtyři se přirozeně mapují na vrstvy medallion architektury, kterou znáte z předchozích kapitol — bronze uchovává surová data pro případné přepracování, silver čistí a validuje, gold agreguje pro spotřebu.

Zdroje soubory, DB, message queues ingest_bronze surová data 1:1, inkrementálně clean_silver dedup, NULL filtry, typy, validace quality_gate if/else task aggregate_gold joiny, agregace, metriky pro BI BRONZE SILVER GOLD quality_gate → nevyhovuje: notifikace + karanténa, gold se nespustí např. {{tasks.quality_check.values.invalid_count}} > 100 Monitor & optimize — doba běhu, objemy záznamů, trendy kvality, náklady (průběžně, nad všemi fázemi)
Medallion pipeline jako DAG tasků: ingest do bronze, čištění do silver, quality gate jako podmíněné větvení a agregace do gold; monitoring běží nad všemi fázemi.

Z návrhu pořadí operací plynou tři praktická pravidla. Za prvé: ingest zachovává surovou podobu — transformace při ingestu vám vezme možnost přehrát zpracování jinak. Za druhé: čištění patří před transformace — joiny a agregace nad nevalidními daty produkují nevalidní výsledky s mnohem horší dohledatelností. Za třetí: inkrementální zpracování od začátku — full reload je pohodlný na vývoj, ale drahý v provozu.

Fáze load a serve řeší, jak data dopravit ke konzumentům: volba mezi full refresh, inkrementálním appendem a merge patternem, partitioning cílových tabulek, optimalizované views a řízení přístupu. Poslední fáze — monitoring — není „až se to dodělá": metriky délky běhu, objemů a kvality patří do návrhu od prvního dne.

💡
Tip: při návrhu kreslete pipeline odzadu — od gold tabulky, kterou konzument potřebuje, zpět ke zdrojům. Vyhnete se „bronzovým jezerům", která nikdo nečte, a každý task v DAGu bude mít zdůvodnitelného odběratele.
📚 Do hloubky na Learn: Design order of operations for a pipeline (EN)
10.2

Volba: notebook, nebo deklarativní pipeline?

Azure Databricks nabízí dvě cesty, jak pipeline napsat. Notebooky jsou procedurální: krok za krokem říkáte, jak se má co spočítat, a máte plnou kontrolu nad každým detailem — error handlingem, cachováním, pořadím operací. Deklarativní pipelines to obracejí: popíšete co má vzniknout (tabulky a jejich definice) a framework sám odvodí závislosti, pořadí spouštění, checkpointy i retry logiku. Základní jednotkou deklarativní pipeline je flow — čte ze zdroje, transformuje a zapisuje do tabulky či sinku.

KritériumNotebookDeklarativní pipeline
Řízení běhuplná kontrola vývojářeorchestraci řídí systém
Standardní ETLupovídaný kódstručné deklarace
Kvalita datruční validacevestavěné expectations (viz kapitola 9)
Lineage a monitoringexterní nástrojeautomaticky součástí
Nároky na týmprogramátorské dovednostizvládnutelné i čistě v SQL
Typický scénářcustom logika, ML, exploraceprodukční, opakovatelné ETL
Potřebuje úloha procedurální logiku? větvení, smyčky přes API, custom retry, ML knihovny Notebook (+ Lakeflow Job) plná kontrola, vlastní error handling, explorace a prototypy po buňkách Opakovatelné ETL do produkce? kvalita, lineage, monitoring „zadarmo" Deklarativní pipeline streaming tables + materialized views, expectations, auto-orchestrace Hybrid notebooky pro preprocessing a ML, deklarativní pipeline pro jádro ETL ano ne ano jednorázové / smíšené
Rozhodovací strom: procedurální logika a explorace vedou k notebooku, opakovatelné produkční ETL k deklarativní pipeline; v praxi je běžný hybrid obou.
ℹ️
Poznámka: nejde o volbu „buď – anebo" na úrovni celé firmy. Běžný vzor je hybrid: deklarativní pipeline drží páteřní ETL (ingest, čištění, agregace) a notebooky obsluhují kroky, které se deklarativně vyjadřují špatně — volání externích API, ML skórování, jednorázové migrace. Oba typy pak spojí jeden Lakeflow Job.
📚 Do hloubky na Learn: Compare the approaches · Make your decision (EN)
10.3

Návrh logiky Lakeflow jobu

Lakeflow Job je orchestrátor: skládá tasky (notebooky, SQL, pipelines, skripty…) do DAGu — orientovaného acyklického grafu, který určuje pořadí spouštění i šíření chyb. Nezávislé tasky mohou běžet paralelně (rychlejší, ale náročnější na compute — workspace navíc limituje počet souběžných tasků), závislé sériově.

O tom, kdy se task spustí vzhledem k výsledkům předchůdců, rozhoduje Run if podmínka:

PodmínkaTask se spustí…
All succeededjen když všechny upstream tasky uspěly (výchozí)
At least one succeededkdyž uspěl aspoň jeden upstream task
None failedkdyž žádný neselhal (přeskočené nevadí)
All donepo doběhnutí všech, bez ohledu na výsledek — typicky cleanup
At least one failedkdyž aspoň jeden selhal — typicky notifikace o chybě
All failedjen když selhaly všechny

Vedle Run if podmínek existují dva speciální řídicí tasky. If/else condition task větví běh podle hodnot dat — např. výraz {{tasks.quality_check.values.invalid_count}} > 100 pošle běh do nápravné větve místo do gold agregace. For each task aplikuje stejnou logiku na každý prvek pole (seznam regionů, souborů, tabulek) bez kopírování definic tasků; souběžnost iterací je konfigurovatelná.

Parametry dělají job znovupoužitelným: v tascích na ně saháte přes {{job.parameters.<nazev>}}, k dispozici jsou i dynamické reference jako {{job.trigger.time.iso_date}} (čas plánovaného spuštění) a {{backfill.iso_datetime}} pro backfill běhy. Typické kategorie: datumové parametry (plánované běhy i backfill), prostředí (dev/staging/prod) a řízení chování (velikost dávky, formát výstupu).

Volba compute podle typu tasku▼

Learn modul doporučuje: notebooky a Python skripty → serverless jobs compute; SQL dotazy a soubory → serverless SQL warehouse; deklarativní pipelines → serverless pipeline compute; JAR → serverless nebo classic jobs compute; Spark Submit (legacy varianta JARu) → pouze classic jobs compute. Serverless odbourává správu clusterů, klasický compute dává detailní kontrolu konfigurace. Tasky mohou sdílet cluster (rychlejší start) nebo běžet izolovaně. Dostupnost serverless variant ve vašem regionu ověřte v dokumentaci.

💡
Tip: task jde v jobu dočasně zakázat (disable) — přeskočí se za běhu, ale konfigurace a historie zůstávají. Při ladění je to výrazně bezpečnější než task mazat a znovu vyklikávat.
10.4

Error handling v pipelines a jobech

Odpovědnost za chyby je rozdělená: platforma sama řeší infrastrukturní problémy (výpadky uzlů clusteru), na vás zbývají chyby datové a aplikační. Na úrovni jobu máte čtyři nástroje: retry policies (počet pokusů a interval; u continuous jobů se automaticky uplatňuje exponenciální backoff), timeouty (očekávaná a maximální doba běhu — brání nekonečně visícím taskům; u streamingu navíc thresholdy backlog metrik), notifikace (e-mail, Slack, Teams, PagerDuty, webhook) a podmíněné závislosti z předchozí sekce (větev „At least one failed" = notifikace a úklid).

Běh tasku idempotentní zápis Výsledek? ✓ Úspěch downstream tasky pokračují Přechodná chyba síť, timeout, throttling → retry + backoff Datová chyba nevalidní záznamy → karanténa (dead-letter) Notifikace e-mail, Teams, PagerDuty… mute až do posledního retry pokusu OK retry (max N pokusů, prodlužovaný interval) po vyčerpání Idempotence zaručuje, že opakovaný běh nevytvoří duplicity — retry je pak bezpečný
Smyčka error handlingu: přechodné chyby řeší retry s backoffem, datové chyby karanténa (dead-letter), vyčerpané pokusy končí notifikací; idempotence dělá opakování bezpečným.

V notebooku doplňujete granulární úroveň: try/except nad PySparkException umí rozlišit třídu chyby a reagovat cíleně, a vlastní retry funkce pokryje volání, na která job-level retry nedosáhne:

PYTHON
from pyspark.errors import PySparkException
import time

try:
    df = spark.read.table("source_data")
    df.filter("amount > 0").write.mode("append").saveAsTable("target_data")
except PySparkException as e:
    # getCondition() od PySpark 4.0; na starsich runtimech getErrorClass()
    if e.getCondition() == "TABLE_OR_VIEW_NOT_FOUND":
        print(f"Source table not found: {e.getMessageParameters()['relationName']}")
    else:
        raise

# vlastni retry s exponencialnim backoffem
def run_with_retry(operation, max_retries=3, base_delay=10):
    for attempt in range(max_retries + 1):
        try:
            return operation()
        except Exception as e:
            if attempt == max_retries:
                raise
            delay = base_delay * (2 ** attempt)
            time.sleep(delay)

Klíčový koncept, bez kterého je každý retry nebezpečný, je idempotence: opakované spuštění téhož kroku nesmí vyrobit duplicitní data. Prakticky toho dosáhnete přes MERGE místo slepého INSERT, přes streaming checkpointy (exactly-once), nebo přes „delete & insert" partiotion patternu. Pro nevalidní záznamy, které nemá smysl opakovat, slouží dead-letter / karanténní tabulka — stejný pattern, jaký jsme v kapitole 9 stavěli pro typové chyby.

⚠️
Pozor: u task notifikací zapněte „Mute notifications until the last retry". Jinak vám tři retry pokusy vygenerují tři poplachy, tým si na ně zvykne — a čtvrtý, skutečný, už nikdo neřeší. Alert fatigue je reálné provozní riziko.
💡
Tip: dokumentace doporučuje „fail fast" u narušené integrity dat a záměrné testování chyb během vývoje — schválně podstrčte pipeline rozbitý soubor a ověřte, že retry, karanténa i notifikace opravdu fungují. Error handling, který nikdy neběžel, není error handling.
10.5

Pipeline z notebooků

Nejpřímější cesta k pipeline: každou fázi napíšete jako notebook a v Jobs & Pipelines je poskládáte do jobu. Task typu Notebook dostane cestu k notebooku, compute a parametry; závislosti nastavíte polem Depends on — a DAG se vykreslí sám. Typický výsledek je přesně trojice z labu: ingest_bronze → clean_silver → aggregate_gold.

Aby byly notebooky znovupoužitelné, parametrizujte je přes widgety a výsledky předávejte navazujícím taskům přes task values:

PYTHON
# precteni parametru predaneho z jobu
processing_date = dbutils.widgets.get("processing_date")
environment = dbutils.widgets.get("environment")

# predani hodnoty navazujicim taskum (napr. pro quality gate)
dbutils.jobs.taskValues.set(key="invalid_count", value=invalid_count)

# signalizace vysledku do jobu
try:
    records = process_data()
    dbutils.notebook.exit(f"SUCCESS: Processed {records} records")
except Exception as e:
    dbutils.notebook.exit(f"FAILED: {str(e)}")
ℹ️
Poznámka: notebook má limit výstupu — 20 MB celkem, 8 MB na buňku. Produkční notebooky by měly logovat metriky (počty záznamů, časy), ne vypisovat data. Na display(df) v produkčním jobu zapomeňte.
💡
Tip: závislosti definujte jen tam, kde skutečně jsou. Každá zbytečná hrana v DAGu zabíjí paralelismus — pokud dvě silver tabulky na sobě nezávisí, nechte je běžet vedle sebe.
10.6

Deklarativní pipelines: orchestrace a inkrementální zpracování

Deklarativní přístup obrací perspektivu: místo orchestrace, checkpointů a závislostí deklarujete tabulky a framework se postará o zbytek. Tři hlavní přínosy: automatická orchestrace (systém odvodí pořadí z závislostí mezi tabulkami), inkrementální zpracování (streaming tables zpracují každý záznam právě jednou, materialized views přepočítávají jen změny) a vestavěné retry na úrovni Spark tasku, flow i pipeline.

Stavební kameny jsou dva. Streaming table je Delta tabulka pro append-only ingest — ideální pro čtení z cloud storage (přes Auto Loader) nebo message queues. Materialized view obsluhuje transformace — joiny, agregace — a zůstává synchronizovaná se změnami upstream tabulek.

SQL
-- streaming table: inkrementalni ingest z volume
CREATE OR REFRESH STREAMING TABLE customers_bronze
AS SELECT * FROM STREAM read_files(
  "/Volumes/main/raw_data/customers",
  format => "json"
);

-- materialized view: join synchronizovany s upstream zmenami
CREATE OR REFRESH MATERIALIZED VIEW customer_transactions
AS SELECT c.customer_id, c.customer_name, c.region,
          t.transaction_date, t.amount
FROM customers c
INNER JOIN transactions t ON c.customer_id = t.customer_id;
PYTHON
from pyspark import pipelines as dp

@dp.table
def customers_bronze():
    return (spark.readStream.format("cloudFiles")
        .option("cloudFiles.format", "json")
        .option("cloudFiles.inferColumnTypes", "true")
        .load("/Volumes/main/raw_data/customers"))

@dp.materialized_view
def regional_sales():
    customers = spark.read.table("customers")
    transactions = spark.read.table("transactions")
    return (customers.join(transactions, on="customer_id", how="inner")
        .groupBy("region").agg({"amount": "sum"}))

Kvalitu dat v deklarativní pipeline hlídají expectations — kompletně rozebrané v kapitole 9 (sekce 9.5): EXPECT jen eviduje, ON VIOLATION DROP ROW filtruje, ON VIOLATION FAIL UPDATE zastaví flow. Vývoj podporuje Lakeflow Pipelines Editor s validací přes dry run, selektivním spouštěním, vizualizací závislostí a náhledem dat; rozsah funkcí editoru se vyvíjí, aktuální stav ověřte v dokumentaci.

Častý omyl: „materialized view = obyčejné view"▼

Kdo čeká chování klasického view (dotaz vyhodnocovaný při každém čtení), bude překvapen: materialized view v Lakeflow je předpočítaná tabulka, kterou pipeline udržuje aktuální vůči upstream změnám — kde to jde, inkrementálně. Čtení je proto rychlé i nad velkými joiny; cenou je, že data jsou tak čerstvá, jak čerstvý je poslední běh/refresh pipeline.

✓
Shrnutí: pořadí operací určuje medallion (ingest → clean → transform → load → serve → monitor). Notebooky volte pro procedurální logiku, deklarativní pipelines pro opakovatelné ETL — a klidně oboje v jednom Lakeflow Jobu. DAG s Run if podmínkami, parametry, retry, idempotencí a karanténou dělá z pipeline produkční systém, ne skript spouštěný s modlitbou.
10.7

Lab 10: Design and implement data pipelines with Azure Databricks (45 minut)

Pro hotelovou platformu GlobStay (pět hotelů, noční dávky rezervací z property management systémů) postavíte medallion pipeline Bronze → Silver → Gold: parametrizované notebooky s deduplikací, NULL filtry a validací dat, pak orchestraci v Lakeflow Jobu — retry policies, quality gate s podmíněným větvením a notifikace při selhání.

▶ 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) Kterou Run if podmínku použijete pro task, který má poslat notifikaci jen při selhání některého upstream tasku? 2) Proč musí být task s retry policy idempotentní a jak toho u zápisu do Delta tabulky dosáhnete? 3) Kdy sáhnete po notebooku a kdy po Lakeflow Declarative Pipeline — a jak oba přístupy zkombinujete v jednom jobu?