Perché il mio processo ETL AWS Glue richiede molto tempo?

8 minuti di lettura
0

Il mio processo AWS Glue dura molto. Oppure il completamento della mia attività straggler AWS Glue richiede molto tempo.

Risoluzione

I fattori comuni che possono causare l'esecuzione prolungata dei processi AWS Glue includono le impostazioni di configurazione e la struttura dei dati e degli script.

I passaggi seguenti aiutano a ottimizzare le prestazioni.

Imposta metriche e registrazione

Per identificare i problemi e ottimizzare le prestazioni, utilizza gli strumenti di monitoraggio integrati di AWS Glue, come Amazon CloudWatch e le metriche di osservabilità dei processi.

Inoltre, configura avvisi per anomalie e attiva l'interfaccia utente di Apache Spark per una migliore comprensione del funzionamento del processo AWS Glue. Puoi utilizzare la funzionalità AWS Glue Job Run Insights per comprendere in dettaglio il comportamento del processo durante l'esecuzione.

Per attivare le metriche, completa una delle seguenti operazioni.

Dalla console AWS Glue

  1. Apri la console AWS Glue.
  2. Nel pannello di navigazione, scegli ETL Jobs (Processi ETL).
  3. Seleziona il processo per il quale desideri attivare le metriche.
  4. Scegli Operazione, quindi scegli Edit job ( Modifica processo).
  5. Nella scheda job Details (Dettagli del processo), in Advanced options (Opzioni avanzate, scegli Job metrics (Metriche del processo), Job observability metrics (Metriche di osservabilità del processo), Continuous logging (Registrazione continua) e Spark UI (Interfaccia utente Spark).
  6. Scegli Salva.

**Da CLI o SDK **

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Dalle chiamate API o da CLI, passa i seguenti parametri nel parametro DefaultArguments.

'--enable-metrics' : 'true'
'--enable-observability-metrics' : 'true'
'--enable-continuous-cloudwatch-log' : 'true'
'--enable-spark-ui' : 'true'
'--spark-event-logs-path' : '<s3://path/to/log/>'

Identifica i colli di bottiglia

Per individuare i colli di bottiglia, utilizza i log dei driver di CloudWatch generati dall'esecuzione del processo o utilizza i log dell'interfaccia utente di Spark. AWS Glue 3.0 e versioni successive sono in grado di gestire le unioni asimmetriche con funzionalità native di Spark come l'esecuzione adattiva delle query (AQE). Per ulteriori informazioni, consulta Web UI (Interfaccia utente web) sul sito web di Apache.

Log dei driver

Per controllare i log dei driver:

  1. Apri il processo dalla console AWS Glue.
  2. Nella scheda Runs (Esecuzioni), seleziona l'esecuzione del processo per il quale desideri controllare i log.
  3. Nel gruppo di log di CloudWatch /aws-glue/jobs/error, seleziona il flusso di log con lo stesso nome dell'ID di esecuzione del processo per il quale hai aperto i log. Cerca i flussi che hanno nomi con suffisso "_g-xxxxxx": sono i log degli esecutori.
  4. Nei log dei driver, controlla le attività che vengono eseguite a lungo prima di essere completate. Nell'esempio seguente, un'attività è stata eseguita per 34 minuti e il processo Spark per cui è stata creata è stato completato in 35 minuti.
    2024-09-13 10:06:13,847 INFO [task-result-getter-0] scheduler.TaskSetManager (Logging.scala:logInfo(61)): Finished task 0.0 in stage 0.0 (TID 0) in 2054673 ms on 172.35.184.56 (executor 1) (1/1)
    2024-09-13 10:06:13,894 INFO [Thread-13] scheduler.DAGScheduler (Logging.scala:logInfo(61)): Job 0 finished: save at DataSink.scala:666, took 2164.67 s

Log dell'interfaccia utente Spark

Nei log dell'interfaccia utente Spark, nelle schede Jobs (Processi) e Stages (Fasi), cerca le fasi e le attività che sono state eseguite per molto tempo.

Risolvi i colli di bottiglia

Partiziona i dati in modo più efficiente. I processi AWS Glue si basano sull'elaborazione distribuita. Se i dati non vengono partizionati in modo efficiente, i worker di Spark potrebbero dover elaborare partizioni grandi e sbilanciate. Questo tempo di elaborazione causa ritardi. Per controllare il numero di partizioni, utilizza le funzioni repartition () o coalesce () in Spark. Assicurati che i tuoi dati siano ben partizionati per sfruttare la natura distribuita di Spark. Puoi anche configurare AWS Glue DynamicFrame per partizionare i dati con SplitFields o chiavi di partizione personalizzate.

Aumenta la capacità aggiungendo nodi di worker. Se non ci sono abbastanza nodi di worker per gestire il volume di dati, il processo viene eseguito lentamente a causa del parallelismo limitato. Aumenta il numero di nodi di worker o passa a un tipo di worker più grande. Assicurati di utilizzare la giusta dimensione di worker e di aver allocato un numero sufficiente di DPU (unità di elaborazione dati) per elaborare i tuoi dati in modo efficiente. Il numero di attività gestite per esecutore è pari a quattro volte il numero di DPU. Ad esempio, un tipo di worker G.1X ha una DPU e gestisce quattro attività per esecutore. Tieni presente che i tipi di worker G.4X e G.8X sono disponibili solo per i processi Spark ETL di AWS Glue versione 3.0 o successiva.

Ridistribuisci i dati per ridurre l'asimmetria tra le partizioni. L'asimmetria dei dati si verifica quando le partizioni hanno quantità di dati significativamente diverse. I nodi con più dati sono sovraccarichi mentre gli altri sono inattivi. Identifica le chiavi asimmetriche analizzando la distribuzione dei dati. Ridistribuisci o bilancia i dati tra le partizioni oppure utilizza la tecnica del salting per distribuire le chiavi sovrautilizzate. AWS Glue 3.0 e versioni successive sono in grado di gestire le unioni asimmetriche con funzionalità native di Spark come l'esecuzione adattiva delle query (AQE) sul sito web di Apache. Per questo, attiva l'esecuzione adattiva delle query (AQE) e imposta spark.sql.adaptive.skewJoin.enabled su true. La funzionalità AQE è attivata per impostazione predefinita dalla versione Spark 3.2.0. Per attivare AQE per Glue 3.0, aggiungi un parametro spark.sql.adaptive.enabled e impostalo su true.

Sostituisci le funzioni personalizzate definite dall’utente (UDF) con le funzioni native di Spark. Le UDF o le trasformazioni complesse possono essere costose da eseguire e possono rallentare i processi di Spark. Evita le UDF quando possibile e affidati alle funzioni native di Spark ottimizzate per le prestazioni. Se le UDF sono necessarie, riscrivile in Scala anziché in Python perché le UDF Scala spesso hanno prestazioni migliori. Inoltre, per un'ulteriore ottimizzazione, applica le trasformazioni utilizzando DataFrames o DynamicFrames.

Riduci al minimo le operazioni di mescolamento. Le operazioni di mescolamento, come groupBy, join o orderBy, trasferiscono i dati da un nodo all’altro. I nodi possono diventare colli di bottiglia se utilizzati in modo eccessivo o se non gestiti correttamente. Riduci al minimo le operazioni di mescolamento filtrando e aggregando i dati il prima possibile nel processo di trasformazione. Per evitare trasferimenti di dati non necessari, utilizzare le unioni di trasmissione ove applicabile. Inoltre, assicurati che i dati mescolati siano partizionati in modo efficiente.

Rimuovi la memorizzazione nella cache non necessaria. L'uso eccessivo o improprio della memorizzazione nella cache può comportare un aumento del consumo di memoria e rallentare il processo. Utilizza cache () o persist () solo quando riutilizzi un set di dati più volte in un flusso di lavoro. Annota la memoria disponibile e cancella tutti i set di dati memorizzati nella cache con unpersist () quando non sono più necessari.

Suddividi le lunghe catene di dipendenza. Se il tuo processo ha una lunga catena di trasformazioni, Spark ricalcola l'intera catena di dipendenze. Queste azioni possono rallentare l'elaborazione. Suddividi i processi complessi in attività più piccole. Se necessario, rendi persistenti i risultati intermedi. Ciò riduce il sovraccarico di ricalcolo e consente di eseguire il debug e monitorare le prestazioni di ogni passaggio individualmente.

Riduci la latenza di rete e le operazioni di I/O. La lettura e la scrittura di dati su fonti esterne come Amazon Simple Storage Service (Amazon S3), Amazon Relational Database Service (Amazon RDS) o Amazon Redshift possono introdurre latenza, soprattutto con set di dati di grandi dimensioni. Utilizza i connettori integrati di AWS Glue. Archivia i dati in un formato che supporta letture e scritture più veloci, come Parquet o ORC. Attiva S3 Transfer Acceleration per ottenere velocità di trasferimento dati più elevate e utilizza AWS Glue Data Catalog per ottimizzare il recupero dei metadati.

Ottimizza le operazioni native. Le operazioni native di Glue, inclusi i segnalibri dei processi e i connettori di esportazione DynamoDB, possono aumentare i tempi di esecuzione di un processo AWS Glue. Per controllare i runtime, identifica nei log dei driver quando è iniziato il processo AWS Glue e quando è terminala l'aggiunta dei segnalibri ai processi o l'esportazione da DynamoDB. Per DynamoDB, verifica la presenza di messaggi simili all'esempio seguente:

2024-08-24 03:33:37.000Z connections.DynamoExportConnection (DynamoExportConnection.scala:dynamodbexport(129)): Dynamodb Export complete...exported 712948751 item(s) or 4859215204353 byte(s)

Riduci l'effetto dei segnalibri dei processi

  • Per ridurre il numero di file scansionati, consolida i file di piccole dimensioni in file più grandi.
  • Rimuovi le partizioni in una posizione di archivio quando l'elaborazione è già stata completata.
  • Utilizza strategie di partizione efficienti in modo che AWS Glue possa saltare intere partizioni che non sono state modificate.
  • Per filtrare i dati in anticipo, utilizza i predicati pushdown.
  • Disattiva temporaneamente i segnalibri dei processi se non aggiungono valore al processo.

Riduci l'effetto dei connettori DynamoDB

  • Quando possibile, riduci il volume dei dati esportati.
  • Per identificare i problemi che causano ritardi nell'esportazione, monitora DynamoDB e AWS Glue.
  • Per velocizzare i tempi di esportazione, ottimizza le configurazioni delle tabelle DynamoDB.
  • Ove possibile, esporta i dati al di fuori del processo principale o modifica le pianificazioni per evitare colli di bottiglia.

Informazioni correlate

Utilizzo dei parametri di processo nei processi AWS Glue

Monitoraggio dei processi tramite l'interfaccia utente web di Apache Spark

Monitoraggio per la pianificazione della capacità DPU

AWS UFFICIALE
AWS UFFICIALEAggiornata 4 mesi fa