Semplifica la creazione e la gestione dei DAG di Airflow con Hamilton in 8 minuti
Semplifica Airflow con Hamilton in 8 minuti
Come Hamilton può aiutarti a scrivere DAG di Airflow più manutenibili

Questo post è scritto in collaborazione con Thierry Jean ed è apparso originariamente qui.
Questo post ti guida attraverso i vantaggi di avere due progetti open source, Hamilton e Airflow, e come i loro grafi aciclici diretti (DAG) lavorano in tandem. Ad alto livello, Airflow è responsabile dell’orchestrazione (pensa in grande) e Hamilton aiuta a creare trasformazioni dei dati pulite e manutenibili (pensa in piccolo).
Per coloro che non conoscono Hamilton, ti indirizziamo a una panoramica interattiva su tryhamilton.dev, o ai nostri altri post, ad esempio questo. Altrimenti parleremo di Hamilton a alto livello e indirizzeremo alla documentazione di riferimento per ulteriori dettagli. Per riferimento, sono uno dei co-creatori di Hamilton.
Per coloro che stanno ancora cercando di capire come i due possono funzionare insieme, il motivo per cui puoi eseguire Hamilton con Airflow è che Hamilton è solo una libreria con una piccola dipendenza, e quindi è possibile aggiungere Hamilton alla configurazione di Airflow in poco tempo!
- Ricercatori di Stanford introducono HyenaDNA un modello di base genomica a lungo raggio con lunghezze di contesto fino a 1 milione di token a risoluzione di singolo nucleotide.
- Tutto ciò che riguarda i database vettoriali – la loro importanza, gli embedding vettoriali e i migliori database vettoriali per i modelli linguistici di grandi dimensioni (LLM)
- Nove regole per l’esecuzione di Rust sul Web e su dispositivi embedded
Solo per riassumere, Airflow è lo standard del settore per orchestrare i flussi di dati. Alimenta tutti i tipi di iniziative di dati, inclusi ETL, flussi di lavoro di apprendimento automatico e BI. Sin dalla sua nascita nel 2014, gli utenti di Airflow hanno affrontato alcune difficoltà nell’autore e nella manutenzione dei flussi di dati:
- Gestire in modo manutenibile l’evoluzione dei flussi di lavoro; ciò che inizia in modo semplice può diventare inevitabilmente complesso.
- Scrivere codice modulare, riutilizzabile e testabile che viene eseguito all’interno di un’attività di Airflow.
- Tracciare la linea di codice e gli artefatti di dati che un DAG di Airflow produce.
Ecco dove crediamo che Hamilton possa aiutare! Hamilton è un micro-framework Python per scrivere trasformazioni dei dati. In breve, si scrivono funzioni python in uno stile “dichiarativo”, che Hamilton analizza e collega in un grafo in base ai loro nomi, argomenti e annotazioni di tipo. È possibile richiedere output specifici e Hamilton eseguirà il percorso di funzione richiesto per produrli. Poiché non fornisce capacità di orchestrare a livello macro, si abbina perfettamente ad Airflow aiutando i professionisti dei dati a scrivere codice più pulito e riutilizzabile per i DAG di Airflow.

Scrivi DAG di Airflow manutenibili
Un uso comune di Airflow è aiutare nell’apprendimento automatico/scienza dei dati. L’esecuzione di carichi di lavoro del genere in produzione richiede spesso flussi di lavoro complessi. Una decisione di progettazione necessaria con Airflow è determinare come suddividere il flusso di lavoro in attività di Airflow. Crearne troppe aumenta l’overhead di pianificazione ed esecuzione (ad esempio, spostare molti dati), crearne troppe poche comporta attività monolitiche che possono richiedere del tempo per essere eseguite, ma probabilmente è più efficiente eseguirle. Il compromesso qui è la complessità del DAG di Airflow rispetto alla complessità del codice all’interno di ciascuna delle attività. Ciò rende il debug e il ragionamento sul flusso di lavoro più difficile, specialmente se non si è autori del DAG di Airflow iniziale. Molto spesso, la struttura iniziale delle attività del DAG di Airflow diventa fissa, perché il refactoring del codice delle attività diventa proibitivo!
Mentre i DAG più semplici come A->B->C
sono desiderabili, c’è una tensione intrinseca tra la semplicità della struttura e la quantità di codice per attività. Più codice per attività, più difficile è identificare i punti di errore, a discapito delle efficienze computazionali potenziali, ma nel caso di errori, i tentativi di ripetizione aumentano di costo con la “dimensione” dell’attività.

Invece, e se potessi gestire contemporaneamente la complessità all’interno di un task di Airflow, indipendentemente dalla dimensione del codice al suo interno, e ottenere la flessibilità di cambiare facilmente la forma del DAG di Airflow con uno sforzo minimo? Ecco dove entra in gioco Hamilton.
Con Hamilton puoi sostituire il codice all’interno di ogni task di Airflow con un DAG di Hamilton, in cui Hamilton gestisce l’orchestrazione “micro” del codice all’interno del task. Nota: Hamilton ti consente effettivamente di modellare in modo logico tutto ciò che desideri che un DAG di Airflow faccia. Maggiori dettagli in basso.
Per utilizzare Hamilton, carichi un modulo Python che contiene le tue funzioni di Hamilton, istanzi un Driver di Hamilton ed esegui un DAG di Hamilton all’interno di un task di Airflow in poche righe di codice. Utilizzando Hamilton, puoi scrivere la tua trasformazione dei dati con una granularità arbitraria, permettendoti di ispezionare in dettaglio ciò che ogni task di Airflow sta facendo.
In particolare, i meccanismi del codice sono i seguenti:
- Importa i tuoi moduli di funzioni
- Passali al driver di Hamilton per costruire il DAG.
- Quindi, chiama
Driver.execute()
con gli output che desideri eseguire dal DAG che hai definito.
Guardiamo un po’ di codice che crea un DAG di Airflow con un singolo nodo ma utilizza Hamilton per addestrare e valutare un modello di ML:
Non abbiamo mostrato qui il codice di Hamilton, ma i vantaggi di questo approccio sono:
- Test unitari e di integrazione. Hamilton, attraverso i suoi requisiti di denominazione e annotazioni di tipo, spinge gli sviluppatori a scrivere codice Python modulare. Ciò porta a moduli Python adatti per i test unitari. Una volta che il tuo codice Python è stato testato, puoi sviluppare test di integrazione per assicurarti che si comporti correttamente nei tuoi task di Airflow. Al contrario, testare il codice contenuto in un task di Airflow è meno banale, specialmente in ambienti di CI/CD, poiché richiede di avere accesso a un ambiente di Airflow.
- Riutilizzo delle trasformazioni dei dati. Questo approccio mantiene il codice delle trasformazioni dei dati nei moduli Python, separato dal file DAG di Airflow. Ciò significa che questo codice può essere eseguito anche al di fuori di Airflow! Se provieni dal mondo dell’analisi dati, dovrebbe essere simile allo sviluppo e al test delle query SQL in un file esterno
.sql
, per poi caricarlo nei tuoi operatori Postgres di Airflow. - Riorganizza facilmente il tuo DAG di Airflow. L’impegno richiesto per cambiare il tuo DAG di Airflow è ora molto più basso. Se modelli logicamente tutto in Hamilton, ad esempio un flusso di lavoro di machine learning end-to-end, è solo una questione di determinare quanto di questo DAG di Hamilton deve essere calcolato in ogni task di Airflow. Ad esempio, puoi cambiare il numero di task da un singolo task monolitico di Airflow, a pochi o a molti – tutto ciò che è necessario cambiare è ciò che richiedi a Hamilton, poiché il tuo DAG di Hamilton non deve cambiare affatto!
Sviluppo iterativo con Hamilton & Airflow
Nella maggior parte dei progetti di data science, sarebbe impossibile scrivere il DAG del sistema finale dal giorno 1, poiché i requisiti cambieranno. Ad esempio, il team di data science potrebbe voler provare diversi set di feature per il loro modello. Fino a quando l’elenco non è stabilito e finalizzato, probabilmente non è desiderabile avere il set di feature nel tuo codice sorgente e sotto controllo di versione; sarebbero preferibili file di configurazione.
Airflow supporta configurazioni di DAG predefinite e in tempo di esecuzione e registra queste impostazioni per rendere ogni esecuzione del DAG riproducibile. Tuttavia, l’aggiunta di comportamenti configurabili richiederà l’aggiunta di dichiarazioni condizionali e complessità al codice del tuo task di Airflow. Questo codice potrebbe diventare obsoleto durante il progetto o essere utile solo in determinati scenari, diminuendo alla fine la leggibilità dei tuoi DAG.
Al contrario, Hamilton può utilizzare la configurazione in tempo di esecuzione di Airflow per eseguire diverse trasformazioni di dati dal grafo delle funzioni al volo. Questo approccio stratificato può aumentare notevolmente l’espressività dei DAG di Airflow mantenendo al contempo la semplicità strutturale. In alternativa, Airflow può generare dinamicamente nuovi DAG da configurazioni, ma ciò potrebbe diminuire l’osservabilità e alcune di queste funzionalità rimangono sperimentali.

Se lavori in un modello di consegna, questo approccio favorisce una separazione dei compiti tra gli ingegneri dei dati responsabili del sistema di produzione Airflow e gli scienziati dei dati responsabili dello sviluppo di soluzioni aziendali attraverso la scrittura di codice Hamilton. Questa separazione può migliorare anche la coerenza dei dati e ridurre la duplicazione del codice. Ad esempio, un singolo DAG di Airflow può essere riutilizzato con diversi moduli Hamilton per creare modelli diversi. Allo stesso modo, le stesse trasformazioni dei dati di Hamilton possono essere riutilizzate in diversi DAG di Airflow per alimentare dashboard, API, applicazioni, ecc.
Sotto sono presenti due immagini. La prima illustra il DAG di Airflow ad alto livello che contiene due nodi. La seconda mostra il DAG di Hamilton a basso livello del modulo Python evaluate_model
importato nell’attività di Airflow train_and_evaluate_model.


Gestione degli artefatti dei dati
I progetti di data science producono un gran numero di artefatti dei dati provenienti da dataset, valutazioni delle prestazioni, figure, modelli addestrati, ecc. Gli artefatti necessari cambieranno nel corso del ciclo di vita del progetto (esplorazione dei dati, ottimizzazione del modello, debug in produzione, ecc.). Questo è un problema per Airflow poiché rimuovere un’attività da un DAG eliminerà la sua cronologia dei metadati e interromperà la continuità degli artefatti. In determinati scenari, la produzione di artefatti dei dati non necessari o ridondanti può comportare costi significativi di calcolo e archiviazione.
Hamilton può fornire la flessibilità necessaria per la generazione degli artefatti dei dati attraverso la sua API di salvataggio dei dati. Le funzioni decorate con @save_to.*
aggiungono la possibilità di archiviare il loro output, è sufficiente richiedere questa funzionalità tramite Driver.execute()
. Nel codice sottostante, chiamando validation_predictions_table
verrà restituita la tabella, mentre chiamando il valore output_name_
di save_validation_predictions
verrà restituita la tabella e salvata in .csv
Questa flessibilità aggiuntiva consente agli utenti di attivare o disattivare facilmente gli artefatti generati e può essere fatto direttamente tramite la configurazione di runtime di Airflow, senza modificare il DAG di Airflow o i moduli di Hamilton.
Inoltre, il grafo delle funzioni di Hamilton dettagliato consente una precisa continuità dei dati e una provenienza. Le funzioni di utilità what_is_downstream_of()
e what_is_upstream_of()
aiutano a visualizzare ed esplorare in modo programmabile le dipendenze dei dati. Per ulteriori dettagli, rimandiamo i lettori interessati qui .
Per concludere e un esempio per iniziare
Speriamo che fino ad ora ti siamo riusciti a impressionare che combinare Hamilton con Airflow ti aiuterà con le sfide di creazione e manutenzione del DAG di Airflow. Dato che questo è un breve articolo, per concludere, passiamo al codice che abbiamo nel repository di Hamilton per te.
Per aiutarti a iniziare, abbiamo un esempio su come utilizzare Hamilton con Airflow. Dovrebbe coprire tutti i concetti di base di cui hai bisogno per iniziare. Nel README è incluso come configurare Airflow con Docker, in modo da non dover preoccuparti di installare le dipendenze solo per giocare con l’esempio.
Per quanto riguarda il codice nell’esempio, contiene due DAG di Airflow, uno che mostra un esempio di base di Hamilton per creare “features” per addestrare un modello e l’altro un esempio di progetto di machine learning più completo , che esegue un’intera pipeline di creazione di “features” e quindi addestramento e valutazione di un modello. Per entrambi gli esempi, troverai il codice Hamilton nella cartella dei plugin.

Se hai domande o hai bisogno di aiuto, unisciti al nostro Slack . Altrimenti, per saperne di più sulle funzionalità e la funzionalità di Hamilton, ti indirizziamo alla documentazione di Hamilton .
Riferimenti e Approfondimenti
Grazie per aver dato un’occhiata a questo post. Se desideri approfondire o vuoi saperne di più su Hamilton, abbiamo i seguenti link per te da consultare!
- Esempio di codice Hamilton + Airflow
- Documentazione di Hamilton
- tryhamilton.dev – un modo interattivo per saperne di più su Hamilton.
- Per un altro sistema di orchestrazione che si integra con Hamilton, puoi dare un’occhiata a Hamilton + Metaflow .
- Comunità Hamilton su Slack
- Lineage + Hamilton in 10 minuti
- Presentazione di Hamilton (la storia e l’introduzione)
- Hamilton + Pandas in 5 minuti
- Come utilizzare Hamilton in un ambiente Notebook