Configurar Spark - Amazon EMR

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

Puede configurar Spark en Amazon EMR con clasificaciones de configuración. Para obtener más información sobre cómo las clasificaciones de configuración, consulte Configuración de aplicaciones.

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.

  • spark-defaults: establece los valores del archivo spark-defaults.conf. Para obtener más información, consulte Spark configuration 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 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 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 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 en GitHub y 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 antes de agregar configuraciones personalizadas. La mayoría de los clientes observan mejoras de rendimiento con nuestra configuración predeterminada.

Valores predeterminados de Spark establecidos por Amazon EMR

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 Descripción Valor 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)

nota

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.

nota

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

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.

Uso de maximizeResourceAllocation

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 maximizeResourceAllocation opción en clústeres con otras aplicaciones distribuidas, por ejemplo. 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 Descripción Valor
spark.default.parallelism Transformaciones como unir y paralelizar RDDs devuelven el número predeterminado de particiones cuando el usuario no lo establece. reduceByKey

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 SparkContext inicializa. (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

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 Descripción Valor 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. Una vez transcurrido el tiempo de espera de desmantelamiento, el nodo pasa a un decommissioned estado y Amazon EMR puede terminar la instancia del nodo. EC2 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.resourcemager.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 entorno Spark ThriftServer

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

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.6.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.

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

  3. Elija Spark.

  4. 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]
  5. Seleccione otras opciones, elija y, a continuación, elija Create cluster (Crear clúster).

Para configurar maximizeResourceAllocation
  • Cree un clúster con Spark instalado y maximizeResourceAllocation establecido en true utilizando el AWS CLI archivo almacenado en Amazon S3myConfig.json, haciendo referencia a un archivo.

    aws emr create-cluster --release-label emr-7.6.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.

Migración de Apache Log4j 1.x a Log4j 2.x

Las versiones 3.2.x y anteriores de Apache 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 y Spark Log4j 2 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. 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.