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.
HashMapArrayListHashSetPOJOs 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.
| 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:
Stoppen Sie die Flink 1.x-Anwendung
Führen Sie ein Upgrade auf Flink 2.x mit aktualisiertem Code durch
Beginne mit
SKIP_RESTORE_FROM_SNAPSHOTErlauben Sie der Anwendung, den Status wiederherzustellen
aws kinesisanalyticsv2 start-application \ --application-name MyApplication \ --run-configuration '{ "ApplicationRestoreConfiguration": { "ApplicationRestoreType": "SKIP_RESTORE_FROM_SNAPSHOT" } }'
Best Practices
Verwenden Sie immer Avro oder Protobuf für komplexe Zustände — Diese ermöglichen die Schemaentwicklung und sind Kryo-unabhängig
Vermeiden Sie Sammlungen in POJOs — Verwenden Sie stattdessen das native und von Flink
ListStateMapStateTesten Sie die Statuswiederherstellung lokal — Testen Sie vor dem Produktionsupgrade mit tatsächlichen Snapshots
Machen Sie häufig Schnappschüsse — vor allem vor größeren Versionsupgrades
Automatisches Rollback aktivieren — Konfigurieren Sie Ihre MSF-Anwendung so, dass sie bei einem Fehler automatisch zurückkehrt
Dokumentieren Sie Ihre Zustandstypen — Pflegen Sie die Dokumentation aller Zustandstypen und ihrer Serialisierungsmethoden
Ü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.