AWS Glue: ETL serverless e Data Catalog

AWS Glue è il servizio ETL serverless di riferimento per DEA-C01: non si gestiscono cluster, si paga a DPU-hour e la piattaforma scala Apache Spark in modo trasparente. Un job Glue legge da una sorgente (Amazon S3, JDBC, Kinesis), applica trasformazioni e scrive su una destinazione come S3, Amazon Redshift o un database relazionale.

Il Glue Data Catalog è il metastore centrale, compatibile con Hive: conserva database, tabelle, schemi e partizioni, ed è condiviso da Amazon Athena, Redshift Spectrum ed EMR. I crawler esplorano le sorgenti, inferiscono lo schema e popolano o aggiornano le tabelle del Catalog, rilevando nuove partizioni. Sono comodi per dati che cambiano schema, ma vanno pianificati (schedule) con criterio per non ricreare tabelle in modo indesiderato.

Glue Studio offre un editor visuale per costruire job come grafo di nodi source-transform-target, generando codice PySpark o Scala. Per data preparation no-code orientata agli analisti esiste AWS Glue DataBrew. Per job leggeri che non richiedono Spark, i Glue Python shell job eseguono script Python puri con poche risorse.

Job bookmark e incremental processing

I job bookmark sono il meccanismo nativo di Glue per l’incremental processing: memorizzano lo stato di ciò che un job ha già elaborato, così le esecuzioni successive processano solo i dati nuovi senza rilavorare l’intero dataset. Su S3 il tracking si basa su timestamp e percorsi degli oggetti; su sorgenti JDBC richiede una bookmark key su colonne ordinate in modo crescente e univoche (tipicamente una chiave incrementale o un timestamp).

Il bookmark ha tre stati: enable (traccia e avanza), pause (elabora ma non avanza lo stato) e disable (rilavora sempre tutto). Se un job rielabora sempre gli stessi dati, la causa è quasi sempre bookmark disabilitato o bookmark key non idonea. Per un ricaricamento completo si può fare il reset del bookmark.

Spark, DynamicFrame e quando usare Lambda

Sotto il cofano Glue usa Apache Spark per l’elaborazione distribuita. L’astrazione tipica di Glue è il DynamicFrame, più flessibile del DataFrame Spark perché gestisce schemi eterogenei e tipi ambigui (choice); si può convertire in DataFrame quando servono funzioni SQL/Spark native. La scelta del worker type (G.1X, G.2X e superiori) e del numero di worker determina costo e parallelismo.

Non tutto merita Spark. Per trasformazioni leggere — file piccoli, format conversion, arricchimento event-driven a bassa latenza — AWS Lambda è spesso la scelta migliore: si attiva su eventi (es. object created su S3), costa poco e parte in millisecondi. I limiti sono il timeout massimo di 15 minuti e la memoria: dataset grandi o join distribuiti eccedono Lambda e richiedono Glue o EMR. Regola pratica: Lambda per trasformazioni piccole e reattive, Glue per ETL batch serverless su volumi medio-grandi, EMR quando serve controllo fine del cluster o costi ottimizzati su carichi molto grandi e continui.

Trappole tipiche d’esame

  • Aggiornare solo le partizioni nel Catalog senza rilavorare i dati → soluzione: usa un crawler schedulato oppure MSCK REPAIR TABLE / partition projection lato Athena, non un job ETL completo.
  • Job Glue che rielabora ogni volta l’intero dataset S3 → soluzione: abilita i job bookmark; se sono già attivi, verifica che la sorgente supporti il tracking e che il job non venga resettato a ogni run.
  • Incremental su sorgente JDBC che salta o duplica righe → soluzione: definisci una bookmark key su colonna monotona crescente e univoca; una colonna non ordinata rende il bookmark inaffidabile.
  • Trasformazione semplice event-driven su file piccoli → soluzione: scegli AWS Lambda, non un job Spark: minore latenza e costo; passa a Glue solo se superi timeout o memoria.
  • Serve SQL/Spark nativo ma il job usa DynamicFrame → soluzione: converti il DynamicFrame in DataFrame per le operazioni, poi eventualmente riconverti prima della scrittura.
  • Script leggero senza parallelismo → soluzione: usa un Glue Python shell job; riserva i job Spark ai carichi che beneficiano davvero dell’elaborazione distribuita.