Guía de compatibilidad estatal para las actualizaciones de Flink 2.2 - Managed Service para Apache Flink

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.

Guía de compatibilidad estatal para las actualizaciones de Flink 2.2

Al actualizar de Flink 1.x a Flink 2.2, los problemas de compatibilidad de estado pueden impedir que la aplicación se restaure a partir de instantáneas. Esta guía le ayuda a identificar posibles problemas de compatibilidad y proporciona estrategias de migración.

Comprender los cambios de compatibilidad de estados

Amazon Managed Service para Apache Flink 2.2 introduce varios cambios de serialización que afectan a la compatibilidad de estados. Los principales son los siguientes:

  • Actualización de la versión Kryo: Apache Flink 2.2 actualiza el serializador Kryo incluido de la versión 2 a la versión 5. Como Kryo v5 utiliza un formato de codificación binaria diferente al de Kryo v2, cualquier estado del operador que se haya serializado mediante Kryo en un punto de almacenamiento de Flink 1.x no se puede restaurar en Flink 2.2.

  • Serialización de colecciones de Java: en Flink 1.x, las colecciones de Java (como, y) incluidas en ellas se serializaban mediante Kryo. HashMap ArrayList HashSet POJOs Flink 2.2 presenta serializadores optimizados para colecciones específicas que son incompatibles con el estado krio-serializado de la versión 1.x. Las aplicaciones que utilizan colecciones Java con serializadores POJO o Kryo en la versión 1.x no pueden restaurar este estado en Flink 2.2. Consulte la documentación de Flink para obtener más información sobre los tipos de datos y la serialización.

  • Compatibilidad con el conector Kinesis: la versión del conector Kinesis Data Streams (KDS) anterior a la 5.0 mantiene un estado que no es compatible con la versión 6.0 del conector Kinesis Flink 2.2. Debe migrar a la versión 5.0 o superior del conector antes de realizar la actualización.

Referencia de compatibilidad de serialización

Revise todas las declaraciones estatales de su solicitud y compare los tipos de serialización con la tabla siguiente. Si algún tipo de estado no es compatible, consulte la Migración estatal sección antes de continuar con la actualización.

Referencia de compatibilidad de serialización
Tipo de serialización ¿Compatible? Details
Avro (SpecificRecord,GenericRecord) Utiliza su propio formato binario independiente de Kryo. Asegúrese de utilizar la información de tipo Avro nativa de Flink, no la de Avro registrada como un serializador Kryo.
Protobuf Utiliza su propia codificación binaria independiente de Kryo. Compruebe que los cambios en el esquema sigan las reglas de evolución compatibles con versiones anteriores.
POJOs sin colecciones Se gestiona mediante el serializador POJO de Flink, pero solo si la clase cumple con todos los criterios de POJO: clase pública, constructor público sin arg, todos los campos son públicos o accesibles a través de getters/setters y Flink puede serializar todos los tipos de campo a su vez. El POJO que infrinja alguno de estos requisitos recaerá silenciosamente en manos de Kryo y pasará a ser incompatible.
Personalizado TypeSerializers Compatible solo si su serializador no delega en Kryo internamente.
Estado de las API SQL y Table Sí (con una advertencia) Utiliza los serializadores internos de Flink. Sin embargo, Apache Flink no garantiza la compatibilidad estatal entre las versiones principales de las aplicaciones de la API de tablas. Primero, se deben realizar pruebas en un entorno que no sea de producción.
POJOs con colecciones de Java (HashMap,ArrayList,HashSet) No En Flink 1.x, las colecciones incluidas POJOs se serializaban mediante Kryo v2. Flink 2.2 presenta serializadores de colecciones específicos cuyo formato binario es incompatible con el formato Kryo v2.
Clases de casos de Scala No Serializado mediante Kryo en Flink 1.x. La actualización de Kryo v2 a v5 cambia el formato binario.
Registros de Java No Normalmente recurre a la serialización de Kryo en Flink 1.x. Verifique probando con. disableGenericTypes()
Tipos de bibliotecas de terceros No Los tipos sin un serializador personalizado registrado recurren a Kryo. El cambio de formato binario de Kryo v2 a v5 rompe la compatibilidad.
Cualquier tipo que utilice Kryo fallback No Si Flink no puede gestionar un tipo con un serializador incorporado o registrado, recurre a Kryo. Todos los estados serializados con Kryo de la versión 1.x son incompatibles con la versión 2.2.

Métodos de diagnóstico

Puedes identificar los problemas de compatibilidad entre estados de forma proactiva consultando los registros de las aplicaciones o inspeccionándolos después de la operación de la UpdateApplication API.

Identifique la alternativa de Kryo en su aplicación

Puedes usar el siguiente patrón de expresiones regulares en tus registros para identificar el retroceso de Kryo en tu aplicación:

Class class (?<className>[^\s]+) cannot be used as a POJO type

Registros de ejemplo:

Class class org.apache.flink.streaming.connectors.kinesis.model.SequenceNumber cannot be used as a POJO type because not all fields are valid POJO fields, and must be processed as GenericType. Please read the Flink documentation on "Data Types & Serialization" for details of the effect on performance and schema evolution.

Si se produce un error en la actualización mediante la UpdateApplication API, las siguientes excepciones podrían indicar que se está produciendo una incompatibilidad de estado basada en el serializador:

IndexOutOfBoundsException

Caused by: java.lang.IndexOutOfBoundsException: Index 116 out of bounds for length 1 at java.base/jdk.internal.util.Preconditions.outOfBounds(Unknown Source) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Unknown Source) at java.base/jdk.internal.util.Preconditions.checkIndex(Unknown Source) at java.base/java.util.Objects.checkIndex(Unknown Source) at java.base/java.util.ArrayList.get(Unknown Source) at com.esotericsoftware.kryo.util.MapReferenceResolver.getReadObject(MapReferenceResolver.java:77) at com.esotericsoftware.kryo.Kryo.readReferenceOrNull(Kryo.java:923) ... 23 more

StateMigrationException (POJOSerializer)

Caused by: org.apache.flink.util.StateMigrationException: The new state serializer (org.apache.flink.api.java.typeutils.runtime.PojoSerializer@8bf85b5d) must not be incompatible with the old state serializer (org.apache.flink.api.java.typeutils.runtime.PojoSerializer@3282ee3).

Lista de comprobación previa a la actualización

  • Revise todas las declaraciones estatales de su solicitud

  • Consulte POJOs con las colecciones (HashMap,ArrayList,HashSet)

  • Verifique los métodos de serialización para cada tipo de estado

  • Cree una aplicación de réplica de producción y pruebe la compatibilidad de los estados mediante la UpdateApplication API de esta réplica

  • Si el estado no es compatible, seleccione una estrategia entre Migración estatal

  • Habilite la reversión automática en la configuración de su aplicación Flink de producción

Migración estatal

Reconstruir el estado completo

Ideal para aplicaciones en las que el estado se puede reconstruir a partir de los datos de origen.

Si la aplicación puede reconstruir el estado a partir de los datos de origen:

  1. Detenga la aplicación Flink 1.x

  2. Actualice a Flink 2.x con el código actualizado

  3. Comience con SKIP_RESTORE_FROM_SNAPSHOT

  4. Permitir que la aplicación reconstruya el estado

aws kinesisanalyticsv2 start-application \ --application-name MyApplication \ --run-configuration '{ "ApplicationRestoreConfiguration": { "ApplicationRestoreType": "SKIP_RESTORE_FROM_SNAPSHOT" } }'

Prácticas recomendadas

  1. Utilice siempre Avro o Protobuf para estados complejos: estos proporcionan la evolución del esquema y son independientes de las criptomonedas

  2. Evite las colecciones en POJOs: utilice la versión nativa de Flink y, en su lugar ListState MapState

  3. Pruebe la restauración del estado de forma local: antes de la actualización de producción, pruébela con instantáneas reales

  4. Realice instantáneas con frecuencia, especialmente antes de actualizar las versiones principales

  5. Habilitar la reversión automática: configure su aplicación MSF para que se revierta automáticamente en caso de error

  6. Documente sus tipos de estado: mantenga la documentación de todos los tipos de estados y sus métodos de serialización

  7. Supervise el tamaño de los puntos de control: el aumento del tamaño de los puntos de control puede indicar problemas de serialización

Siguientes pasos

Planifique su actualización: consulte. Actualización a Flink 2.2: guía completa

Si tiene preguntas o problemas durante la migración, consulte Resolución de problemas de Managed Service para Apache Flink o póngase en contacto con AWS Support.