Asignación de memoria y gestión de memoria de flink

Apache Flink 1.10 ha realizado cambios importantes en el modelo de memoria del administrador de tareas y las opciones de configuración de la aplicación Flink. Estos cambios introducidos recientemente hacen que Flink sea más adecuado para varios entornos de implementación (por ejemplo, Kubernetes, Yarn, Mesos), controlando así estrictamente su consumo de memoria. Este artículo presentará el modelo de memoria Flink en Flink 1.10, cómo configurar y administrar el consumo de memoria de las aplicaciones Flink.

1. Introducción al modelo de memoria Flink

Una comprensión clara del modelo de memoria de Apache Flink puede permitir a los desarrolladores administrar de manera más efectiva los recursos de varias cargas de trabajo. La siguiente figura ilustra los componentes de la memoria principal en Flink: el
Inserte la descripción de la imagen aquí
proceso del administrador de tareas es un proceso JVM. Desde un punto de vista elevado, su memoria se compone de memoria JVM Heap y Off-Heap. Flink utiliza estos tipos de memoria directamente o la JVM para sus fines específicos (por ejemplo, metaespacio, etc.). Hay dos usuarios de memoria principales en Flink: el código de usuario del programador y el marco en sí ocupan estructuras de datos internas, búferes de red y otra memoria.

Tenga en cuenta : El código de usuario puede acceder directamente a todos los tipos de memoria: memoria Heap, directa y nativa de JVM. Por lo tanto, Flink realmente no puede controlar su distribución y uso. Sin embargo, hay dos tipos de memoria fuera del montón para tareas, y Flink las controla explícitamente:

(1) Memoria administrada (fuera del montón)
(2) Búfer de red

Este último es parte de la memoria directa de la JVM, asignada al intercambio de registros de usuario entre tareas del programador.

2. Cómo configurar la memoria Flink

En Flink 1.10, para proporcionar una mejor experiencia de usuario, el marco proporciona ajustes avanzados y detallados de los componentes de la memoria. Básicamente, hay tres opciones para configurar la memoria en el administrador de tareas.

Las dos primeras (y las más simples) alternativas son configurar una de las siguientes dos opciones para la memoria total utilizada por el proceso JVM del administrador de tareas:
(1) Memoria total del proceso: aplicaciones Flink Java (incluido el código de usuario) y la memoria total consumida por la JVM para ejecutar todo el proceso.
(2) Memoria total de Flink: solo la memoria consumida por las aplicaciones Flink Java, incluido el código de usuario, pero excluyendo la memoria asignada por la JVM para su funcionamiento.

Se recomienda configurar la "memoria Flink total" para el modo autónomo En este caso, es una práctica común declarar explícitamente cuánta memoria se asigna para Flink, pero la sobrecarga de JVM externa es muy pequeña. Para implementar Flink en un entorno en contenedor (como Kubernetes, Yarn o Mesos), se recomienda utilizar la opción Memoria de proceso total, ya que se convierte en el tamaño de memoria total del contenedor solicitado. Los entornos en contenedores suelen hacer cumplir estrictamente este límite de memoria.

Si desea un control más detallado sobre el tamaño del montón de JVM y la memoria administrada (no montón), hay otra forma de configurar el montón de tareas y la memoria administrada al mismo tiempo. Esta opción permite una clara separación entre la memoria dinámica y cualquier otro tipo de memoria.

De acuerdo con los esfuerzos de la comunidad de flink para unificar el procesamiento por lotes y por secuencias, este modelo es común en ambos casos. Permite compartir la memoria del montón de JVM entre el código de usuario de las tareas del operador en cualquier carga de trabajo y el backend del estado del montón en el esquema de procesamiento de flujo. De manera similar, la memoria administrada se puede usar para el backend de estado de RocksDB en el desbordamiento y la transmisión por lotes.

Los componentes de memoria restantes se ajustarán automáticamente de acuerdo con sus valores predeterminados u otros parámetros configurados. Flink también verifica la consistencia general. Puede encontrar más información sobre los diferentes componentes de la memoria en la documentación correspondiente.

3. Otros componentes

Al configurar la memoria de Flink, el tamaño de los diferentes componentes de la memoria se puede fijar con el valor de la opción correspondiente, o se puede ajustar usando múltiples opciones. A continuación, proporcionamos más información sobre la configuración de la memoria.

Puntuación de la memoria Flink total
Este método permite subdividir proporcionalmente la memoria Flink total, donde la memoria administrada (si no se establece explícitamente) y los búferes de red pueden ocupar parte de ella. Luego, la memoria restante se asigna al montón de tareas (si no se establece explícitamente) y otros componentes del montón de JVM fijos y fuera del montón. La siguiente figura representa un ejemplo de esta configuración:
Inserte la descripción de la imagen aquíTenga en cuenta:
(1) Flink verificará que el tamaño de la memoria de red derivada esté entre sus valores mínimo y máximo; de lo contrario, Flink no se iniciará. Los límites máximo y mínimo tienen valores predeterminados, que pueden ser anulados por las opciones de configuración correspondientes.

(2) Generalmente, Flink trata la puntuación configurada como un recordatorio. En algunos casos, es posible que el valor derivado no coincida con la puntuación. Por ejemplo, si la "Memoria Flink total" y el "Montón de tareas" se configuran como valores fijos, la "Memoria administrada" obtendrá un cierto porcentaje y la "Memoria de red" obtendrá la memoria restante que puede no coincidir exactamente con la proporción. .

Más consejos para controlar el límite de memoria del contenedor

La JVM gestiona el uso de memoria dinámica y directa. Hay muchas otras fuentes posibles de consumo de memoria local en Apache Flink o sus aplicaciones de usuario, que no son administradas por Flink o JVM. A menudo es difícil controlar sus límites, lo que puede complicar la depuración de posibles pérdidas de memoria. Si el proceso Flink asigna demasiada memoria de una manera no administrada, generalmente puede hacer que el contenedor del Administrador de tareas se elimine en un entorno en contenedores. En este caso, puede resultar difícil comprender qué tipo de consumo de memoria ha superado su límite. Flink 1.10 introdujo algunas opciones de ajuste específicas para representar claramente estos componentes. Aunque Flink no siempre puede imponer límites y restricciones estrictos, la idea aquí es planificar explícitamente el uso de la memoria.

(1) El estado de RocksDB no puede ser demasiado grande. El consumo de memoria del backend de estado de RocksDB se resuelve en la memoria administrada. RocksDB obedece sus restricciones por defecto (solo desde Flink 1.10). Puede aumentar el tamaño de la memoria administrada para mejorar el rendimiento de RocksDB, o puede reducir el tamaño de la memoria administrada para ahorrar recursos.
(2) El código de usuario o sus dependencias consumirán mucha memoria fuera del montón. Ajuste la opción "tarea fuera del montón" para asignar otra memoria directa o nativa para el código de usuario o cualquiera de sus dependencias. Flink no puede controlar la asignación nativa, pero establece un límite para la asignación de memoria JVM Direct. La JVM aplica el límite de memoria directa.
(3) El metaespacio de JVM requiere memoria adicional. Si encuentra OutOfMemoryError: Metaspace, Flink ofrece una opción para aumentar su límite y la JVM se asegurará de que no se exceda el límite.
(4) JVM necesita más memoria interna. No es posible controlar directamente ciertos tipos de asignación de procesos de JVM, pero Flink proporciona opciones de sobrecarga de JVM. Estas opciones le permiten declarar la cantidad de memoria adicional que se espera para estas asignaciones y no está cubierta por otras opciones.

4. Conclusión

La versión de Flink (Flink 1.10) ha realizado algunos cambios importantes en la configuración de la memoria de Flink, para que pueda administrar la memoria de la aplicación y depurar Flink mejor que antes. Los desarrollos futuros en esta área también incluyen el uso de un modelo de memoria similar para el proceso del administrador de trabajos en FLIP-116, así que permanezca atento a más características nuevas en la próxima versión.

Este artículo está traducido del sitio web oficial de flink.

Supongo que te gusta

Origin blog.csdn.net/qq_44962429/article/details/108051425
Recomendado
Clasificación