

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Configurar Spark
<a name="emr-spark-configure"></a>

Puede configurar [Spark en Amazon EMR](https://aws.amazon.com/elasticmapreduce/details/spark/) con clasificaciones de configuración. Para obtener más información sobre cómo las clasificaciones de configuración, consulte [Configuración de aplicaciones](emr-configure-apps.md).

Entre las clasificaciones de configuración para Spark en Amazon EMR se incluyen los siguientes:
+ **`spark`**: establece la propiedad `maximizeResourceAllocation` en true o false. Si es true, Amazon EMR configura automáticamente las propiedades `spark-defaults` en función de la configuración de hardware del clúster. Para obtener más información, consulte [Uso de `maximizeResourceAllocation`](#emr-spark-maximizeresourceallocation).
+ **`spark-defaults`**: establece los valores del archivo `spark-defaults.conf`. Para obtener más información, consulte [Spark configuration](https://spark.apache.org/docs/latest/configuration.html) en la documentación de Spark.
+ **`spark-env`**: establece los valores del archivo `spark-env.sh`. Para obtener más información, consulte [Environment variables](https://spark.apache.org/docs/latest/configuration.html#environment-variables) en la documentación de Spark.
+ **`spark-hive-site`**: establece los valores del archivo `hive-site.xml` para Spark.
+ **`spark-log4j`**: (versión 6.7.x y anteriores de Amazon EMR) establece los valores del archivo `log4j.properties`. Para obtener más información, consulte el archivo [log4j.properties.template](https://github.com/apache/spark/blob/branch-3.2/conf/log4j.properties.template) en GitHub.
+ **`spark-log4j2`**: (versión 6.8.0 y posteriores de Amazon EMR) establece los valores del archivo `log4j2.properties`. Para obtener más información, consulte el archivo [log4j2.properties.template](https://github.com/apache/spark/blob/v3.3.0/conf/log4j2.properties.template) en GitHub.
+ **`spark-metrics`**: establece los valores del archivo `metrics.properties`. Para conocer la configuración y obtener más información, consulte el archivo [metrics.properties.template](https://github.com/apache/spark/blob/master/conf/metrics.properties.template) en GitHub y [Metrics](https://spark.apache.org/docs/latest/monitoring.html#metrics) en la documentación de Spark.

**nota**  
Si va a migrar cargas de trabajo de Spark a Amazon EMR desde otra plataforma, le recomendamos que pruebe las cargas de trabajo con los [Valores predeterminados de Spark establecidos por Amazon EMR](#spark-defaults) antes de agregar configuraciones personalizadas. La mayoría de los clientes observan mejoras de rendimiento con nuestra configuración predeterminada.

**Topics**
+ [Valores predeterminados de Spark establecidos por Amazon EMR](#spark-defaults)
+ [Configuración de la recopilación de elementos no utilizados de Spark en Amazon EMR 6.1.0](#spark-gc-config)
+ [Uso de `maximizeResourceAllocation`](#emr-spark-maximizeresourceallocation)
+ [Configuración del comportamiento de retirada de nodos](#spark-decommissioning)
+ [Variable de ThriftServer entorno Spark](#spark-thriftserver)
+ [Cambio de la configuración predeterminada de Spark](#spark-change-defaults)
+ [Migración de Apache Log4j 1.x a Log4j 2.x](#spark-migrate-logj42)

## Valores predeterminados de Spark establecidos por Amazon EMR
<a name="spark-defaults"></a>

En la siguiente tabla, se muestra cómo Amazon EMR establece valores los predeterminados en `spark-defaults` que afectan a las aplicaciones.


**Valores predeterminados de Spark establecidos por Amazon EMR**  

| Opción | Description (Descripción) | Predeterminado | 
| --- | --- | --- | 
| spark.executor.memory | Cantidad de memoria que utilizar por proceso de ejecutor. Por ejemplo: `1g`, `2g`. | Esta configuración se determina según los tipos de instancias principales y de tareas del clúster.  | 
| spark.executor.cores | El número de núcleos que se va a utilizar en cada ejecutor. | Esta configuración se determina según los tipos de instancias principales y de tareas del clúster. | 
| spark.dynamicAllocation.enabled | Si se establece en true, utilice la asignación de recursos dinámica para escalar y reducir verticalmente el número de ejecutores registrados en una aplicación en función de la carga de trabajo. | `true` (con la versión 4.4.0 y posteriores de Amazon EMR) Amazon EMR configura automáticamente Spark Shuffle Service.  | 
| spark.sql.hive.advancedPartitionPredicatePushdown.enabled | Si se establece en true, se habilita la inserción avanzada de predicados de particiones en el metaalmacén de Hive. | true | 
| spark.sql.hive.stringLikePartitionPredicatePushdown.enabled | Inserta los filtros `startsWith`, `contains` y `endsWith` en el metaalmacén de Hive. Glue no admite la inserción de predicados para `startsWith`, `contains` ni `endsWith`. Si utiliza el metaalmacén de Glue y detecta errores debido a la inserción de predicados para estas funciones, establezca esta configuración en `false`.  | true | 

## Configuración de la recopilación de elementos no utilizados de Spark en Amazon EMR 6.1.0
<a name="spark-gc-config"></a>

Al establecer configuraciones personalizadas de recopilación de elementos no utilizados con `spark.driver.extraJavaOptions` y `spark.executor.extraJavaOptions`, se produce un error en el lanzamiento del controlador o el ejecutor con Amazon EMR 6.1 debido a un conflicto de configuración de recopilación de elementos no utilizados con Amazon EMR 6.1.0. En el caso de Amazon EMR 6.1.0, la configuración predeterminada de recopilación de elementos no utilizados se establece mediante `spark.driver.defaultJavaOptions` y `spark.executor.defaultJavaOptions`. Esta configuración se aplica únicamente a Amazon EMR 6.1.0. Las opciones de JVM que no estén relacionadas con la recopilación de elementos no utilizados, como las que permiten configurar el registro (`-verbose:class`), todavía se pueden establecer mediante `extraJavaOptions`. Para obtener más información, consulte [Spark application properties](https://spark.apache.org/docs/latest/configuration.html#application-properties). 

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

Si quiere configurar los ejecutores para utilizar el máximo de recursos posible en cada nodo de un clúster, establezca `maximizeResourceAllocation` en `true` en la clasificación de configuración `spark`. La opción `maximizeResourceAllocation` es específica de Amazon EMR. Al habilitar `maximizeResourceAllocation`, Amazon EMR calcula el máximo de recursos de computación y de memoria disponibles para un ejecutor en una instancia del grupo de instancias principales. A continuación, establece la configuración `spark-defaults` correspondiente en función de los valores máximos calculados.

Amazon EMR calcula el máximo de recursos de computación y de memoria disponibles para un ejecutor basado en un tipo de instancia de la flota de instancias principales. Dado que cada flota de instancias puede tener distintos tipos y tamaños de instancias dentro de una flota, la configuración de ejecutor que utiliza Amazon EMR puede no ser la mejor para sus clústeres, por lo que no recomendamos utilizar la configuración predeterminada cuando se utilice la asignación máxima de recursos. Configure ajustes personalizados para los clústeres de su flota de instancias.

**nota**  
No debe usar la opción `maximizeResourceAllocation` en clústeres con otras aplicaciones distribuidas, como HBase. Amazon EMR utiliza configuraciones de YARN personalizadas para las aplicaciones distribuidas, lo que puede entrar en conflicto con `maximizeResourceAllocation` y hacer que se produzcan errores en las aplicaciones de Spark.

A continuación, se muestra un ejemplo de una clasificación de configuración de Spark con la opción `maximizeResourceAllocation` establecida en `true`.

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


**Opciones configuradas en `spark-defaults` cuando `maximizeResourceAllocation`está habilitado**  

| Opción | Description (Descripción) | Valor | 
| --- | --- | --- | 
| spark.default.parallelism | Número predeterminado de particiones en los RDD que devuelven transformaciones como unirByKey, reducir y paralelizar cuando el usuario no las ha establecido. | 2X número de núcleos de CPU disponibles para contenedores de YARN. | 
| spark.driver.memory | Cantidad de memoria que se utilizará para el proceso del controlador, es decir, dónde se inicializa. SparkContext (por ejemplo, 1 g, 2 g). | El ajuste se configura en función de los tipos de instancia en el clúster. Sin embargo, dado que la aplicación del controlador de Spark puede ejecutarse en la instancia principal o en una de las instancias básicas (por ejemplo, en un cliente de YARN y modos de clústeres, respectivamente), esto se establece en función del más pequeño de los tipos de instancia de estos dos grupos de instancias. | 
| spark.executor.memory | Cantidad de memoria que se va a utilizar por cada proceso de ejecutor, por ejemplo 1g, 2g. | El ajuste se configura en función de los tipos de instancias secundarias y de tareas del clúster.  | 
| spark.executor.cores | El número de núcleos que se va a utilizar en cada ejecutor.  | El ajuste se configura en función de los tipos de instancias secundarias y de tareas del clúster.  | 
| spark.executor.instances |  El número de ejecutores. | El ajuste se configura en función de los tipos de instancias secundarias y de tareas del clúster. Se define a menos que `spark.dynamicAllocation.enabled` defina explícitamente en true al mismo tiempo. | 

## Configuración del comportamiento de retirada de nodos
<a name="spark-decommissioning"></a>

Con la versión 5.9.0 o una posterior de Amazon EMR, Spark en Amazon EMR incluye un conjunto de características para ayudar a garantizar que Spark gestione correctamente la terminación de los nodos debido a una solicitud de cambio de tamaño manual o de política de escalado automático. Amazon EMR implementa un mecanismo de lista de denegación en Spark que se basa en el mecanismo de retirada de YARN. Este mecanismo ayuda a evitar que se programen tareas nuevas en un nodo que se está retirando, al tiempo que permite que finalicen las tareas que ya se están ejecutando. Además, existen características para ayudar a recuperar los trabajos de Spark más rápido si se pierden bloques de reorganización cuando termina un nodo. El proceso de recálculo se activa antes, y está optimizado para realizarse más rápido, con menos reintentos de etapas, y se puede evitar que se produzcan errores en los trabajos debido a problemas de recuperación provocados por los bloques de reorganización que faltan.

**importante**  
La configuración `spark.decommissioning.timeout.threshold` se agregó en la versión 5.11.0 de Amazon EMR para mejorar la resiliencia de Spark cuando se utilizan instancias de spot. En las versiones anteriores, cuando un nodo utilizaba una instancia de spot y la instancia se terminaba debido al precio de puja, era posible que Spark no pudiera gestionar la terminación correctamente. Los tareas pueden fallar y los recálculos de reorganización pueden tardar mucho tiempo. Por este motivo, le recomendamos que utilice la versión 5.11.0 o posterior si utiliza instancias de spot.


**Configuración de la retirada de nodos de Spark**  

| Opción | Description (Descripción) | Predeterminado | 
| --- | --- | --- | 
| `spark.blacklist.decommissioning.enabled` | Cuando se establece en `true`, Spark agrega a la lista de denegación los nodos que tienen el estado `decommissioning` en YARN. Spark no programa tareas nuevas en los ejecutores activos en ese nodo. A las tareas que se encuentran en ejecución se les permite completarse. | `true` | 
| `spark.blacklist.decommissioning.timeout` | Cantidad de tiempo que permanece en la lista de denegación un nodo cuyo estado es `decommissioning`. De forma predeterminada, este valor se establece en una hora, que también es el valor predeterminado de `yarn.resourcemanager.decommissioning.timeout`. Para asegurarse de que un nodo permanece en la lista de denegación durante todo su periodo de retirada, establezca un valor mayor o igual que `yarn.resourcemanager.decommissioning.timeout`. Cuando vence el tiempo de espera para la retirada, el nodo pasa al estado `decommissioned` y Amazon EMR no puede terminar la instancia de EC2 del nodo. Si hay alguna tarea en ejecución cuando finaliza el tiempo de espera, se pierde o se cancela y se reprograma en los ejecutores activos de los otros nodos. | `1h` | 
| `spark.decommissioning.timeout.threshold` | Disponible en la versión 5.11.0 o posteriores de Amazon EMR. Se especifica en segundos. Cuando un nodo pasa al estado Retirando, si el host lo va a retirar en un periodo de tiempo igual o menor que este valor, Amazon EMR no solo agrega el nodo a la lista de denegación, sino que también limpia el estado del host (según se especifique mediante `spark.resourceManager.cleanupExpiredHost`) sin necesidad de esperar a que el nodo cambie al estado Retirado. Esto permite que Spark gestione mejor las terminaciones de instancias de spot, ya que las instancias de spot se retiran dentro de un tiempo de espera de 20 segundos, independientemente del valor de `yarn.resourcemanager.decommissioning.timeout`, que posiblemente no proporcione a los demás nodos tiempo suficiente para leer los archivos de reorganización. | `20s` | 
| `spark.resourceManager.cleanupExpiredHost` | Cuando se establece en `true`, Spark anula el registro de todos los datos almacenados en la memoria caché y los bloques de reorganización que se almacenan en ejecutores en los nodos que tienen el estado `decommissioned`. Esto acelera el proceso de recuperación. | `true` | 
| `spark.stage.attempt.ignoreOnDecommissionFetchFailure` | Cuando se establece en `true`, ayuda a evitar errores en las etapas de Spark y que al final el trabajo no se complete debido a un número excesivo de recuperaciones desde los nodos retirados. Los errores en las recuperaciones de los bloques de reorganización de un nodo con el estado `decommissioned` no cuentan para el cálculo del número máximo de errores de recuperación consecutivos. | true | 

## Variable de ThriftServer entorno Spark
<a name="spark-thriftserver"></a>

Spark establece la variable de entorno Hive Thrift Server Port, `HIVE_SERVER2_THRIFT_PORT`, en 10 001.

## Cambio de la configuración predeterminada de Spark
<a name="spark-change-defaults"></a>

Puede cambiar la configuración predeterminada en `spark-defaults.conf` utilizando la clasificación de configuración `spark-defaults` al crear el clúster o el ajuste `maximizeResourceAllocation` en la clasificación de configuración `spark`.

Los siguientes procedimientos muestran cómo modificar los ajustes mediante la CLI o la consola.

**Para crear un clúster con el valor de spark.executor.memory definido en 2g mediante la CLI**
+ Cree un clúster con Spark instalado y el valor de `spark.executor.memory` establecido en 2g con el siguiente comando, que hace referencia a un archivo (`myConfig.json`) almacenado en Amazon S3.

  ```
  aws emr create-cluster --release-label {{emr-7.13.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**  
Se incluyen caracteres de continuación de línea de Linux (\\) para facilitar la lectura. Se pueden eliminar o utilizar en los comandos de Linux. En Windows, elimínelos o sustitúyalos por un signo de intercalación (^).

  `myConfig.json`:

  ```
  [
      {
        "Classification": "spark-defaults",
        "Properties": {
          "spark.executor.memory": "2G"
        }
      }
    ]
  ```

**Para crear un clúster con el valor de spark.executor.memory definido en 2g mediante la consola**

1. Vaya hasta la nueva consola de Amazon EMR y seleccione **Ir a la consola antigua** en el panel de navegación lateral. Para más información sobre lo que puede esperar al cambiar a la consola antigua, consulte [Uso de la consola antigua](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in).

1. Elija **Crear clúster** e **Ir a las opciones avanzadas**.

1. Elija **Spark**. 

1. En **Edit software settings (Editar configuración de software)**, deje seleccionada la opción **Enter configuration (Escribir la configuración)** y especifique la siguiente configuración:

   ```
   classification=spark-defaults,properties=[spark.executor.memory=2G]
   ```

1. Seleccione otras opciones, elija **** y, a continuación, elija **Crear clúster**.

**Para configurar maximizar ResourceAllocation**
+ Cree un clúster con Spark instalado y `maximizeResourceAllocation` establecido en true utilizando el AWS CLI archivo almacenado en Amazon S3`myConfig.json`, haciendo referencia a un archivo.

  ```
  aws emr create-cluster --release-label {{emr-7.13.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**  
Se incluyen caracteres de continuación de línea de Linux (\\) para facilitar la lectura. Se pueden eliminar o utilizar en los comandos de Linux. En Windows, elimínelos o sustitúyalos por un signo de intercalación (^).

  `myConfig.json`:

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

**nota**  
Con la versión 5.21.0 y posteriores de Amazon EMR, puede anular las configuraciones de clúster y especificar las clasificaciones de configuración adicionales para cada grupo de instancias en un clúster en ejecución. Para ello, utilice la consola Amazon EMR, el AWS Command Line Interface (AWS CLI) o el AWS SDK. Para obtener más información, consulte [Suministrar una configuración para un grupo de instancias en un clúster en ejecución](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html).

## Migración de Apache Log4j 1.x a Log4j 2.x
<a name="spark-migrate-logj42"></a>

Las versiones 3.2.x y anteriores de [Apache Spark](https://aws.amazon.com/emr/features/spark/) utilizan la versión heredada de Apache Log4j 1.x y el archivo `log4j.properties` para configurar Log4j en los procesos de Spark. Las versiones 3.3.0 y posteriores de Apache Spark utilizan Apache Log4j 2.x y el archivo `log4j2.properties` para configurar Log4j en los procesos de Spark.

Si ha configurado Apache Spark Log4j con una versión de Amazon EMR anterior a la 6.8.0, debe eliminar la clasificación de configuración `spark-log4j` heredada y completar la migración al formato de clave y clasificación de configuración `spark-log4j2` para poder actualizar a la versión 6.8.0 o posteriores de Amazon EMR. La clasificación `spark-log4j` heredada provoca un error `ValidationException` en la creación del clúster en las versiones 6.8.0 y posteriores de Amazon EMR. No se le cobrará nada en caso de un error relacionado con la incompatibilidad de Log4j, pero deberá eliminar la clasificación de configuración `spark-log4j` extinta para continuar.

Para obtener más información sobre la migración de Apache Log4j 1.x a Log4j 2.x, consulte [Apache Log4j Migration Guide](https://logging.apache.org/log4j/2.x/manual/migration.html) y [Spark Log4j 2 Template](https://github.com/apache/spark/blob/master/conf/log4j2.properties.template) en GitHub. 

**nota**  
Con Amazon EMR, Apache Spark usa un archivo `log4j2.properties` en lugar del archivo .xml descrito en [Apache Log4j Migration Guide](https://logging.apache.org/log4j/2.x/manual/migration.html). Además, no recomendamos utilizar el método de puente de Log4j 1.x para llevar a cabo la conversión a Log4j 2.x. 