Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Panduan kompatibilitas status untuk peningkatan Flink 2.2
Saat memutakhirkan dari Flink 1.x ke Flink 2.2, masalah kompatibilitas status dapat mencegah aplikasi Anda memulihkan dari snapshot. Panduan ini membantu Anda mengidentifikasi potensi masalah kompatibilitas dan menyediakan strategi migrasi.
Memahami perubahan kompatibilitas status
Amazon Managed Service untuk Apache Flink 2.2 memperkenalkan beberapa perubahan serialisasi yang memengaruhi kompatibilitas status. Berikut ini adalah yang utama:
-
Upgrade Versi Kryo: Apache Flink 2.2 meningkatkan serializer Kryo yang dibundel dari versi 2 ke versi 5. Karena Kryo v5 menggunakan format pengkodean biner yang berbeda dari Kryo v2, status operator apa pun yang diserialkan melalui Kryo di savepoint Flink 1.x tidak dapat dipulihkan di Flink 2.2.
-
Serialisasi Koleksi Java: Di Flink 1.x, koleksi Java (seperti
HashMap,ArrayList, danHashSet) di dalamnya POJOs diserialkan menggunakan Kryo. Flink 2.2 memperkenalkan serializer yang dioptimalkan khusus koleksi yang tidak kompatibel dengan status serial KRYO dari 1.x. Aplikasi yang menggunakan koleksi Java dengan serializer POJO atau Kryo di 1.x tidak dapat mengembalikan status ini di Flink 2.2. Lihat dokumentasiFlink untuk detail selengkapnya tentang tipe data dan serialisasi. -
Kompatibilitas Konektor Kinesis: Versi konektor Kinesis Data Streams (KDS) yang lebih rendah dari 5.0 mempertahankan status yang tidak kompatibel dengan konektor Kinesis Flink 2.2 versi 6.0. Anda harus bermigrasi ke konektor versi 5.0 atau lebih tinggi sebelum upgrade Anda.
Referensi kompatibilitas serialisasi
Tinjau semua deklarasi status dalam aplikasi Anda dan cocokkan jenis serialisasi dengan tabel di bawah ini. Jika ada jenis status yang tidak kompatibel, lihat Migrasi negara bagian sebelum melanjutkan dengan pemutakhiran Anda.
| Jenis Serialisasi | Kompatibel? | Detail |
|---|---|---|
Avro (SpecificRecord,GenericRecord) |
Ya | Menggunakan format binernya sendiri yang independen dari Kryo. Pastikan Anda menggunakan informasi tipe Avro asli Flink, bukan Avro terdaftar sebagai serializer Kryo. |
| Protobuf | Ya | Menggunakan pengkodean binernya sendiri yang independen dari Kryo. Verifikasi perubahan skema mengikuti aturan evolusi yang kompatibel ke belakang. |
| POJOs tanpa koleksi | Ya | Ditangani oleh serializer POJO Flink — tetapi hanya jika kelas memenuhi semua kriteria POJO: kelas publik, konstruktor no-arg publik, semua bidang baik publik atau dapat diakses melalui getter/setter, dan semua jenis bidang itu sendiri dapat diserialkan oleh Flink. POJO yang melanggar salah satu dari ini diam-diam jatuh kembali ke Kryo dan menjadi tidak kompatibel. |
| Kustom TypeSerializers | Ya | Kompatibel hanya jika serializer Anda tidak mendelegasikan ke Kryo secara internal. |
| Status SQL dan Tabel API | Ya (dengan peringatan) | Menggunakan serializer internal Flink. Namun, Apache Flink tidak menjamin kompatibilitas status antara versi utama untuk aplikasi Table API. Uji di lingkungan non-produksi terlebih dahulu. |
POJOs dengan koleksi Java (HashMap,ArrayList,HashSet) |
Tidak | Di Flink 1.x, koleksi di dalamnya POJOs diserialkan melalui Kryo v2. Flink 2.2 memperkenalkan serializer koleksi khusus yang format binernya tidak kompatibel dengan format Kryo v2. |
| Kelas kasus scala | Tidak | Diserialkan melalui Kryo di Flink 1.x. Upgrade Kryo v2 ke v5 mengubah format biner. |
| Catatan Java | Tidak | Biasanya kembali ke serialisasi Kryo di Flink 1.x. Verifikasi dengan menguji dengandisableGenericTypes(). |
| Jenis pustaka pihak ketiga | Tidak | Jenis tanpa serializer kustom terdaftar kembali ke Kryo. Perubahan format biner Kryo v2 ke v5 merusak kompatibilitas. |
| Tipe apa pun menggunakan Kryo fallback | Tidak | Jika Flink tidak dapat menangani tipe dengan serializer bawaan atau terdaftar, itu kembali ke Kryo. Semua status serial Kryo dari 1.x tidak kompatibel dengan 2.2. |
Metode diagnostik
Anda dapat mengidentifikasi masalah kompatibilitas status secara proaktif dengan melihat log aplikasi atau memeriksa log setelah operasi UpdateApplication API.
Identifikasi Kryo fallback dalam aplikasi Anda
Anda dapat menggunakan pola regex berikut di log Anda untuk mengidentifikasi fallback Kryo dalam aplikasi Anda:
Class class (?<className>[^\s]+) cannot be used as a POJO type
Log sampel:
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.
Jika pemutakhiran gagal menggunakan UpdateApplication API, pengecualian berikut mungkin menandakan bahwa Anda mengalami ketidakcocokan status berbasis serializer:
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).
Daftar periksa pra-peningkatan
Tinjau semua deklarasi status dalam aplikasi Anda
Periksa POJOs dengan koleksi (
HashMap,ArrayList,HashSet)Verifikasi metode serialisasi untuk setiap jenis status
Buat aplikasi replika prod dan uji kompatibilitas status menggunakan UpdateApplication API pada replika ini
Jika status tidak kompatibel, pilih strategi dari Migrasi negara
Aktifkan auto-rollback dalam konfigurasi aplikasi Flink produksi Anda
Migrasi negara
Membangun kembali status lengkap
Terbaik untuk aplikasi di mana status dapat dibangun kembali dari data sumber.
Jika aplikasi Anda dapat membangun kembali status dari data sumber:
Hentikan aplikasi Flink 1.x
Tingkatkan ke Flink 2.x dengan kode yang diperbarui
Mulailah dengan
SKIP_RESTORE_FROM_SNAPSHOTIzinkan aplikasi untuk membangun kembali status
aws kinesisanalyticsv2 start-application \ --application-name MyApplication \ --run-configuration '{ "ApplicationRestoreConfiguration": { "ApplicationRestoreType": "SKIP_RESTORE_FROM_SNAPSHOT" } }'
Praktik terbaik
Selalu gunakan Avro atau Protobuf untuk keadaan kompleks — Ini memberikan evolusi skema dan tidak bergantung pada Kryo
Hindari koleksi di POJOs - Gunakan asli Flink
ListStatedanMapStatesebagai gantinyaUji restorasi status secara lokal - Sebelum peningkatan produksi, uji dengan snapshot aktual
Sering-seringlah mengambil snapshot — Terutama sebelum upgrade versi utama
Aktifkan auto-rollback - Konfigurasikan aplikasi MSF Anda untuk secara otomatis mengembalikan kegagalan
Dokumentasikan jenis status Anda — Pertahankan dokumentasi semua jenis status dan metode serialisasinya
Pantau ukuran pos pemeriksaan - Ukuran pos pemeriksaan yang berkembang dapat mengindikasikan masalah serialisasi
Langkah selanjutnya
Rencanakan peningkatan Anda: LihatUpgrade ke Flink 2.2: Panduan lengkap.
Untuk pertanyaan atau masalah selama migrasi, lihat Memecahkan Masalah Layanan Terkelola untuk Apache Flink atau hubungi AWS Support.