Nel post precedente, Da Apache Airflow® a Lakeflow: Orchestration Data-First, l'orchestrazione è stata riformulata attorno ai dati e al lakehouse invece che a scheduler esterni. Questo post si basa su tale fondamento e si concentra sui dettagli di esecuzione per i team che già utilizzano Airflow in produzione e desiderano passare all'orchestratore nativo di Databricks, Lakeflow Jobs.
Questa guida è scritta sia per i professionisti che migrano da Airflow sia per gli agenti di programmazione che generano workflow di Lakeflow Jobs. L'obiettivo è mostrare come gli stessi workflow possano essere espressi in modo naturale quando l'orchestrazione fa parte del lakehouse stesso all'interno di Databricks.

La tabella seguente riassume come i comuni pattern di orchestrazione di Airflow si traducono in Lakeflow Jobs e se la migrazione è una traduzione diretta o un refactoring concettuale.
Pattern Airflow | Uso primario | Equivalente Lakeflow Jobs | Guida alla migrazione |
XComs | Passa piccoli metadati di controllo tra task | Utilizza i valori dei task per piccoli metadati; sposta i dati effettivi nelle tabelle Unity Catalog | |
Sensors | Attende file o condizioni | Sostituisci i sensori di polling con trigger integrati | |
Backfills | Riesegui per date storiche | Job backfills + parametri | Tratta il tempo come dati, usa backfill parametrizzati |
Branching | Esecuzione condizionale dei task | Task di condizione ( | Sostituisci task.branch con task If-Else |
Mappatura dinamica dei task | Fan-out a runtime | Task For-each | Usa for‑each quando il numero di task dipende dai dati a runtime |
La maggior parte dei team migra in modo incrementale piuttosto che sostituire Airflow in blocco. Gli approcci comuni includono:
Lakeflow Jobs è progettato per coesistere durante la migrazione e per assumere le responsabilità di orchestrazione dove aggiunge maggior valore.
Checklist
XComs con piccoli metadati → valori dei task; XComs con dati → tabelle o volumi Unity Catalog.
Macro per la data di esecuzione (ds, ecc.) → parametri espliciti + esecuzioni di backfill.
Branching (@task.branch) → task di condizione.
Mappatura dinamica dei task → task for‑each dove il fan‑out è guidato dai dati.
(Opzionale) Job e schemi gestiti tramite Python Asset Bundles per ambienti coerenti.
Quando si migra da Airflow, è utile interiorizzare alcune ipotesi fondamentali che definiscono il funzionamento di Lakeflow Jobs:
Piano di controllo vs piano dati
Le operazioni nel piano dati (query, letture, scritture e trasformazioni) guidano l'utilizzo del calcolo. Le operazioni del piano di controllo come trigger, valori dei task e parametri no.
I Job sono l'unità di orchestrazione
I Trigger sono di prima classe
Queste ipotesi spiegano perché alcuni pattern di Airflow si traducono direttamente, mentre altri vengono intenzionalmente semplificati o sostituiti.
Airflow: XComs per piccoli metadati di controllo
In Apache Airflow, gli XComs vengono utilizzati per passare piccoli pezzi di metadati tra task all'interno di un'esecuzione DAG. Un esempio minimo di Airflow che passa un piccolo valore tra task:
Ciò funziona bene per piccoli ID, valori, flag e conteggi, ma diventa difficile da gestire quando molti task dipendono dagli XComs o quando vengono inviati payload di grandi dimensioni.
Lakeflow: valori dei task per il controllo, tabelle per i dati
In Lakeflow Jobs, i valori dei task svolgono il ruolo di XCom per i metadati di controllo. Job e task sono tipicamente definiti tramite asset bundle, e le loro implementazioni si trovano in notebook o file Python. Snippet di bundle (Python) che definisce due task e una dipendenza:
Notebook del produttore:
Notebook del consumatore:
I valori dei task sono visibili nell'interfaccia utente di Lakeflow Jobs per ogni esecuzione e sono limitati a piccoli payload, rendendoli ideali per flag, contatori e ID. Per oggetti più grandi o output riutilizzabili, i task dovrebbero scrivere in tabelle o viste di Unity Catalog:
💡 Regola generale: Utilizza i valori dei task solo per i metadati di controllo; inserisci tutto ciò che assomiglia a dati in tabelle, viste o volumi.
Suggerimenti per la migrazione
Airflow: sensori di file e asset
Pattern Airflow tipico per una pipeline guidata da file:
Questo mantiene un worker occupato a fare polling e spesso si combina con il tracciamento personalizzato degli asset quando più consumer dipendono dagli stessi dati.
Lakeflow: trigger di arrivo file
Snippet che mostra un trigger di arrivo file
Implementazione del notebook
La piattaforma gestisce lo stato del trigger, il debounce e il cooldown, e non sono più necessari sensori a lunga esecuzione o scheduler esterni per monitorare i file.
Lakeflow: trigger di aggiornamento tabella (pianificazione in stile asset)
Quando i produttori scrivono su tabelle di Unity Catalog, i consumatori possono attivarsi sugli aggiornamenti delle tabelle invece che su pianificazioni basate sul tempo.
💡Regola generale: Attiva i job all'arrivo di file o agli aggiornamenti delle tabelle quando possibile; usa le pianificazioni solo quando ne hai veramente bisogno.
Suggerimenti per la migrazione
Airflow: data di esecuzione e ds
Airflow incoraggia la logica di templating con le date di esecuzione:
I backfill sono guidati dallo scheduler di Airflow e dalle date di esecuzione; la logica dipende implicitamente dal concetto di tempo dello scheduler.
Lakeflow: parametri espliciti e backfill
In Lakeflow Jobs, la "data di esecuzione logica" dovrebbe essere modellata come un parametro. Definizione del job (bundle) con un parametro:
Nota: puoi anche usare {{ job.trigger.time.iso_date }} se vuoi usare lo stile Airflow {{ds}} o {{ execution_date }} invece dei dati hardcoded nell'esempio sopra.
SQL utilizza il parametro:
Per fare il backfill, definisci un set di valori di parametri ed esegui i backfill su di essi nell'UI o tramite API, invece di fare affidamento sul catchup implicito dello scheduler. I parametri sono definiti una volta e sovrascritti al runtime quando si attiva un'esecuzione di backfill
💡Regola generale: Tratta il tempo come dati; modellalo come parametro, passalo esplicitamente ai task e guida i backfill tramite intervalli di parametri.
Suggerimenti per la migrazione
{{ ds }} e macro correlate con parametri (es. :run_date).Airflow: branching e mappatura dinamica dei task
Branching con @task.branch:
Mappatura dinamica dei task per fan-out al runtime utilizzando expand():
Lakeflow: condition tasks
Lakeflow Jobs usa le condition tasks per il branching basato sui dati
il notebook check_quality emette un valore di task:
Il grafo mostra esplicitamente il branch e la logica decisionale è espressa tramite dati (valori di task) anziché tramite flusso di controllo Python incorporato.
💡Regola generale: Usa le condition tasks quando un'espressione booleana su parametri o valori di task determina il percorso.
Lakeflow: for-each tasks per fan-out in runtime
Le for-each tasks implementano il fan-out quando il numero di task dipende dai dati in runtime.
il notebook generate_items:
il notebook process_item vede l'elemento corrente come {{input}} (o variabile di runtime equivalente a seconda del wrapper del linguaggio).
💡Regola generale: Usa for-each quando il fan-out è guidato dai dati in runtime; mantieni le task statiche quando il fan-out è fisso al momento della progettazione.
Suggerimenti per la migrazione
@task.branch → condition tasks che utilizzano valori di task o parametri.Molte distribuzioni Airflow generano DAG dinamicamente (un DAG per tabella o file SQL) e gestiscono le differenze ambientali tramite convenzioni e script. I Python Asset Bundles offrono un modo strutturato per generare job e risorse correlate programmaticamente.
Esempio: un job per file SQL:
Puoi combinare questo con i mutatori per regolare notifiche, identità di esecuzione o tentativi per ambiente, centralizzando gli standard pur mantenendo le definizioni dei job in Python.
💡 Regola generale: Usa la generazione programmatica per codificare le convenzioni della piattaforma, non per nascondere hack una tantum.
Se stai eseguendo Airflow oggi, scegli un DAG che si basa su sensori, XComs o mappatura dinamica delle task e reimplementalo utilizzando un trigger, una for-each task e parametri espliciti. Questo è solitamente sufficiente per interiorizzare il modello mentale di Lakeflow Jobs.
Clona ed esegui gli esempi completi e funzionanti utilizzati in questa guida
Scopri di più sull'orchestrazione data-first
Esplora la documentazione di Lakeflow Jobs
(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale
