Configurazione di Spark - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurazione di Spark

Puoi configurare Spark su Amazon EMR con le classificazioni di configurazione. Per ulteriori informazioni sulle classificazioni di configurazione, consulta Configurazione delle applicazioni.

Le classificazioni di configurazione per Spark su Amazon EMR includono le seguenti:

  • spark: imposta la proprietà maximizeResourceAllocation su true (vero) o false (falso). Se è true (vero), Amazon EMR configura automaticamente le proprietà spark-defaults in base alla configurazione hardware del cluster. Per ulteriori informazioni, consulta Uso di maximizeResourceAllocation.

  • spark-defaults: imposta valori nel file spark-defaults.conf. Per ulteriori informazioni, consulta Spark configuration (Configurazione di Spark) nella documentazione di Spark.

  • spark-env: imposta valori nel file spark-env.sh. Per ulteriori informazioni, consulta Environment variables (Variabili di ambiente) nella documentazione di Spark.

  • spark-hive-site: imposta valori nel file hive-site.xml per Spark.

  • spark-log4j— (Amazon EMR rilascia 6.7.x e versioni precedenti) Imposta i valori nel file log4j.properties. Per ulteriori informazioni, consulta il file log4j.properties.template su Github.

  • spark-log4j2— (Amazon EMR release 6.8.0 e successive) Imposta i valori nel file log4j2.properties. Per ulteriori informazioni, consulta il file log4j2.properties.template su Github.

  • spark-metrics: imposta valori nel file metrics.properties. Per impostazioni e ulteriori informazioni, consulta il file metrics.properties.template su Github e la sezione relativa ai parametri nella documentazione Spark.

Nota

Se effettui la migrazione dei carichi di lavoro Spark ad Amazon EMR da un'altra piattaforma, ti consigliamo di testare i carichi di lavoro con Valori di default di Spark impostati da Amazon EMR prima di aggiungere configurazioni personalizzate. La maggior parte dei clienti vede prestazioni migliorate con le nostre impostazioni di default.

Valori di default di Spark impostati da Amazon EMR

Nella tabella seguente viene mostrato in che modo Amazon EMR imposta i valori predefiniti in spark-defaults che influenzano le applicazioni.

Valori di default di Spark impostati da Amazon EMR
Impostazione Descrizione Valore predefinito
spark.executor.memory

La quantità di memoria da utilizzare per processo esecutore. Ad esempio, 1g, 2g.

Questa impostazione è determinata dai tipi di istanza principali e dell'attività presenti nel cluster.

spark.executor.cores

Il numero di core da utilizzare in ogni esecutore.

Questa impostazione è determinata dai tipi di istanza principali e dell'attività presenti nel cluster.

spark.dynamicAllocation.enabled

Se vero, utilizza l'assegnazione di risorse dinamiche, che dimensiona il numero di esecutori registrati con un'applicazione in base al carico di lavoro.

true (con Amazon EMR 4.4.0 e versioni successive)

Nota

Il servizio di mescolamento Spark è configurato automaticamente da Amazon EMR.

spark.sql.hive.advancedPartitionPredicatePushdown.enabled

Se vero, è abilitato il pushdown avanzato dei predicati di partizione nel metastore Hive.

true
spark.sql.hive.stringLikePartitionPredicatePushdown.enabled

Esegue il pushdown dei filtri startsWith, contains e endsWith nel metastore di Hive.

Nota

Glue non supporta il pushdown del predicato per startsWith, contains o endsWith. Se utilizzi il metastore Glue e riscontri errori dovuti al pushdown dei predicati per queste funzioni, imposta questa configurazione su false.

true

Configurazione della garbage collection di Spark su Amazon EMR 6.1.0

L'impostazione di configurazioni di garbage collection personalizzate con spark.driver.extraJavaOptions e spark.executor.extraJavaOptions genera un errore di avvio del driver o dell'executor con Amazon EMR 6.1 a causa di una configurazione di garbage collection in conflitto con Amazon EMR 6.1.0. Per Amazon EMR 6.1.0, la configurazione predefinita per la rimozione di oggetti inutili (garbage collection) viene impostata tramite spark.driver.defaultJavaOptions e spark.executor.defaultJavaOptions. Questa configurazione si applica solo ad Amazon EMR 6.1.0. Le opzioni JVM non correlate alla garbage collection, ad esempio quelle per la configurazione della registrazione (-verbose:class) possono comunque essere impostate tramite extraJavaOptions. Per ulteriori informazioni, consulta Proprietà dell'applicazione Spark.

Uso di maximizeResourceAllocation

Se desideri configurare gli executor per utilizzare la quantità massima delle risorse possibili in ogni nodo di un cluster, imposta maximizeResourceAllocation su true nella tua classificazione di configurazione spark. maximizeResourceAllocation è specifico per Amazon EMR. Quando abiliti maximizeResourceAllocation, Amazon EMR calcola le risorse di elaborazione e memoria massime per un esecutore su un'istanza nel gruppo di istanze principale. In seguito imposta le impostazioni spark-defaults corrispondenti in base ai valori massimi calcolati.

Amazon EMR calcola le risorse di calcolo e memoria massime disponibili per un executor in base a un tipo di istanza del parco istanze principale. Poiché ogni flotta di istanze può avere tipi e dimensioni diverse all'interno di un parco istanze, la configurazione degli esecutori utilizzata da Amazon EMR potrebbe non essere la migliore per i tuoi cluster, quindi non consigliamo di utilizzare le impostazioni predefinite quando utilizzi l'allocazione massima delle risorse. Configura impostazioni personalizzate per i cluster della tua flotta di istanze.

Nota

Non è consigliabile utilizzare l'opzione maximizeResourceAllocation su cluster con altre applicazioni distribuite come HBase. Amazon EMR utilizza configurazioni YARN personalizzate per applicazioni distribuite, che possono entrare in conflitto con maximizeResourceAllocation e causare un funzionamento non corretto delle applicazioni Spark.

Di seguito è riportato un esempio di classificazione della configurazione Spark con maximizeResourceAllocation impostato su true.

[ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
Impostazioni configurate in spark-defaults quando maximizeResourceAllocation è abilitata
Impostazione Descrizione Valore
spark.default.parallelism Numero predefinito di partizioni in RDD restituite da trasformazioni come join e parallelizzazione se non impostate dall'utente. reduceByKey

2X numero di core CPU disponibili per i container YARN.

spark.driver.memory Quantità di memoria da utilizzare per il processo del driver, ad esempio dove viene inizializzato. SparkContext (ad esempio, 1g, 2g).

L'impostazione è configurata in base ai tipi di istanza nel cluster. Tuttavia, dato che l'applicazione del driver di Spark può essere eseguita sull'istanza primaria o su una delle istanze core (ad esempio, rispettivamente in modalità cluster e client YARN), l'impostazione è definita in base al tipo di istanza più piccolo in questi due gruppi di istanze.

spark.executor.memory Quantità di memoria da utilizzare per processo esecutore, ad esempio 1g, 2g

L'impostazione è configurata in base ai tipi di istanza principale e di attività nel cluster.

spark.executor.cores Il numero di core da utilizzare in ogni esecutore. L'impostazione è configurata in base ai tipi di istanza principale e di attività nel cluster.
spark.executor.instances Il numero di esecutori.

L'impostazione è configurata in base ai tipi di istanza principale e di attività nel cluster. Da impostare, a meno che spark.dynamicAllocation.enabled sia esplicitamente impostato su true nello stesso tempo.

Configurazione del comportamento di disattivazione di nodi

Quando si utilizza Amazon EMR versioni 5.9.0 o successive, Spark su Amazon EMR include un set di funzionalità che consentono a Spark di gestire normalmente la terminazione dei nodi dovuta a un ridimensionamento manuale o alla richiesta di una policy di dimensionamento automatico. Amazon EMR implementa un meccanismo di elenco rifiutati in Spark basato sul meccanismo di disattivazione di YARN. Questo meccanismo contribuisce a garantire che nessuna nuova attività sia programmata su un nodo che sarà disattivato, consentendo nel contempo il completamento delle attività in esecuzione. Sono inoltre disponibili caratteristiche che consentono un recupero più rapido dei processi Spark in caso di perdita di blocchi shuffle durante la terminazione di un nodo. Il processo di ricalcolo viene attivato prima e ottimizzato per essere realizzato più rapidamente con un minor numero di tentativi di fase; inoltre, è possibile evitare errori nei processi dovuti a problemi di recupero causati da blocchi shuffle mancanti.

Importante

Ad Amazon EMR rilascio 5.11.0 è stata aggiunta l'impostazione spark.decommissioning.timeout.threshold per migliorare la resilienza di Spark quando si utilizzano istanze spot. Nei rilasci precedenti, quando un nodo utilizza un'istanza spot e l'istanza viene terminata a causa del prezzo dell'offerta, è possibile che Spark non riesca a gestire normalmente la terminazione. I processi possono non riuscire e i ricalcoli shuffle possono richiedere una notevole quantità di tempo. Per questo motivo, consigliamo di utilizzare il rilascio 5.11.0 o successivi in caso di impiego delle istanze spot.

Impostazioni di disattivazione di nodi Spark
Impostazione Descrizione Valore predefinito

spark.blacklist.decommissioning.enabled

Quando il valore è true, Spark elenca come negati i nodi il cui è stato è decommissioning in YARN. Spark non pianifica nuove attività su esecutori attivi su quel nodo, ma consente il completamento delle attività già in esecuzione.

true

spark.blacklist.decommissioning.timeout

Il periodo di tempo durante il quale un nodo il cui stato è decommissioning rimane elencato come negato Per impostazione predefinita, questo valore è impostato su un'ora, che è anche l'impostazione predefinita di yarn.resourcemanager.decommissioning.timeout. Per garantire che un nodo sia elencato come negato per l'intero periodo di disattivazione, impostare un valore uguale o superiore a yarn.resourcemanager.decommissioning.timeout. Alla scadenza del timeout di disattivazione, lo stato del nodo diventa decommissioned e Amazon EMR può terminare l'istanza EC2 del nodo. Se una o più attività sono ancora in esecuzione dopo la scadenza del timeout, sono perse oppure terminate e riprogrammate su esecutori attivi su altri nodi.

1h

spark.decommissioning.timeout.threshold

Disponibile in Amazon EMR rilascio 5.11.0 o successivi. Specificata in secondi. Quando lo stato del nodo diventa "decommissioning" (in disattivazione), se l'host viene disattivato entro un periodo di tempo uguale o inferiore a questo valore, Amazon EMR elenca il nodo come negato e pulisce lo stato dell'host (come specificato da spark.resourceManager.cleanupExpiredHost) senza attendere che lo stato del nodo diventi disattivato. Ciò consente a Spark di gestire meglio le terminazioni delle istanze Spot in quanto la disattivazione di tali istanze avviene entro un timeout di 20 secondi indipendentemente dal valore di yarn.resourcemager.decommissioning.timeout, che potrebbe non fornire agli altri nodi tempo sufficiente per leggere i file di shuffle.

20s

spark.resourceManager.cleanupExpiredHost

Quando impostato su true, Spark annulla la registrazione di tutti i dati memorizzati nella cache e dei blocchi shuffle archiviati in esecutori sui nodi il cui stato è decommissioned. Questa operazione accelera il processo di ripristino.

true

spark.stage.attempt.ignoreOnDecommissionFetchFailure

Quando impostata su true, consente di evitare errori nelle fasi Spark e quindi nel processo dovuti a un numero elevato di recuperi non riusciti da nodi disattivati. I recuperi di blocchi shuffle non riusciti da un nodo il cui stato è decommissioned non sono contabilizzati nel numero massimo di errori di recupero consecutivi.

true

Variabile d'ambiente Spark ThriftServer

Spark imposta la variabile di ambiente relativa alla porta del server Hive Thrift, HIVE_SERVER2_THRIFT_PORT, su 10001.

Modifica delle impostazioni di default di Spark

Puoi modificare le impostazioni di default in spark-defaults.conf utilizzando la classificazione di configurazione spark-defaults o l'impostazione maximizeResourceAllocation nella classificazione di configurazione spark.

Le procedure seguenti mostrano come modificare le impostazioni utilizzando la CLI o la console.

Creazione di un cluster con spark.executor.memory impostato su 2g utilizzando la CLI
  • Crea un cluster con Spark installato e spark.executor.memory impostato su 2g, utilizzando il comando seguente che fa riferimento a un file, myConfig.json, archiviato in Amazon S3.

    aws emr create-cluster --release-label emr-7.1.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    Nota

    I caratteri di continuazione della riga Linux (\) sono inclusi per la leggibilità. Possono essere rimossi o utilizzati nei comandi Linux. Per Windows, rimuoverli o sostituirli con un accento circonflesso (^).

    myConfig.json:

    [ { "Classification": "spark-defaults", "Properties": { "spark.executor.memory": "2G" } } ]
Creazione di un cluster con spark.executor.memory impostato su 2g mediante la console
  1. Passa alla nuova console Amazon EMR e seleziona Passa alla vecchia console dalla barra di navigazione laterale. Per ulteriori informazioni su cosa aspettarti quando passi alla vecchia console, consulta Utilizzo della vecchia console.

  2. Seleziona Create cluster (Crea cluster), Go to advanced options (Vai alle opzioni avanzate).

  3. Scegliere Spark.

  4. In Edit software settings (Modifica impostazioni software), lasciare l'opzione Enter configuration (Immetti configurazione) selezionata e immettere la seguente configurazione:

    classification=spark-defaults,properties=[spark.executor.memory=2G]
  5. Seleziona le altre opzioni, scegli e in seguito Create cluster (Crea cluster).

Impostare maximizeResourceAllocation
  • Crea un cluster con Spark installato e maximizeResourceAllocation impostato su true utilizzando AWS CLI, facendo riferimento a un filemyConfig.json, archiviato in Amazon S3.

    aws emr create-cluster --release-label emr-7.1.0 --applications Name=Spark \ --instance-type m5.xlarge --instance-count 2 --service-role EMR_DefaultRole_V2 --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json
    Nota

    I caratteri di continuazione della riga Linux (\) sono inclusi per questioni di leggibilità. Possono essere rimossi o utilizzati nei comandi Linux. Per Windows, rimuoverli o sostituirli con un accento circonflesso (^).

    myConfig.json:

    [ { "Classification": "spark", "Properties": { "maximizeResourceAllocation": "true" } } ]
Nota

Con Amazon EMR versione 5.21.0 e successive, puoi sovrascrivere le configurazioni del cluster e specificare classificazioni di configurazione aggiuntive per ogni gruppo di istanze in un cluster in esecuzione. A tale scopo, puoi utilizzare la console Amazon EMR, AWS Command Line Interface (AWS CLI) o l' AWS SDK. Per ulteriori informazioni, consulta Specifica di una configurazione per un gruppo di istanze in un cluster in esecuzione.

Migrazione da Apache Log4j 1.x a Log4j 2.x

Le versioni Apache Spark 3.2.x e precedenti utilizzano la versione precedente di Apache Log4j 1.x e il file log4j.properties per configurare Log4j nei processi Spark. Le versioni 3.3.0 e successive di Apache Spark utilizzano Apache Log4j 2.x e il file log4j2.properties per configurare Log4j nei processi Spark.

Se hai configurato Apache Spark Log4j utilizzando una versione Amazon EMR precedente alla 6.8.0, devi rimuovere la classificazione della configurazione spark-log4j legacy e migrazione alla classificazione della configurazione spark-log4j2 e formato delle chiavi prima di poter effettuare l'aggiornamento ad Amazon EMR 6.8.0 o versione successiva. La classificazione spark-log4j legacy causa il fallimento della creazione del cluster con un errore ValidationException nel rilascio di Amazon EMR versione 6.8.0 e successive. Non ti verrà addebitato alcun costo per un guasto relativo all'incompatibilità di Log4j, ma devi rimuovere la classificazione della configurazione spark-log4j passata per continuare.

Per ulteriori informazioni sulla migrazione da Apache Log4j 1.x a Log4j 2.x, consulta Guida alla migrazione per Apache Log4j e il Modello Spark Log4j 2 su GitHub.

Nota

Con Amazon EMR, Apache Spark utilizza un file log4j2.properties anziché il file .xml descritto nella Guida alla migrazione per Apache Log4j. Inoltre, non è consigliabile utilizzare il metodo bridge Log4j 1.x per la conversione in Log4j 2.x.