Salta al contenuto

Perché il mio processo Spark o Hive in Amazon EMR ha esito negativo con un errore HTTP 503 "Slow Down" AmazonS3Exception?

4 minuti di lettura
0

Il mio processo Apache Spark o Apache Hive in Amazon EMR ha esito negativo con un'errore HTTP 503 "Slow Down" AmazonS3Exception.

Breve descrizione

Quando la frequenza di richieste di Amazon Simple Storage Service (Amazon S3) all'applicazione supera i valori normalmente sostenuti e Amazon S3 ottimizza internamente le prestazioni, ricevi il seguente errore:

"java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Slow Down (Service: Amazon S3; Status Code: 503; Error Code: 503 Slow Down; Request ID: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE="

Risoluzione

Configura le metriche delle richieste in CloudWatch

Per capire se il problema riguarda un numero eccessivo di richieste, è consigliabile configurare in Amazon CloudWatch le metriche delle richieste per il bucket Amazon S3.

Attiva in CloudWatch le metriche delle richieste per il bucket e definisci un filtro per il prefisso.

Modifica la strategia di ripetizione per le richieste ad Amazon S3

Per impostazione predefinita, il file system EMR (EMRFS) utilizza una strategia di backoff esponenziale per ritentare le richieste ad Amazon S3. Il limite predefinito di tentativi di EMRFS è 15. Tuttavia, è possibile aumentare il limite di tentativi su un nuovo cluster, su un cluster in esecuzione o in fase di runtime dell'applicazione.

Per aumentare il limite di tentativi, modifica il valore del parametro fs.s3.maxRetries.

Nota: se imposti un valore molto alto per questo parametro, potresti riscontrare una maggiore durata del processo.

Imposta il parametro su un valore elevato, ad esempio 20, e monitora il sovraccarico dei processi in termini di durata. Quindi regola il parametro in base al caso d'uso.

Per un nuovo cluster, puoi aggiungere un oggetto configurazione simile al seguente quando avvii il cluster:

[
    {
        "Classification": "emrfs-site",
        "Properties": {
            "fs.s3.maxRetries": "20"
        }
    }
]

Dopo aver avviato il cluster, le applicazioni Spark e Hive eseguite in Amazon EMR utilizzano il nuovo limite.

Per aumentare il limite di tentativi per un cluster in esecuzione, completa i seguenti passaggi:

  1. Apri la console Amazon EMR.
  2. Scegli il cluster attivo che desideri riconfigurare.
  3. Scegli la scheda Configurazione.
  4. Nell'elenco a discesa Filtro, seleziona il gruppo di istanze che desideri riconfigurare.
  5. Nell'elenco a discesa Riconfigura, scegli Modifica nella tabella.
  6. Nella tabella di classificazione della configurazione, scegli Aggiungi configurazione, quindi utilizza i seguenti valori:
    Per Classificazione, utilizza emrfs-site
    Per Proprietà, utilizza fs.s3.maxRetries
    Per Valore, utilizza il nuovo valore per il limite di tentativi. Ad esempio 20.
  7. Seleziona Apply this configuration to all active instance groups (Applica questa configurazione a tutti i gruppi di istanze attivi).
  8. Scegli Salva modifiche.

Dopo la distribuzione della configurazione, le applicazioni Spark e Hive utilizzano il nuovo limite.

Per aumentare il limite di tentativi in fase di esecuzione per un'applicazione Spark, utilizza una sessione di shell Spark per modificare il parametro fs.s3.maxRetries in modo simile all'esempio seguente:

spark> sc.hadoopConfiguration.set("fs.s3.maxRetries", "20")
spark> val source_df = spark.read.csv("s3://awsexamplebucket/data/")  
spark> source_df.write.save("s3://awsexamplebucket2/output/")

Per aumentare il limite di tentativi in fase di esecuzione per un'applicazione Hive, esegui un comando simile al seguente esempio:

hive> set fs.s3.maxRetries=20;  
hive> select ....

Regola il numero di richieste concorrenti ad Amazon S3

  • Se hai più processi (Spark, Apache Hive o s-dist-cp) che leggono e scrivono sullo stesso prefisso Amazon S3, puoi regolare la concorrenza. Inizia con i processi di lettura/scrittura più impegnativi e riduci la concorrenza per evitare un parallelismo eccessivo.
    Nota: se hai configurato l'accesso tra account per Amazon S3, anche altri account AWS potrebbero inviare processi con lo stesso prefisso.
  • Se visualizzi errori quando il processo tenta di scrivere nel bucket di destinazione, riduci l'eccessivo parallelismo di scrittura. Ad esempio, utilizza le operazioni Spark .coalesce() o .repartition() per ridurre il numero di partizioni di output di Spark prima di scrivere su Amazon S3. Puoi inoltre ridurre il numero di core per esecutore o il numero di esecutori.
  • Se visualizzi errori quando il processo tenta di leggere dal bucket di origine, regola la dimensione degli oggetti. Per ridurre il numero di oggetti letti dal processo, aggrega gli oggetti più piccoli a quelli più grandi. Ad esempio, utilizza s3-dist-cp per unire un numero elevato di file di piccole dimensioni in un numero minore di file di grandi dimensioni.

Informazioni correlate

Modelli di progettazione basati sulle best practice: ottimizzazione delle prestazioni di Amazon S3

Perché la mia applicazione Amazon EMR fallisce con un HTTP 403 “Access Denied” AmazonS3Exception?

Perché la mia applicazione Amazon EMR fallisce con un HTTP 404 “Not Found” AmazonS3Exception?

AWS UFFICIALEAggiornata 2 mesi fa