En esta página, se proporciona información sobre los errores de falta de memoria (OOM) de Managed Service para Apache Spark en VMs de Compute Engine y se explican los pasos que puedes seguir para solucionar y resolver los errores de OOM.
Efectos de los errores de OOM
Cuando las VMs de Managed Service para Apache Spark encuentran errores de falta de memoria (OOM), los efectos incluyen las siguientes condiciones:
Las VMs principales y de trabajador se congelan durante un período.
Los errores de OOM de las VMs principales hacen que los trabajos fallen con errores de "tarea no adquirida".
Los errores de OOM de las VMs de trabajador provocan la pérdida del nodo en YARN HDFS, lo que retrasa la ejecución del trabajo de Managed Service para Apache Spark.
Controles de memoria YARN
Apache YARN proporciona los siguientes tipos de controles de memoria:
- Basado en sondeo (heredado)
- Estricto
- Elastic
De forma predeterminada, Managed Service para Apache Spark no establece yarn.nodemanager.resource.memory.enabled para habilitar los controles de memoria YARN por los siguientes motivos:
- El control de memoria estricto puede provocar la finalización de los contenedores cuando hay suficiente memoria si los tamaños de los contenedores no están configurados correctamente.
- Los requisitos de control de memoria elástica pueden afectar de forma negativa la ejecución del trabajo.
- Los controles de memoria YARN pueden no evitar los errores de OOM cuando los procesos consumen memoria de forma agresiva.
Protección de memoria de Managed Service para Apache Spark
Cuando una VM de clúster de Managed Service para Apache Spark está bajo presión de memoria, la protección de memoria de Managed Service para Apache Spark finaliza los procesos o contenedores hasta que se quita la condición de OOM.
Managed Service para Apache Spark proporciona protección de memoria para los siguientes nodos de clúster en las siguientes versiones de imagen de Managed Service para Apache Spark:
| Rol | 1.5 | 2.0 | 2.1 | 2.2 |
|---|---|---|---|---|
| VM principal | 1.5.74+ | 2.0.48+ | todos | todos |
| VM de trabajador | No disponible | 2.0.76+ | 2.1.24+ | todos |
| VM del grupo de controladores | No disponible | 2.0.76+ | 2.1.24+ | todos |
Identifica y confirma las finalizaciones de protección de memoria
Puedes usar la siguiente información para identificar y confirmar las finalizaciones de trabajos debido a la presión de memoria.
Finalizaciones de procesos
Los procesos que finaliza la protección de memoria de Managed Service para Apache Spark salen con el código
137o143.Cuando Managed Service para Apache Spark finaliza un proceso debido a la presión de memoria, pueden ocurrir las siguientes acciones o condiciones:
- Managed Service para Apache Spark incrementa la métrica acumulativa
dataproc.googleapis.com/node/problem_county establece elreasonenProcessKilledDueToMemoryPressure. Consulta Recopilación de métricas de recursos de Managed Service para Apache Spark. - Managed Service para Apache Spark escribe un registro
google.dataproc.oom-killercon el mensaje:"A process is killed due to memory pressure: process name. Para ver estos mensajes, habilita Cloud Logging y, luego, usa el siguiente filtro de registro:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"A process is killed due to memory pressure:"
- Managed Service para Apache Spark incrementa la métrica acumulativa
Finalizaciones de trabajos del nodo principal o del grupo de nodos del controlador
Cuando un nodo principal de Managed Service para Apache Spark o un trabajo del grupo de nodos del controlador finaliza debido a la presión de memoria, el trabajo falla con el error
Driver received SIGTERM/SIGKILL signal and exited with INTcode. Para ver estos mensajes, habilita Cloud Logging y, luego, usa el siguiente filtro de registro:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"Driver received SIGTERM/SIGKILL signal and exited with"- Consulta el
google.dataproc.oom-killerregistro o eldataproc.googleapis.com/node/problem_countpara confirmar que la protección de memoria de Managed Service para Apache Spark finalizó el trabajo (consulta Finalizaciones de procesos).
Soluciones:
- Si el clúster tiene un
grupo de controladores,
aumenta
driver-required-memory-mbal uso de memoria real del trabajo. - Si el clúster no tiene un grupo de controladores, vuelve a crearlo y reduce la cantidad máxima de trabajos simultáneos que se ejecutan en el clúster.
- Usa un tipo de máquina de nodo principal con mayor memoria.
- Consulta el
Finalizaciones de contenedores YARN de nodos trabajadores
Managed Service para Apache Spark escribe el siguiente mensaje en el administrador de recursos YARN:
container id exited with code EXIT_CODE. Para ver estos mensajes, habilita Cloud Logging y, luego, usa el siguiente filtro de registro:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"container" AND "exited with code" AND "which potentially signifies memory pressure on NODE
Si un contenedor salió con
code INT, consulta elgoogle.dataproc.oom-killerregistro o eldataproc.googleapis.com/node/problem_countpara confirmar que la protección de memoria de Managed Service para Apache Spark finalizó el trabajo (consulta Finalizaciones de procesos).Soluciones:
- Verifica que los tamaños de los contenedores estén configurados correctamente.
- Considera reducir
yarn.nodemanager.resource.memory-mb. Esta propiedad controla la cantidad de memoria que se usa para programar contenedores YARN. - Si los contenedores de trabajo fallan de forma constante, verifica si la asimetría de datos está causando un mayor uso de contenedores específicos. Si es así, vuelve a particionar el trabajo o aumenta el tamaño del trabajador para satisfacer los requisitos de memoria adicionales.
Ajusta la protección de memoria de Linux en el nodo principal (avanzado)
Los nodos principales de Managed Service para Apache Spark usan la utilidad earlyoom para evitar que el sistema se bloquee liberando memoria cuando la memoria disponible es muy baja. La configuración predeterminada es adecuada para muchas cargas de trabajo. Sin embargo, es posible que debas ajustar la configuración si tu nodo principal tiene una gran cantidad de memoria y experimenta un consumo rápido de memoria.
En situaciones con alta presión de memoria, el sistema puede entrar en un estado de "thrashing", en el que pasa la mayor parte del tiempo en la administración de memoria y deja de responder. Esto puede suceder tan rápido que earlyoom no puede tomar medidas según su configuración predeterminada o no puede actuar antes de que se invoque la respuesta OOM del kernel.
Antes de comenzar
- Esta es una opción de ajuste avanzada. Antes de ajustar la configuración de
earlyoom, prioriza otras soluciones, como usar una VM principal con más memoria, reducir la simultaneidad de trabajos o optimizar el uso de memoria del trabajo.
Personaliza la configuración de earlyoom
La configuración predeterminada de earlyoom usa una cantidad fija de memoria libre como activador. En las máquinas virtuales con una gran cantidad de RAM, por ejemplo 32GB o
más, esta cantidad fija puede representar una pequeña fracción de la memoria total.
Esto hace que el sistema sea susceptible a aumentos repentinos en el uso de memoria.
Para personalizar la configuración de earlyoom, conéctate al nodo principal y modifica el archivo de configuración.
Abre el archivo de configuración para editarlo:
sudo nano /etc/default/earlyoomAjusta el umbral mínimo de memoria. Ubica la línea
EARLYOOM_ARGS. La-M <kbytes>opción establece la cantidad mínima de memoria libre en KiB queearlyoomintenta mantener. El valor predeterminado es-M 65536, que es64 MiB.Para un nodo principal con memoria sustancial, aumenta este valor. Por ejemplo, para establecer el umbral en
1 GiB(1048576 KiB), modifica la línea de la siguiente manera:EARLYOOM_ARGS="-r 15 -M 1048576 -s 1"Notas:
-r: Intervalo de informe de memoria en segundos-s: El umbral de espacio de intercambio para activarearlyoom
Reinicia el servicio
earlyoompara aplicar los cambios:sudo systemctl restart earlyoom