Perché il mio processo ETL di AWS Glue è in esecuzione da molto tempo?

Ultimo aggiornamento: 20/08/2021

Il mio processo AWS Glue è in esecuzione da molto tempo.

-oppure-

Il mio processo straggler di AWS Glue sta impiegando molto tempo per il completamento.

Breve descrizione

Alcuni dei motivi più comuni per cui il completamento dei processi AWS Glue richiede molto tempo sono i seguenti:

  • Set di dati di grandi dimensioni
  • Distribuzione non uniforme dei dati nei set di dati
  • Distribuzione irregolare dei processi tra gli esecutori
  • Provisioning insufficiente delle risorse

Risoluzione

Abilita i parametri

AWS Glue fornisce parametri di Amazon CloudWatch che possono essere utilizzati per fornire informazioni sugli esecutori e sulla quantità di operazioni di ciascun esecutore. Puoi abilitare i parametri di CloudWatch per il tuo processo AWS Glue eseguendo una delle seguenti operazioni:

Utilizzo di un parametro speciale: Aggiungi il seguente argomento al processo AWS Glue. Questo parametro consente di raccogliere i parametri per la profilazione del processo per l'esecuzione dello stesso. Questi parametri sono disponibili nella console di AWS Glue e nella console di CloudWatch.

Key: --enable-metrics

Utilizzo della console di AWS Glue: Per abilitare i parametri su un processo esistente, esegui le seguenti operazioni:

  1. Apri la console di AWS Glue.
  2. Nel pannello di navigazione, seleziona Processi.
  3. Seleziona il processo per il quale desideri abilitare i parametri.
  4. Scegli Azione, quindi scegli Modifica processo.
  5. In Opzioni di monitoraggio, seleziona Parametri di processo.
  6. Scegli Salva.

Utilizzo dell'API: utilizza l'API di AWS Glue UpdateJob con --enable-metrics come parametro DefaultArguments per abilitare i parametri su un processo esistente.

Nota: AWS Glue 2.0 non utilizza YARN che riporta i parametri. Ciò significa che non è possibile ottenere alcuni dei parametri dell'esecutore, come numberMaxNeededExecutors e numberAllExecutor, per AWS Glue 2.0.

Abilita la registrazione continua

Se abiliti la registrazione continua nel tuo processo AWS Glue, i registri dei driver e degli esecutori in tempo reale vengono inoltrati a CloudWatch ogni cinque secondi. Con queste informazioni di registrazione in tempo reale, è possibile ottenere maggiori dettagli sul processo in esecuzione. Per ulteriori informazioni, consulta Abilitazione della registrazione continua per i processi AWS Glue.

Controlla i registri dei driver e degli esecutori

Nei registri dei driver, verifica la presenza di processi eseguiti a lungo prima del completamento. Ad esempio:

2021-04-15 10:53:54,484 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 10:53:54,484 INFO [task-result-getter-1] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 0.0 in stage 7.0 (TID 139) in 4538 ms on 10.117.101.76 (executor 10) (13/14)
...
2021-04-15 12:11:30,692 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 12:11:30,692 INFO [task-result-getter-3] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 13.0 in stage 7.0 (TID 152) in 4660742 ms on 10.117.97.97 (executor 11) (14/14)

In questi registri è possibile vedere che il completamento di un singolo processo ha richiesto 77 minuti. Utilizza queste informazioni per verificare il motivo per cui quel particolare processo sta impiegando molto tempo. È possibile farlo utilizzando l'interfaccia utente Web di Apache Spark. L'interfaccia utente di Spark fornisce informazioni ben strutturate per fasi, processi ed esecutori differenti.

Abilita l'interfaccia utente di Spark

È possibile utilizzare l'interfaccia utente di Spark per risolvere i problemi relativi ai processi Spark in esecuzione per molto tempo. Avviando il server della cronologia di Spark e abilitando i registri dell'interfaccia utente di Spark, puoi ottenere informazioni sulle fasi e sui processi. È possibile utilizzare i registri per scoprire come i processi vengono eseguiti dai worker. È possibile abilitare l'interfaccia utente di Spark utilizzando la console AWS Glue o la AWS Command Line Interface (AWS CLI). Per ulteriori informazioni, consulta Abilitazione dell'interfaccia utente Web di Apache Spark per i processi AWS Glue.

Una volta completato il processo, i registri dei driver potrebbero essere simili ai seguenti:

ERROR executionlogs:128 - example-task-id:example-timeframe INFO [pool-2-thread-1] s3n.MultipartUploadOutputStream (MultipartUploadOutputStream.java:close(414)): close closed:false s3://dox-example-bucket/spark-application-1626828545941.inprogress

Dopo aver analizzato i registri per il processo, è possibile avviare il server della cronologia Spark su un'istanza Amazon Elastic Compute Cloud (Amazon EC2) o utilizzando Docker. Apri l'interfaccia utente e passa alla scheda Esecutore per verificare se un particolare esecutore è in esecuzione per un periodo di tempo più lungo. In tal caso la distribuzione irregolare del lavoro e il sottoutilizzo delle risorse disponibili potrebbero essere causati da una distorsione dei dati nel set di dati. Nella scheda Fasi, è possibile ottenere ulteriori informazioni e statistiche sulle fasi che hanno richiesto molto tempo. È possibile trovare dettagli relativi al fatto che queste fasi abbiano comportato fughe casuali costose e dispendiose in termini di tempo.

Pianificazione della capacità per le unità di elaborazione dati (DPU)

Se tutti gli esecutori contribuiscono allo stesso modo al processo, ma il completamento richiede comunque molto tempo, valuta la possibilità di aggiungere altri worker al processo per migliorarne la velocità. La pianificazione della capacità della DPU può aiutarti a evitare quanto segue:

  • Un provisioning insufficiente che potrebbe comportare un rallentamento dei tempi di esecuzione
  • Un provisioning eccessivo che comporta costi più elevati, ma fornisce risultati nello stesso lasso di tempo

Dai parametri di CloudWatch è possibile ottenere informazioni sul numero di esecutori attualmente in uso e sul numero massimo di esecutori necessari. Il numero di DPU necessarie dipende dal numero di partizioni di input e dal tipo di worker richiesto.

Tieni presente quanto segue per la definizione del numero di partizioni di input:

  • Se i file Amazon Simple Storage Service (Amazon S3) non sono divisibili, il numero di partizioni è uguale al numero di file di input.
  • Se i file Amazon S3 sono divisibili e i dati non sono strutturati o sono semi-strutturati, il numero di partizioni è uguale alla dimensione totale del file / 64 MB. Se la dimensione di ogni file è inferiore a 64 MB, il numero di partizioni è uguale al numero di file.
  • Se i file Amazon S3 sono divisibili e i dati strutturati, il numero di partizioni è uguale alla dimensione totale del file / 128 MB.

Per calcolare il numero ottimale di DPU, esegui le seguenti operazioni:

Ad esempio, supponiamo che il numero di partizioni di input sia 428. Quindi, è possibile calcolare il numero ottimale di DPU con la seguente formula:

Numero massimo di esecutori necessari = Numero di partizioni di input / Numero di processi per esecutore = 428/4 = 107

Tieni presente quanto segue:

  • Il tipo di worker Standard supporta 4 processi per esecutore
  • G.1X supporta 8 processi per esecutore
  • G.2X supporta 16 processi per esecutore

Il tipo di worker standard ha due esecutori, incluso un driver, in un nodo. Uno di questi esecutori è un driver in Spark. Pertanto sono necessari 108 esecutori.

Il numero di DPU necessarie = (numero di esecutori / numero di esecutori per nodo) + 1 DPU = (108/2) + 1 = 55.