¿Por qué mi trabajo de Spark en Amazon EMR tuvo errores?

9 minutos de lectura
0

Mi trabajo de Apache Spark en Amazon EMR tuvo errores.

Resolución

Errores de la aplicación

ERROR ShuffleBlockFetcherIterator: Failed to get block(s) from ip-192-168-14-250.us-east-2.compute.internal:7337 (ERROR ShuffleBlockFetcherIterator: no se pudieron obtener los bloques de ip-192-168-14-250.us-east-2.compute.internal:7337)

org.apache.spark.network .client.ChunkFetchFailureException: Failure while fetching StreamChunkId[streamId=842490577174,chunkIndex=0]: java.lang.RuntimeException: Executor is not registered (appId=application_1622819239076_0367, execId=661) (org.apache.spark.network .client.ChunkFetchFailureException: error al recuperar StreamChunkId[streamId=842490577174,chunkIndex=0]: java.lang.RuntimeException: el ejecutor no está registrado [appId=application_1622819239076_0367, execId=661])

Este problema puede producirse cuando el nodo de trabajo ejecutor de Amazon EMR se encuentra en mal estado. Cuando la utilización del disco de un nodo de trabajo supera el umbral de utilización del 90 %, el servicio de estado YARN NodeManager informa que el nodo está UNHEALTHY (EN MAL ESTADO). Los nodos en mal estado se incluyen en las listas de denegación de Amazon EMR. Además, los contenedores YARN no están asignados a esos nodos.

Para solucionar este problema, haga lo siguiente:

ERROR [Executor task launch worker for task 631836] o.a.s.e.Executor:Exception in task 24.0 in stage 13028.0 (TID 631836) java.util.NoSuchElementException: None.get (ERROR [Ejecutor de lanzamiento de tareas para la tarea 631836] O.A.S.E.Executor: excepción en la tarea 24.0 de la etapa 13028.0 [TID 631836] java.util.NoSuchElementException: none.get)

Este error se produce cuando hay un problema en el código de la aplicación y en la inicialización de SparkContext.

Asegúrese de que no haya varios trabajos de SparkContext activos en la misma sesión. Según la máquina virtual de Java (JVM), puede tener un SparkContext activo a la vez. Si desea inicializar otro SparkContext, debe detener el trabajo activo antes de crear uno nuevo.

Container killed on request. Exit code is 137 (Contenedor eliminado por solicitud. El código de salida es 137)

Esta excepción se produce cuando una tarea en un contenedor YARN supera la memoria física asignada para ese contenedor. Esto suele ocurrir cuando hay particiones aleatorias, tamaños de partición inconsistentes o una gran cantidad de núcleos ejecutores.

Revise los detalles del error en los registros del controlador de Spark para determinar la causa del error. Para obtener más información, consulte ¿Cómo puedo acceder a registros del controlador de Spark en un clúster de Amazon EMR?.

A continuación, se muestra un ejemplo de error del registro del controlador:

ERROR YarnScheduler: Lost executor 19 on ip-10-109-xx-xxx.aws.com : Container from a bad node: container_1658329343444_0018_01_000020 on host: ip-10-109-xx-xxx.aws.com . Exit status: 137.Diagnostics:
Container killed on request. Exit code is 137
Container exited with a non-zero exit code 137.
Killed by external signal
Executor container 'container_1658329343444_0018_01_000020' was killed with exit code 137. To understand the root cause, you can analyze executor container log.
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 23573"...

El rastreo de la pila de errores anterior indica que no hay suficiente memoria disponible en el ejecutor para seguir procesando los datos. Este error puede ocurrir en diferentes etapas del trabajo, tanto en transformaciones reducidas como amplias.

Para resolver este problema, lleve a cabo una de las siguientes acciones:

  • Aumente la memoria del ejecutor.
    Nota: La memoria del ejecutor incluye la memoria necesaria para ejecutar las tareas más la memoria de sobrecarga. La suma de estas no debe ser mayor que el tamaño de la JVM y el tamaño máximo del contenedor YARN.
  • Agregue más particiones de Spark.
  • Aumente el número de particiones aleatorias.
  • Reduzca la cantidad de núcleos ejecutores.

Para obtener más información, consulte ¿Cómo puedo resolver los errores “Container killed on request. Exit code is 137” (Contenedor eliminado por solicitud. El código de salida es 137) de Spark en Amazon EMR?

Los trabajos de Spark están suspendidos y no se están completando

Los trabajos de Spark pueden estar estancados por varias razones. Por ejemplo, si el proceso del controlador de Spark (aplicación maestra) se ve afectado o se pierden los contenedores del ejecutor.

Esto suele ocurrir cuando se utiliza mucho espacio en disco o cuando se utilizan instancias de spot para los nodos del clúster y se termina la instancia de spot. Para obtener más información, consulte ¿Cómo puedo resolver los errores ExecutorLostFailure “Slave lost” (esclavo perdido) de Spark en Amazon EMR?.

Para solucionar este problema, haga lo siguiente:

  • Revise la aplicación maestra o los registros del controlador de Spark para ver si hay excepciones.
  • Valide la lista de nodos YARN para ver si hay nodos en mal estado. Cuando la utilización del disco de un nodo principal supera el umbral de utilización, el servicio de estado YARN Node Manager informa que el nodo está UNHEALTHY (EN MAL ESTADO). Los nodos en mal estado se incluyen en las listas de denegación de Amazon EMR. Además, los contenedores YARN no están asignados a esos nodos.
  • Supervise la utilización del espacio en disco y configure los volúmenes de Amazon Elastic Block Store (Amazon EBS) para mantener la utilización por debajo del 90 % en los nodos de trabajo del clúster de EMR.

WARN Executor: Issue communicating with driver in heartbeater org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [10000 milliseconds]. This timeout is controlled by spark.executor.heartbeatInterval (WARN Executor: error al comunicarse con el controlador de heartbeater org.apache.spark.rpc.RpcTimeoutException: Futures agotó el tiempo de espera después de [10 000 milisegundos]. Este tiempo de espera está controlado por spark.executor.heartbeatInterval)

Los ejecutores de Spark envían señales de latido al controlador de Spark en los intervalos especificados por la propiedad spark.executor.heartbeatInterval. Durante las pausas prolongadas de recopilación de elementos no utilizados, es posible que el ejecutor no envíe una señal de latido. El controlador elimina los ejecutores que no envíen una señal de latido por más del valor especificado.

TimeoutException

Las excepciones de tiempo de espera se producen cuando el ejecutor tiene restricciones de memoria o tiene problemas de OOM al procesar los datos. Esto también afecta al proceso de recopilación de elementos no utilizados, lo que provoca más demoras.

Utilice uno de los métodos siguientes para resolver los errores de tiempo de espera de latido:

  • Aumente la memoria del ejecutor. Además, según el proceso de la aplicación, reparticione los datos.
  • Ajuste la recopilación de elementos no utilizados.
  • Aumente el intervalo de spark.executor.heartbeatInterval.
  • Especifique un periodo de spark.network.timeout más largo.

ExecutorLostFailure “Exit status: -100. Diagnostics: Container released on a *lost* node” (Estado de salida: -100. Diagnóstico: contenedor lanzado en un nodo *perdido*)

Este error se produce cuando se termina un nodo principal o de tarea debido a una elevada utilización del espacio en disco. El error también se produce cuando un nodo deja de responder debido a un uso prolongado de la CPU o a una baja disponibilidad de memoria. Para conocer cómo puede solucionar este problema, consulte ¿Cómo puedo solucionar los errores “Exit status: -100. Diagnostics: Container released on a *lost* node” (Estado de salida: -100. Diagnóstico: contenedor lanzado en un nodo *perdido*) en Amazon EMR?.

Nota: Este error también puede producirse cuando se utilizan instancias de spot para nodos de clúster y se termina una instancia de spot. En este escenario, el clúster de EMR aprovisiona una instancia bajo demanda para reemplazar la instancia de spot terminada. Esto significa que la aplicación podría recuperarse por sí sola. Para obtener más información, consulte Mejoras de Spark en materia de elasticidad y resiliencia en Amazon EMR.

executor 38: java.sql.SQLException (Network error IOException: Connection timed out (Connection timed out) (executor 38: java.sql.SQLException [Error de red IOException: se agotó el tiempo de espera de la conexión])

Este problema está relacionado con la comunicación con la base de datos SQL para establecer la conexión de al leer o escribir datos. Compruebe que el host de base de datos pueda recibir conexiones entrantes en el puerto 1433 desde los grupos de seguridad del clúster de EMR.

Además, revise el número máximo de conexiones a bases de datos paralelas configurado para la base de datos SQL y la asignación de memoria para la clase de instancia de base de datos. Las conexiones a bases de datos también consumen memoria. Si la utilización es alta, revise la configuración de la base de datos y el número de conexiones permitidas. Para obtener más información, consulte Cantidad máxima de conexiones a bases de datos.

Excepciones de Amazon S3

HTTP 503 “Slow Down” (Reducir la velocidad)

Las excepciones HTTP 503 se producen cuando se supera la tasa de solicitudes de Amazon Simple Storage Service (Amazon S3) para el prefijo. Una excepción 503 no siempre significa que se producirá un error. Sin embargo, mitigar el problema puede mejorar el rendimiento de la aplicación.

Para obtener más información, consulte ¿Por qué se produce un error en mi trabajo de Spark o Hive en Amazon EMR y aparece HTTP 503 “Slow Down” (Reducir la velocidad) AmazonS3Exception?.

HTTP 403 “Access Denied” (Acceso denegado)

Los errores HTTP 403 se deben a credenciales incorrectas o no válidas, por ejemplo:

  • Las credenciales o los roles especificados en el código de la aplicación.
  • La política asociada al rol de perfil de instancia de Amazon EC2.
  • Los puntos de conexión de Amazon Virtual Private Cloud (Amazon VPC) para Amazon S3.
  • Las políticas de bucket de origen y destino de S3.

Para resolver los errores 403, asegúrese de que el rol o la política de AWS Identity and Access Management (IAM) correspondiente permitan el acceso a Amazon S3. Para obtener más información, consulte ¿Por qué se produce un error en la aplicación de Amazon EMR y aparece AmazonS3Exception HTTP 403 “Access Denied” (Acceso denegado)?.

HTTP 404 “Not Found” (No encontrado)

Los errores HTTP 404 indican que la aplicación esperaba encontrar un objeto en S3, pero en el momento de la solicitud no lo encontró. Entre las causas comunes se incluyen las siguientes:

  • Rutas de S3 incorrectas (por ejemplo, una ruta mal escrita).
  • El archivo se movió o eliminó mediante un proceso ajeno a la aplicación.
  • Una operación que causó posibles problemas de coherencia, como una sobrescritura.

Para obtener más información, consulte ¿Por qué se produce un error en la aplicación de Amazon EMR y aparece AmazonS3Exception HTTP 404 “Not Found” (No encontrado)?.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año