Leitfaden zur staatlichen Kompatibilität für Flink 2.2-Upgrades - Managed Service für Apache Flink

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Leitfaden zur staatlichen Kompatibilität für Flink 2.2-Upgrades

Beim Upgrade von Flink 1.x auf Flink 2.2 können Kompatibilitätsprobleme verhindern, dass Ihre Anwendung aus Snapshots wiederhergestellt werden kann. Dieser Leitfaden hilft Ihnen bei der Identifizierung potenzieller Kompatibilitätsprobleme und bietet Migrationsstrategien.

Grundlegendes zu Änderungen der Statuskompatibilität

Amazon Managed Service für Apache Flink 2.2 führt mehrere Serialisierungsänderungen ein, die sich auf die Statuskompatibilität auswirken. Im Folgenden sind die wichtigsten aufgeführt:

  • Kryo-Versionsupgrade: Apache Flink 2.2 aktualisiert den mitgelieferten Kryo-Serializer von Version 2 auf Version 5. Da Kryo v5 ein anderes binäres Kodierungsformat als Kryo v2 verwendet, kann jeder Operatorstatus, der über Kryo in einem Flink 1.x-Savepoint serialisiert wurde, in Flink 2.2 nicht wiederhergestellt werden.

  • Serialisierung von Java-Sammlungen: In Flink 1.x wurden die darin enthaltenen Java-Sammlungen (wie, und) mit Kryo serialisiert. HashMap ArrayList HashSet POJOs Flink 2.2 führt sammlungsspezifisch optimierte Serialisierer ein, die nicht mit dem Kryo-serialisierten Status von 1.x kompatibel sind. Anwendungen, die Java-Sammlungen mit POJO- oder Kryo-Serialisierern in 1.x verwenden, können diesen Zustand in Flink 2.2 nicht wiederherstellen. Weitere Informationen zu Datentypen und Serialisierung finden Sie in der Flink-Dokumentation.

  • Kinesis Connector-Kompatibilität: Die Kinesis Data Streams (KDS) Connector-Version unter 5.0 behält den Status bei, dass er nicht mit dem Flink 2.2 Kinesis Connector Version 6.0 kompatibel ist. Sie müssen vor dem Upgrade auf Connector-Version 5.0 oder höher migrieren.

Kompatibilitätsreferenz zur Serialisierung

Überprüfen Sie alle Statusdeklarationen in Ihrer Anwendung und ordnen Sie die Serialisierungstypen der folgenden Tabelle zu. Wenn ein Zustandstyp nicht kompatibel ist, lesen Sie den Zustandsmigration Abschnitt, bevor Sie mit dem Upgrade fortfahren.

Kompatibilitätsreferenz zur Serialisierung
Typ der Serialisierung Kompatibel? Details
Avro (SpecificRecord,GenericRecord) Ja Verwendet unabhängig von Kryo ein eigenes Binärformat. Stellen Sie sicher, dass Sie die systemeigenen Avro-Typinformationen von Flink verwenden und nicht Avro, das als Kryo-Serializer registriert ist.
Protobuf Ja Verwendet unabhängig von Kryo eine eigene Binärcodierung. Stellen Sie sicher, dass Schemaänderungen abwärtskompatiblen Evolutionsregeln entsprechen.
POJOs ohne Sammlungen Ja Wird vom POJO-Serializer von Flink verarbeitet — aber nur, wenn die Klasse alle POJO-Kriterien erfüllt: öffentliche Klasse, öffentlicher No-Arg-Konstruktor, alle Felder, die entweder öffentlich oder über Getter/Setter zugänglich sind, und alle Feldtypen selbst, die von Flink serialisierbar sind. Ein POJO, das gegen eines dieser Kriterien verstößt, fällt stillschweigend auf Kryo zurück und wird inkompatibel.
Benutzerdefiniert TypeSerializers Ja Nur kompatibel, wenn Ihr Serializer nicht intern an Kryo delegiert.
Status der SQL- und Tabellen-API Ja (mit Vorbehalt) Verwendet die internen Serialisierer von Flink. Apache Flink garantiert jedoch nicht die staatliche Kompatibilität zwischen Hauptversionen für Table-API-Anwendungen. Testen Sie zuerst in einer Umgebung außerhalb der Produktionsumgebung.
POJOs mit Java-Sammlungen (HashMap,ArrayList,HashSet) Nein In Flink 1.x POJOs wurden die darin enthaltenen Sammlungen über Kryo v2 serialisiert. Flink 2.2 führt spezielle Serialisierer für Sammlungen ein, deren Binärformat nicht mit dem Kryo v2-Format kompatibel ist.
Scala-Fallklassen Nein Serialisiert über Kryo in Flink 1.x. Das Upgrade von Kryo v2 auf v5 ändert das Binärformat.
Java-Aufzeichnungen Nein In der Regel wird in Flink 1.x auf die Kryo-Serialisierung zurückgegriffen. Überprüfen Sie dies, indem Sie mit testen. disableGenericTypes()
Bibliothekstypen von Drittanbietern Nein Typen ohne einen registrierten benutzerdefinierten Serializer fallen auf Kryo zurück. Die Änderung des Binärformats von Kryo v2 auf v5 beeinträchtigt die Kompatibilität.
Jeder Typ, der Kryo-Fallback verwendet Nein Wenn Flink einen Typ mit einem eingebauten oder registrierten Serializer nicht verarbeiten kann, fällt er auf Kryo zurück. Der gesamte Kryo-serialisierte Status von 1.x ist mit 2.2 nicht kompatibel.

Diagnostische Methoden

Sie können Probleme mit der Statuskompatibilität entweder proaktiv identifizieren, indem Sie sich die Anwendungsprotokolle ansehen oder die Protokolle nach dem UpdateApplication API-Vorgang überprüfen.

Identifizieren Sie Kryo-Fallback in Ihrer Anwendung

Sie können das folgende Regex-Muster in Ihren Protokollen verwenden, um Kryo-Fallback in Ihrer Anwendung zu identifizieren:

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

Beispielprotokoll:

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.

Wenn das Upgrade mithilfe der UpdateApplication API fehlschlägt, deuten die folgenden Ausnahmen möglicherweise darauf hin, dass Sie auf eine Inkompatibilität des Serializer-basierten Status stoßen:

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).

Checkliste vor dem Upgrade

  • Überprüfen Sie alle staatlichen Erklärungen in Ihrem Antrag

  • Suchen Sie nach POJOs Sammlungen (HashMap,ArrayList,HashSet)

  • Überprüfen Sie die Serialisierungsmethoden für jeden Zustandstyp

  • Erstellen Sie eine Prod-Replica-Anwendung und testen Sie die State-Kompatibilität mithilfe der UpdateApplication API auf diesem Replikat

  • Wenn der Status inkompatibel ist, wählen Sie eine Strategie aus Zustandsmigration

  • Aktivieren Sie das automatische Rollback in der Konfiguration Ihrer Flink-Produktionsanwendung

Zustandsmigration

Vollständigen Status neu erstellen

Am besten für Anwendungen geeignet, bei denen der Status anhand von Quelldaten wiederhergestellt werden kann.

Wenn Ihre Anwendung den Status anhand von Quelldaten neu erstellen kann:

  1. Stoppen Sie die Flink 1.x-Anwendung

  2. Führen Sie ein Upgrade auf Flink 2.x mit aktualisiertem Code durch

  3. Beginne mit SKIP_RESTORE_FROM_SNAPSHOT

  4. Erlauben Sie der Anwendung, den Status wiederherzustellen

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

Best Practices

  1. Verwenden Sie immer Avro oder Protobuf für komplexe Zustände — Diese ermöglichen die Schemaentwicklung und sind Kryo-unabhängig

  2. Vermeiden Sie Sammlungen in POJOs — Verwenden Sie stattdessen das native und von Flink ListState MapState

  3. Testen Sie die Statuswiederherstellung lokal — Testen Sie vor dem Produktionsupgrade mit tatsächlichen Snapshots

  4. Machen Sie häufig Schnappschüsse — vor allem vor größeren Versionsupgrades

  5. Automatisches Rollback aktivieren — Konfigurieren Sie Ihre MSF-Anwendung so, dass sie bei einem Fehler automatisch zurückkehrt

  6. Dokumentieren Sie Ihre Zustandstypen — Pflegen Sie die Dokumentation aller Zustandstypen und ihrer Serialisierungsmethoden

  7. Überwachen Sie die Checkpoint-Größen — Zunehmende Checkpoint-Größen können auf Serialisierungsprobleme hinweisen

Nächste Schritte

Planen Sie Ihr Upgrade: Siehe. Upgrade auf Flink 2.2: Vollständige Anleitung

Bei Fragen oder Problemen während der Migration wenden Sie sich an den Support Fehlerbehebung bei Managed Service für Apache Flink oder wenden Sie sich an den AWS Support.