Pubblicato il 06/01/2024 da alnao nella categoria AWS

Il processo di estrazione, trasformazione e caricamento di dati, molto spesso nominato con la sigla ETL, consiste nella combinazione di dati provenienti da più fonti in un grande archivio centrale spesso chiamato data warehouse ma si può fare riferimento ad ETL a qualsiasi processo di trasformazione di dati da una sorgente ad una destinazione, si rimanda alla documentazione ufficiale per maggiori dettagli. AWS ha studiato una serie di servizi per la gestione di grandi dimensioni di dati (big-data), la documentazione ufficiale descrive i principali servizi di gestione dei dati:

  • Estrazione, trasformazione e caricamento: Glue
  • Analisi interattiva: Athena
  • Elaborazione di Big Data: EMR
  • Data warehousing: Redshift
  • Analisi in tempo reale: Flink
  • Analisi operative: OpenSearch
  • Governance dei dati: DataZone
  • Archiviazione di oggetti: S3
  • Backup e archiviazione: S3 Glacier e AWS Backup

In questo articolo verrà introdotto il servizio Glue che permette di definire all’interno di un cloud AWS, processi ETL in linguaggio Python o un suo dialetto Spank, questo servizio facilita la scoperta, la preparazione, lo spostamento e l’integrazione dei dati da più origini per l’analisi, il machine learning (ML) e lo sviluppo di applicazioni.

Il funzionamento del servizio è di tipo serverless, quindi si definisce il codice da eseguire e le caratteristiche iii minime iii che eseguono il codice, per questo servizio la configurazione prevede la definizione del numero di DPU, una DPU corrisponde a 4 vCPU e 16 GB di memori. Esistono quattro tipi di processi: Spark, Spark Streaming, Ray e Python Shell, a seconda del tipo ci sono delle configurazioni minime come Python che prevede un minimo di 0,0625 DPU per un minimo di un minuto di esecuzione.

Il dettaglio di quali tipi vengono usati influisce molto sul costo del servizio: il costo è calcolato in base all’utilizzo, al tipo e al numero di DPU, per esempio il costo è di 0,44 dollari per DPU all’ora per ogni processo Spark, fatturato al secondo con un minimo di 1 minuto nella regione irlandese, bisogna sempre ricordare che nel totale bisogna aggiungere anche i costi di traffico o di uso degli altri servizi come i bucket S3 hanno il costo di traffico dati transitati. Per maggiori dettagli si rimanda sempre alla pagina ufficiale del servizio.

Il servizio Glue mette a disposizione un ETL completo: tramite questo servizio è possibile definire crawlers, tabelle e workflow, questi argomenti saranno trattati in un articolo separato, in questo viene descritta solo la funzionalità di definizione dei job.


Per utilizzare al meglio questo servizio bisogna tenere conto che non si tratta di soli processi eseguiti come le Lambda Function, Glue è studiato per integrarsi con un data Catalog e crawlers, per il servizio è stato studiata un AWS Glue Studio: un ambiente web con il quale è possibile gestire i vari job definendo non solo il codice ma anche l’elenco delle esecuzioni e il monitoraggio dei log

La via più semplice per creare e gestire un processo è utilizzare la console Web che mette a disposizione una procedura guidata per la creazione di un processo, nel sito ufficiale è disponibile una guida con dei laboratori pratici per apprendere il funzionamento del servizio e vedere le varie possibilità di utilizzo dei sistemi. La via più semplice per creare un job è utilizzare la console web e AWS Glue Studio che permette di creare processi in pochi passi:

, si rimanda alla documentazione ufficiale per tutti i dettagli che descrivono in maniera semplice ma completa tutte le funzionalità disponibili.


La CLI mette a disposizione una serie di comandi per la definizione e la gestione dei processi, il comando principale per avviare un processo è

aws glue start-job-run --job-name <nome>

comando corrispondente alla procedura da console per eseguire i Job. Si rimanda alla documentazione ufficiale per maggiori dettagli su tutti i comandi disponibili. I principali comandi per il monitoraggio dei job:

  • elenco semplice di tutti i job definiti
    $ aws glue list-jobs
  • elenco di tutti i job con i dettagli
    $ aws glue get-jobs
  • dettaglio di un job
    $ aws glue get-job --job-name <value>
  • elenco e dettaglio delle esecuzioni di un job
    $ aws glue get-job-runs --job-name <value>
    $ aws glue get-job-runs --job-name <value> --run-id <value>

Con la libreria SDK è possibile gestire i job definiti con dei metodi, si rimanda sempre alla documentazione ufficiale, in particolare i principali metodi per la gestione dei job sono:

  • elenco semplice di tutti i job definiti
    response = client.get_jobs(MaxResults=123)
  • dettaglio di un job
    response = client.get_job(JobName=job_name)
  • elenco delle esecuzioni di un job
    response = client.get_job_runs(JobName=job_name,MaxResults=123)
  • dettaglio dell’esecuzione di un job
    response = client.get_job_run(JobName=job_name,RunId=run_id)
  • metodo per avviare un job
    client.start_job_run( ... )

con quest’ultimo comando è possibile eseguire un job, il nome del job è l’unico parametro obbligatorio ma è possibile lanciare l’esecuzione con diversi parametri facoltativi. Si rimanda sempre alla documentazione ufficiale per maggiori dettagli.


Con CloudFormation è possibile creare e gestire processi JOB, si fa sempre riferimento alla documentazione ufficiale che descrive molto chiaramente le proprietà del tipo specifico

Type: AWS::Glue::Job

studiato per la creazione e definizione dei Job di questo tipo. In particolare bisogna sempre ricordare che è necessario indicare la posizione del codice sorgente del job:

Command: 
  # PythonVersion: "3.9"
  Name: glueetl 
  ScriptLocation: !Sub "s3://${Bucket}/${CodePosition}/etl_code.py"py

come indicato nella documentazione ufficiale. Nell’esempio disponibile al solito repository:

https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio16glueJobETL

è possible vedere la definizione di un job tramite template e una piccola infrastruttura con una step function invocata da una regola EventBridge, questa macchina a stati esegue una lambda function e una logica prima di eseguire l’esecuzione del job descritta con Glue.

Da notare che il codice del job è quasi privo di ogni logica ma nell’esempio è possibile vedere come i parametri vengono passaggi al job: alcuni sono costanti indicati direttamente nel template di CloudFormation altri sono indicati nella step function indicando che due parametri di input del job devono contenere i valori ritornati dalla funzione lambda eseguita poco prima nella step function. Da notare anche che nei template di esempio sono sempre create le regola IAM associate anche al Job di tipo Glue in quanto, come sempre, in AWS tutti gli accessi sono negati a meno che non vengano specificati da una regola IAM.

Bisogna ricordare che, quando si lavora con i Job di Glue, il codice è un file separato dai template CloudFormation e che il file deve essere indicato nel parametro ScriptLocation e deve essere caricato manualmente o in maniera parallela rispetto alla gestione dello Stack.

MENU