Come posso risolvere l'errore "No space left on device" in un processo ETL di AWS Glue?

6 minuti di lettura
0

Voglio evitare di ricevere l'errore "No space left on device" quando eseguo un processo ETL di AWS Glue.

Breve descrizione

Potresti ricevere i seguenti tipi di errori quando esegui un processo di estrazione, trasformazione e caricamento (ETL) di AWS Glue:

  • Job aborted due to stage failure: Task 68 in stage 158.0 failed 4 times, most recent failure: Attività 68.3 persa nella fase 158.0 (TID 28820, 10.102.100.111, esecutore 17): org.apache.spark.memory.SparkOutOfMemoryError: errore durante la chiamata a spill() su org.apache.spark.shuffle.sort.ShuffleExternalSorter@55f6dabb: No space left on device

        -oppure-

  • Job aborted due to stage failure: ResultStage 7 has failed the maximum allowable number of times: 4. Most recent failure reason: org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 2

Apache Spark utilizza il disco locale sui lavoratori di AWS Glue per far fuoriuscire dalla memoria i dati che superano lo spazio heap definito dal parametro di configurazione spark.executor.memory.

Trasformazioni su vasta scala come groupByKey(), reduceByKey() e join() possono causare un mescolamento. Durante la fase di ordinamento o mescolamento del processo, Spark scrive i dati intermedi su un disco locale prima di poterli scambiare tra i diversi lavoratori. A questo punto, potresti ricevere un errore “No space left on device“ o un errore MetadataFetchFailedException. Spark genera questo errore quando non c'è abbastanza spazio su disco sull'esecutore e non c'è alcun ripristino.

Risoluzione

Questi tipi di errori si verificano in genere quando il processo di elaborazione rileva una inclinazione significativa nel set di dati. Questa sezione elenca alcune delle anomalie più comuni di monitoraggio e debug e i modi in cui è possibile risolverle.

Le metriche dei processi di AWS Glue e l'interfaccia utente di Apache Spark sono potenti strumenti per monitorare l'inclinazione dei dati negli esecutori di Apache Spark. Monitorando la tempistica di implementazione, lo strumento consente di identificare facilmente eventuali problemi che potrebbero causare una inclinazione dei dati. Ti aiuta a comprendere nel dettaglio il comportamento di ogni fase, attività, processo ed esecutore.

Disaggregazione del calcolo e dell'archiviazione

Questo approccio dimensiona l'archiviazione per le operazioni di mescolamento di grandi dimensioni invece di scrivere i dati sul disco locale dei lavoratori di AWS Glue.

Utilizza l'archiviazione serverless dedicata: AWS Glue 2.0 o versioni successive consente di utilizzare Amazon Simple Storage Service (Amazon S3) per archiviare i dati mescolati e fuoriusciti di Spark.

AWS Glue 2.0 Utilizza i seguenti parametri del processo per utilizzare il mescolamento di Amazon S3 in AWS Glue. Per ulteriori informazioni, consulta Plugin AWS Glue Spark shuffle con Amazon S3.

  • Chiave: --write-shuffle-files-to-s3
    Valore: TRUE
  • Chiave: --write-shuffle-spills-to-s3
    Valore: TRUE
  • Chiave: --conf
    Valore: spark.shuffle.glue.s3ShuffleBucket=s3://custom_shuffle_bucket
    Nota: Il flag facoltativo spark.shuffle.glue.s3ShuffleBucket specifica il bucket Amazon S3 in cui vengono scritti i file mescolati. Sostituisci custom_shuffle_bucket con il nome del tuo bucket S3.

AWS Glue 3.0/4.0 Utilizza i seguenti parametri del processo per usare il plugin Cloud Shuffle Storage per Apache Spark. Per ulteriori informazioni, consulta Plugin di archiviazione Cloud Shuffle per Apache Spark.

  • Chiave: --write-shuffle-files-to-s3
    Valore: TRUE
  • Chiave: --conf
    Valore: spark.shuffle.storage.path=s3://custom_shuffle_bucket
    Nota: Il flag facoltativo spark.shuffle.storage.path specifica il bucket Amazon S3 in cui vengono scritti i file mescolati. Sostituisci custom_shuffle_bucket con il nome del tuo bucket S3.

Impiego della scalabilità orizzontale

La scalabilità orizzontale si riferisce all'aumento del numero di lavoratori tramite il dimensionamento orizzontale o all'aggiornamento del tipo di lavoratore tramite il dimensionamento verticale. Tuttavia, la scalabilità orizzontale potrebbe non funzionare sempre, soprattutto se i dati sono fortemente inclinati su alcune chiavi. Per ovviare all'inclinazione dei dati, valuta la possibilità di modificare la logica dell'applicazione Apache Spark implementando la tecnica di salting.

Riduzione e filtraggio dei dati di input

Prefiltra il più possibile i dati di input per ridurre al minimo il mescolamento dei dati e l'utilizzo della rete durante operazioni su vasta scala. Utilizza le seguenti tecniche per un filtraggio efficace dei dati:

Trasmissione di tabelle piccole

L'unione delle tabelle in Apache Spark può innescare il mescolamento e lo spostamento di enormi quantità di dati tra gli esecutori di diversi lavoratori. Ciò può causare l'esaurimento della memoria del sistema e la fuoriuscita dei dati nel disco del lavoratore. Per ridurre al minimo il sovraccarico della rete, Spark supporta l'utilizzo di tabelle più piccole per la trasmissione. Queste tabelle non superano le decine di MB (megabyte) e impediscono il partizionamento e il mescolamento dei dati. Utilizza una tabella più piccola per la trasmissione fornendo un suggerimento a Spark. Per ulteriori informazioni, consulta Trasmissione di tabelle piccole nel Blog AWS Ottimizzare la gestione della memoria in AWS Glue.

Utilizzo di AQE

AQE (Adaptive Query Execution) di Databricks è una tecnica di ottimizzazione in Spark SQL. Utilizza le statistiche di runtime per scegliere il piano di implementazione delle query più efficiente risolvendo l'inclinazione dei dati e il mescolamento dinamico delle partizioni in ogni fase. AQE è disponibile per impostazione predefinita in AWS Glue 3.0/4.0.

AQE svolge le seguenti funzioni:

  • Fonde dinamicamente le partizioni mescolate
    Fonde automaticamente le partizioni, se necessario, dopo ogni fase di query e risolve i problemi di gestione delle partizioni. Per ulteriori informazioni, consulta Fusione dinamica delle partizioni mescolate in Adaptive Query Execution: accelerare Spark SQL in fase di runtime sul sito Web di Databricks.
    –Troppe poche partizioni: Divide automaticamente le partizioni con dati in eccesso che causano una fuoriuscita nel disco locale.
    –Troppe partizioni: Combina automaticamente le partizioni, se necessario. Le partizioni vengono combinate quando le dimensioni dei dati di ciascuna di esse sono ridotte e richiedono piccoli recuperi di dati di rete per leggere i blocchi mescolati.

  • Cambia in modo dinamico le strategie di unione
    Converte Sort-Merge in Broadcast Hash Join, in base alle statistiche sulle dimensioni della tabella in ogni fase.

  • Ottimizza dinamicamente le unioni inclinate
    Rileva e ottimizza automaticamente le unioni inclinate nelle statistiche dei file mescolati. AQE divide le partizioni inclinate in sottopartizioni più piccole. Quindi, unisce queste partizioni più piccole alla partizione corrispondente nell'altro nodo. Per ulteriori informazioni, consulta Ottimizzazione dinamica delle unioni inclinate in Adaptive Query Execution: accelerare Spark SQL in fase di runtime sul sito Web di Databricks.

Configurazione di AQE

Utilizza i seguenti parametri del processo per attivare AQE:

  • Chiave: --conf
    Valore: spark.sql.adaptive.enabled=true --conf spark.sql.adaptive.coalescePartitions.enabled=true --conf spark.sql.adaptive.skewJoin.enabled=true
AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa