¿Por qué falla mi trabajo de Spark o Hive en Amazon EMR con una «Ralentización» HTTP 503 de AmazonS3Exception?

5 minutos de lectura
0

Mi trabajo de Apache Spark o Apache Hive en Amazon EMR falla con una «Ralentización» HTTP 503 de AmazonS3Exception similar a la siguiente: 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 Ralentización; Solicitud de ID: 2E8B8866BFF00645; S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=), S3 Extended Request ID: oGSeRdT4xSKtyZAcUe53LgUf1+I18dNXpL2+qZhFWhuciNOYpxX81bpFiTw2gum43GcOHR+UlJE=

Descripción corta

Este error se produce cuando la tasa de solicitudes de Amazon Simple Storage Service (Amazon S3) para su aplicación supera las tasas habituales sostenidas de más de 5000 solicitudes por segundo, y Amazon S3 optimiza internamente el rendimiento.

Para mejorar la tasa de éxito de sus solicitudes al acceder a los datos de S3 a través de Amazon EMR, pruebe los siguientes métodos:

  • Modificar la estrategia de reintentos para las solicitudes de S3.
  • Ajustar el número de solicitudes S3 simultáneas.

Resolución

Para poder identificar el problema debido al exceso de solicitudes, se recomienda configurar las métricas de solicitud de Amazon CloudWatch para el bucket de S3. Puede determinar la solución que mejor se adapte a su caso de uso basándose en estas métricas de CloudWatch.

Configuración de las métricas de las solicitud de CloudWatch

Para supervisar las solicitudes de Amazon S3, active las métricas de solicitud de CloudWatch para el bucket. A continuación, defina un filtro para el prefijo. Para obtener una lista de métricas útiles que supervisar, consulte Monitorización de métricas con Amazon CloudWatch.

Modificar la estrategia de reintentos para las solicitudes de S3

Por defecto, EMRFS utiliza una estrategia de retroceso exponencial para reintentar las solicitudes a Amazon S3. El límite predeterminado de reintentos de EMRFS es 15. Sin embargo, puede aumentar el límite de reintentos en un clúster nuevo, en un clúster en ejecución o en tiempo de ejecución de la aplicación.

Para aumentar el límite de reintentos, cambiea el valor del parámetro fs.s3.maxRetries. Si establece un valor muy alto para este parámetro, es posible que la duración del trabajo sea mayor. Intente establecer este parámetro en un valor alto (por ejemplo, 20), controle la sobrecarga de duración de los trabajos y, a continuación, ajuste este parámetro según su caso de uso.

Para un clúster nuevo, puede añadir un objeto de configuración similar al siguiente al lanzar el clúster:

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

Tras lanzar el clúster, las aplicaciones de Spark y Hive que se ejecutan en Amazon EMR utilizan el nuevo límite.

Para aumentar el límite de reintentos en un clúster en ejecución, haz lo siguiente:

1.    Abra la consola de Amazon EMR.

2.    En la lista de clústeres, elija el clúster activo que desee reconfigurar en Nombre.

3.    Abra la página de detalles del clúster y seleccione la pestaña Configuraciones.

4.    En la lista desplegable Filtrar, seleccione el grupo de instancias que desee reconfigurar.

5.    En la lista desplegable Reconfigurar, seleccione Editar en la tabla.

6.    En la tabla de clasificación de configuración, seleccione Agregar configuración, y luego, introduzca lo siguiente:

En Clasificación: emrfs-site

En Propiedad: fs.s3.maxRetries

En Valor: el nuevo valor para el límite de reintentos (por ejemplo, 20)

7.    Seleccione Apply this configuration to all active instance groups.

8.    Seleccione Guardar cambios.

Una vez implementada la configuración, las aplicaciones Spark y Hive utilizan el nuevo límite.

Para aumentar el límite de reintentos en tiempo de ejecución, utilice una sesión de shell de Spark similar a la siguiente:

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/")

Este es un ejemplo de cómo aumentar el límite de reintentos en tiempo de ejecución para una aplicación de Hive:

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

Ajustar el número de solicitudes S3 simultáneas

  • Si tiene varios trabajos (Spark, Apache Hive o s-dist-cp) leyendo y escribiendo con el mismo prefijo S3, puede ajustar la concurrencia. Comience con los trabajos más pesados de lectura/escritura y reduzca su concurrencia para evitar un paralelismo excesivo. Si ha configurado el acceso entre cuentas para Amazon S3, tenga en cuenta que es posible que otras cuentas también envíen trabajos con el mismo prefijo.
  • Si observa errores cuando el trabajo intenta escribir en el bucket de destino, reduzca el paralelismo de escritura excesivo. Por ejemplo, utilice las operaciones .coalesce() o .repartition() de Spark para reducir el número de particiones de salida de Spark antes de escribir en Amazon S3. También puede reducir la cantidad de núcleos por ejecutor o reducir la cantidad de ejecutores.
  • Si observa errores cuando el trabajo intenta leer desde el bucket de origen, ajuste el tamaño de los objetos. Puede agregar objetos más pequeños a objetos más grandes para reducir el número de objetos que el trabajo debe leer. Esto hace que sus trabajos lean conjuntos de datos con menos solicitudes de lectura. Por ejemplo, utilice s3-dist-cp para combinar una gran cantidad de archivos pequeños en una cantidad menor de archivos grandes.

Información relacionada

Prácticas recomendadas para patrones de diseño: optimizar el rendimiento de Amazon S3

¿Por qué se produce un error en la aplicación de Amazon EMR y aparece AmazonS3Exception HTTP 403 «Access Denied» (Acceso denegado)?

Why does my Amazon EMR application fail with an HTTP 404 "Not Found" AmazonS3Exception?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años