Come utilizzare le pipeline Lakeflow

Questa pagina spiega come utilizzare le pipeline Lakeflow durante tutta la vita di una pipeline dati, dalle prime decisioni di progettazione fino all'esecuzione su larga scala, e i compromessi dietro ogni fase. Ogni sezione collega agli articoli che ti mostrano come funzionare.

Questa guida presuppone familiarità con i concetti fondamentali dell'ingegneria dei dati. Se sei nuovo alle pipeline, inizia con Apache Spark Declarative Pipelines per capire cos'è il prodotto e il modello dichiarativo che lo supporta, poi segui il Tutorial: Costruisci una pipeline ETL usando la cattura dei dati di cambiamento.

Panoramica del ciclo di vita della pipeline

Una pipeline attraversa sei fasi:

  1. Pianifica e progetta: Decidi cosa stai costruendo e scegli gli strumenti, il linguaggio e i calcoli che si adattano.
  2. Ingerire dati: Portare i dati sorgente nella pipeline in modo affidabile e incrementale.
  3. Trasforma e modella: pulire, validare, unire e modellare i dati in tabelle di cui i consumatori possano fidarsi.
  4. Operativizzare: mettere la pipeline sotto controllo versione, testarla, programmarla e promuoverla tra gli ambienti.
  5. Esegui in produzione: monitora, invia avvisi, esegui il debug, esegui il backfill, metti in sicurezza e traccia la provenienza dei dati mentre la pipeline viene eseguita senza supervisione.
  6. Maturare e scalare: Confermare la prontezza alla produzione e mantenere la pipeline sana man mano che il volume e la dimensione del team aumentano.

Le fasi non sono strettamente sequenziali, ma si mappano all'ordine in cui emergono le domande. Poiché le pipeline Lakeflow gestiscono orchestrazione, checkpointing, tentativi e elaborazione incrementale, il tuo lavoro in ogni fase è principalmente una decisione di progettazione piuttosto che un'implementazione.

Pianificare e progettare

Le tue prime decisioni influenzano tutto a valle. Per come il modello dichiarativo si confronta con la scrittura di passaggi procedurali da solo, vedi Procedural vs. declarative data processing in Azure Databricks.

Alcune scelte determinano la configurazione iniziale:

  • Un dataset autonomo o una pipeline. Una singola visualizzazione materializzata o tabella di streaming può essere definita in SQL come dataset autonomo, e Azure Databricks gestisce la pipeline di aggiornamento dietro di essa. Crea e gestisci una pipeline Lakeflow come un'unica unità quando hai bisogno della creazione in Python, di destinazioni o di un'orchestrazione a più fasi. Vedi Oleodotti autonomi vs. Oleodotti Lakeflow.
  • SQL o Python (o entrambi). SQL è adatto a trasformazioni che sono per lo più filtri, join e aggregazioni. Python si adatta a logiche personalizzate, librerie esterne o alla generazione di molte tabelle simili in modo programmativo. La scelta viene effettuata per singolo file, anziché a livello dell’intera pipeline, quindi puoi combinare entrambe le opzioni e non devi decidere tutto in anticipo.
  • Serverless o elaborazione classica. Il serverless è il valore predefinito raccomandato e rimuove la configurazione del cluster. Scegli classic quando hai bisogno di tipi di istanze specifici, policy di cluster personalizzate o uno script init. Vedi Configura una pipeline serverless e Configura il calcolo classico per le pipeline.
  • Esecuzione attivata o continua. Avvio attivato, dato che consuma solo calcolo mentre è in esecuzione. La modalità continua mantiene il calcolo in esecuzione per elaborare nuovi dati con ritardo minimo, che di solito è il fattore di costo più grande, quindi riservalo a un requisito di latenza comprovato. Consultare Triggered vs. continuous pipeline mode (Modalità pipeline attivata e continua).

Una pipeline deduce il suo grafo di esecuzione dai dataset a cui il tuo codice fa riferimento, quindi il lavoro di progettazione consiste principalmente nel denominare e sequenziare i dataset. La decisione principale è quale tipo assegnare a ciascun output: una tabella di streaming per dati incrementali caratterizzati da frequenti aggiunte, oppure una vista materializzata per aggregazioni e join ricalcolati. Questa scelta incide sui costi e sulla correttezza, perché l'elaborazione incrementale scala con il ritmo di arrivo dei nuovi dati, mentre un ricalcolo completo scala sull'intera cronologia dei dati. Per sapere quale tipo è adatto a quale attività, vedi Cosa sono le pipeline?

Poiché il codice della pipeline è Python e SQL ordinario, puoi scriverlo, usarlo e validarlo nel tuo editor prima di distribuirlo in uno spazio di lavoro condiviso.

In questa fase

Domande da considerare durante questa fase:

Inserire dati

La questione progettuale centrale è se una sorgente sia solo aggiuntiva o venga modificata in loco. Questo determina come modellare l'obiettivo:

  • Sorgenti di sola aggiunta, come file archiviati nel cloud storage o eventi su un bus di messaggi, confluiscono in una tabella di streaming, che registra il proprio avanzamento tramite checkpoint, in modo che un riavvio non rielabori né perda dati. Auto Loader gestisce i file, scoprendone di nuovi e deducendo ed evolvendo gli schemi man mano che arrivano. Message bus come Apache Kafka, Hub eventi di Azure, Amazon Kinesis e Google Pub/Sub vengono letti direttamente in una tabella di streaming. Elimina i duplicati a valle, poiché un bus può recapitare lo stesso evento più di una volta. Per informazioni specifiche su Hub eventi di Azure, vedere Usare Hub eventi di Azure come origine dati della pipeline.
  • Le fonti che aggiornano ed eliminano righe, come la maggior parte dei database e molti sistemi SaaS (software as a service), utilizzano la rilevazione dei dati di cambiamento (CDC). Una copia completa a ogni esecuzione è uno spreco e diventa sempre più lenta man mano che l’origine cresce, quindi il CDC legge solo le righe che sono cambiate dall’ultima esecuzione. L'API AUTO CDC applica tali modifiche senza logica di fusione scritta a mano; vedi Le API AUTO CDC: Semplifica la raccolta dei dati delle modifiche con pipeline. Un flusso applica il CDC a una tabella in streaming e diversi flussi possono alimentare una sola tabella: è così che più sorgenti confluiscono in un'unica destinazione.

I checkpoint e i nuovi tentativi sono automatici, quindi una pipeline viene ripresa dall'ultimo offset elaborato invece di rielaborare tutto. Due misure di protezione sono facoltative:

  • Una colonna di dati salvati cattura record che non corrispondono allo schema previsto.
  • Le aspettative applicano l'azione a livello di riga che definisci.

Se un checkpoint in streaming diventa invalido, preferisci il recupero più economico che preserva i dati delle tabelle.

In questa fase

Domande da considerare durante questa fase:

Trasformazione e modello

La trasformazione trasforma i dati assorbiti in tabelle pulite di cui persone e strumenti possono fidarsi. È qui che il motivo del medaglione (bronzo-argento-oro) assume la forma concreta.

La pulizia e la conferma vengono prima di tutto. Le aspettative sono una caratteristica integrata della pipeline Lakeflow: vincoli di qualità dei dati che la pipeline valuta su ogni riga di ogni esecuzione, riportando il conteggio dei passaggi e dei fallimenti, così la qualità è continua e non una porta monouso. Decidi cosa succede quando una riga fallisce (avvisa e mantienila, lasciala perdere o fallire l'aggiornamento) e dove appartiene il gate. Le porte di solito si trovano al confine tra bronzo e argento, quindi tutto ciò che c'è a valle può essere affidabile senza dover ricontrollare.

L'unione e l'aggregazione definiscono la fase di passaggio da silver a gold. Una vista materializzata si adatta a una join o aggregazione in batch su tabelle esistenti, perché mantiene i risultati coerenti con le sue fonti: si aggiorna incrementalmente quando la query e le fonti lo permettono e altrimenti ricalcola integralmente, ottenendo lo stesso risultato in entrambi i modi. Questo la rende la scelta giusta quando la correttezza conta più della latenza, poiché ricalcola le join quando una dimensione cambia. Vedi Come si aggiornano le pipeline?. L'unione di flussi di dati in tempo reale genera uno stato potenzialmente illimitato, quindi le join e le aggregazioni sui flussi richiedono una watermark per limitare il tempo per cui la pipeline attende i dati che arrivano in ritardo.

Due idee di correttezza attraversano questa fase:

  • Idempotenza significa che una pipeline produce lo stesso risultato quante volte giri sullo stesso input. Le pipeline Lakeflow sono idempotenti per le parti che gestiscono, come le letture con checkpoint e gli upsert basati su AUTO CDC chiavi; mantieni idempotente la tua logica evitando funzioni non deterministiche nelle viste ricalcolate.
  • Elaborazione almeno una volta rispetto a elaborazione esattamente una volta. Le tabelle Delta-to-Delta gestite registrano insieme, per ogni micro-batch, gli input e gli output, garantendo per impostazione predefinita la semantica exactly-once. Questo vale solo fino ai confini, ad esempio con un sink personalizzato, un target non Delta o una source personalizzata non verificata, casi in cui devi trattare la scrittura come at-least-once e renderla idempotente, ad esempio eseguendo un upsert su una chiave.

Anche le dimensioni a variazione lenta (SCD) sono supportate qui: AUTO CDC implementa direttamente le SCD di tipo 1 e di tipo 2, quindi è sufficiente impostare un tipo invece di scrivere la logica di tracciamento dello storico.

In questa fase

Domande da considerare durante questa fase:

Operatività

L'operativizzazione trasforma una pipeline da qualcosa che gira per te a qualcosa che il team può costruire, testare e distribuire ripetutamente. Una pipeline è codice sorgente più configurazione, quindi si applicano le pratiche ordinarie di ingegneria del software.

Il testing copre due cose contemporaneamente: la logica di trasformazione e la qualità continua dei dati che vi scorrono. Le aspettative gestiscono continuamente la parte relativa ai dati. Per la logica, trasformare fattori in funzioni semplici e testarle unitariamente fuori dal runtime, poi validare il grafico della pipeline con una prova a zero prima di materializzare qualcosa. Vedi test unitari delle pipeline.

Conserva il codice della pipeline in Git e impacchettalo per la distribuzione in modo che possa essere rivisto, ripristinato e distribuito in modo coerente tra gli ambienti. Il pacchetto non è un'alternativa alle gasdotte Lakeflow. È il progetto e il wrapper CI/CD attorno alla tua pipeline, e la logica dei dati rimane dichiarativa. Parametrizza valori specifici dell'ambiente come nomi di catalogo e percorsi in modo che lo stesso codice venga eseguito senza modifiche in ogni ambiente. Consulta Usare i parametri con le pipeline.

Per eseguire una pipeline in base a una pianificazione, includila in un Eseguire pipeline in un workflow: Databricks consiglia di pianificare e orchestrare le pipeline con i job, che consentono anche di coordinare la pipeline con altre attività, ad esempio mettendo in sequenza un report a valle o più pipeline tra loro. All'interno di una run, una pipeline ordina e parallelizza i propri dataset, quindi l'orchestrazione coordina solo i compiti esterni alla pipeline.

In questa fase

Domande da considerare durante questa fase:

Produzione

Una volta che una pipeline viene eseguita senza supervisione rispetto a dati reali, il lavoro diventa capire se è sana e correggerla quando non lo è.

Il monitoraggio funziona a tre livelli di profondità. L'elenco Jobs & Pipelines mostra a colpo d'occhio lo stato delle esecuzioni recenti. L'interfaccia di monitoraggio della pipeline mostra ogni tabella e flusso codificati a colori per stato, con conteggio delle righe, metriche di qualità dei dati e metriche di backlog per le tabelle di streaming. Il registro degli eventi sotto entrambi è la fonte di verità per tutto ciò che riguarda i programmi o la storia. Configura le notifiche di guasto in modo da sapere di una run non funzionante prima che i tuoi stakeholder la segnalino. Per una panoramica delle superfici di monitoraggio, vedi Monitoraggio delle pipeline.

Debug lavorando a ritroso dal fallimento evidenziato sul grafico fino al dettaglio completo dell'errore nel registro eventi, poi rieseguire solo ciò che è fallito. Il comportamento dei ritentativi varia a seconda del trigger: gli aggiornamenti attivi manualmente disattivano i tentativi automatici così vediamo immediatamente gli errori, mentre gli aggiornamenti programmati ritentano i fallimenti recuperabili. Un avviso di produzione potrebbe quindi risolversi da solo al nuovo tentativo, mentre lo stesso errore non si risolve durante lo sviluppo interattivo. Durante lo sviluppo, Genie Code può aiutare a diagnosticare e correggere errori a livello di codice durante l'iterazione, anche se oggi punta a creare pipeline piuttosto che a diagnosticare le esecuzioni in produzione.

Modella un backfill come un flusso separato ed esplicito, da eseguire una sola volta, che alimenta la stessa destinazione del normale flusso incrementale. Mantenere separati i registri di quando e come la storia è stata caricata e mantenere la logica a stato stazionario semplice.

Proteggi una pipeline controllando chi può gestirla, gestindola come un principale di servizio dedicato invece che come account personale, e mantenendo le credenziali in un ambito segreto invece che nel codice sorgente. La tracciabilità è automatica, rilevata a livello di colonna. Una pipeline scrive in un sistema esterno tramite un sink nelle pipeline Lakeflow, il punto in cui si applica il principio di elaborazione at-least-once descritto sopra.

In questa fase

Domande da considerare durante questa fase:

Maturità e scala

Una pipeline matura funziona in modo autonomo e cresce senza bisogno di essere riscritta. Confermare la prontezza e pianificare come scalare definiscono questa fase.

La prontezza alla produzione è una checklist che comprende qualità dei dati, affidabilità, osservabilità, implementazione, costi e governance. Tratta ogni elemento non spuntato come una criticità nota: per ogni dataset che può ricevere dati errati, è definita un'aspettativa? La pipeline è pianificata anziché avviata manualmente? Le notifiche in caso di errore sono configurate? Viene eseguita come service principal? È distribuita tramite controllo di versione almeno negli ambienti di destinazione dev e prod? La qualità dei dati e le notifiche sono le soluzioni meno costose da implementare e quelle con maggiori probabilità di individuare un’esecuzione difettosa non rilevata.

Scala in risposta ai segnali concreti che la salute del gasdotto sta peggiorando:

  • La durata degli aggiornamenti è in aumento.
  • L'autoscaling raggiunge ripetutamente il suo limite massimo.
  • I costi crescono più velocemente dell'azienda sottostante.
  • Le visualizzazioni materializzate stanno tornando a ricalcolare completamente.

Prova prima le leve a livello di calcolo, come passare al serverless o adattare la modalità performance alle tue esigenze di latenza. Oltre a questo, il modo in cui organizzi i dataset tra pipeline è la cosa più importante:

  • Una pipeline ha un limite di concorrenza: aggiorna solo un numero prestabilito di dataset contemporaneamente. Una volta che una pipeline ha più dataset oltre quel limite, gli aggiornamenti extra attendono in coda, quindi il tempo totale di aggiornamento della pipeline aumenta.
  • Raggruppa i dataset correlati e dividi quelli non correlati. Raggruppare per dominio, frequenza di aggiornamento condivisa e dipendenza; suddividere in corrispondenza dei confini di proprietà, livello e latenza. Separare l'ingestione dalla trasformazione, ad esempio, evita che una fase di ingestione lenta ritardi tutto ciò che segue e mantiene ogni pipeline abbastanza piccola da rimanere entro il limite di concorrenza.

Unire due piccoli gasdotti in seguito è più semplice che dividere un grande gasdotto già in produzione. Per informazioni su come raggruppare e suddividere i dataset, consulta Organizzare i dataset nelle pipeline Lakeflow.

In questa fase

Domande da considerare durante questa fase:

Risorse aggiuntive