

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
<a name="emr-spark-configure"></a>

Puoi configurare [Spark su Amazon EMR](https://aws.amazon.com/elasticmapreduce/details/spark/) con le classificazioni di configurazione. Per ulteriori informazioni sulle classificazioni di configurazione, consulta [Configurazione delle applicazioni](emr-configure-apps.md).

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`](#emr-spark-maximizeresourceallocation).
+ **`spark-defaults`**: imposta valori nel file `spark-defaults.conf`. Per ulteriori informazioni, consulta [Spark configuration (Configurazione di Spark)](https://spark.apache.org/docs/latest/configuration.html) nella documentazione di Spark.
+ **`spark-env`**: imposta valori nel file `spark-env.sh`. Per ulteriori informazioni, consulta [Environment variables (Variabili di ambiente)](https://spark.apache.org/docs/latest/configuration.html#environment-variables) 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](https://github.com/apache/spark/blob/branch-3.2/conf/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](https://github.com/apache/spark/blob/v3.3.0/conf/log4j2.properties.template) su Github.
+ **`spark-metrics`**: imposta valori nel file `metrics.properties`. Per impostazioni e ulteriori informazioni, consulta il file [metrics.properties.template](https://github.com/apache/spark/blob/master/conf/metrics.properties.template) su Github e la sezione relativa ai [parametri](https://spark.apache.org/docs/latest/monitoring.html#metrics) 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](#spark-defaults) prima di aggiungere configurazioni personalizzate. La maggior parte dei clienti vede prestazioni migliorate con le nostre impostazioni di default.

**Topics**
+ [Valori di default di Spark impostati da Amazon EMR](#spark-defaults)
+ [Configurazione della garbage collection di Spark su Amazon EMR 6.1.0](#spark-gc-config)
+ [Uso di `maximizeResourceAllocation`](#emr-spark-maximizeresourceallocation)
+ [Configurazione del comportamento di disattivazione di nodi](#spark-decommissioning)
+ [Variabile d'ambiente Spark ThriftServer](#spark-thriftserver)
+ [Modifica delle impostazioni di default di Spark](#spark-change-defaults)
+ [Migrazione da Apache Log4j 1.x a Log4j 2.x](#spark-migrate-logj42)

## Valori di default di Spark impostati da Amazon EMR
<a name="spark-defaults"></a>

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 | Description | 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)  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.  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
<a name="spark-gc-config"></a>

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](https://spark.apache.org/docs/latest/configuration.html#application-properties). 

## Uso di `maximizeResourceAllocation`
<a name="emr-spark-maximizeresourceallocation"></a>

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 dovresti usare l'`maximizeResourceAllocation`opzione sui 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 | Description | Valore | 
| --- | --- | --- | 
| spark.default.parallelism | Il numero predefinito di partizioni RDDs viene restituito da trasformazioni come join e parallelize quando non è impostato 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
<a name="spark-decommissioning"></a>

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 | Description | 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
<a name="spark-thriftserver"></a>

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
<a name="spark-change-defaults"></a>

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.12.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/amzn-s3-demo-bucket/myfolder/myConfig.json
  ```
**Nota**  
I caratteri di continuazione della riga Linux (\$1) 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](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in).

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

1. Scegliere **Spark**. 

1. 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]
   ```

1. 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 file`myConfig.json`, archiviato in Amazon S3.

  ```
  aws emr create-cluster --release-label emr-7.12.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/amzn-s3-demo-bucket/myfolder/myConfig.json
  ```
**Nota**  
I caratteri di continuazione della riga Linux (\$1) 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](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html).

## Migrazione da Apache Log4j 1.x a Log4j 2.x
<a name="spark-migrate-logj42"></a>

Le versioni [Apache Spark](https://aws.amazon.com/emr/features/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](https://logging.apache.org/log4j/2.x/manual/migration.html) e il [Modello Spark Log4j 2](https://github.com/apache/spark/blob/master/conf/log4j2.properties.template) 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](https://logging.apache.org/log4j/2.x/manual/migration.html). Inoltre, non è consigliabile utilizzare il metodo bridge Log4j 1.x per la conversione in Log4j 2.x. 