Learning Platform
Глоссарий Troubleshooting
Урок 02.03 · 26 мин
Продвинутый
Flink evolutionBreaking changesMigrationVersion historyFLIPs

Между Flink 1.18 (октябрь 2023) и Flink 2.2 (апрель 2026) — около 30 месяцев и шесть значимых релизов. За это время Flink прошёл через самые большие breaking changes в своей истории: удалены целые API (DataSet, Scala), фундаментально изменена state-архитектура (disaggregated state), Adaptive Scheduler стал default для streaming. Если вы работаете с production Flink на 1.18 или 1.20, эта эволюция определяет вашу upgrade-стратегию на следующие 1-2 года.

В этом уроке разберём детально, что произошло на каждой ступени, почему было сделано так, какие альтернативы рассматривались, и что это значит для практики.

Контекст: почему такие изменения

Flink развивался с 2014 года. К 2023 году в проекте накопились архитектурные долги:

  • DataSet API — реликт первоначального дизайна, когда Flink ещё конкурировал со Spark на batch. К 2020 году было ясно, что unified DataStream API покрывает все случаи, и DataSet — это duplicate maintenance.
  • Scala API — поддерживалась с самого начала. Но Scala-комьюнити в data engineering постепенно ушло в Spark (Scala 2.12) и Akka (с переходом на Pekko после смены лицензии), а Flink-комьюнити стало в большинстве своём Java-ориентированным. Maintenance Scala API требовал двойных усилий при каждом изменении API.
  • SourceFunction / SinkFunction — старый API connectors, не поддерживающий batch-streaming unification, watermark alignment, и multiple split. Новый Source/Sink V2 (FLIP-27/191) появился в 1.11/1.15, но legacy жил параллельно.
  • State backend assumptions — RocksDB на local disk был основной моделью с 2016 года. Но в эпоху cloud-native + K8s, stateful pods стали проблемой: data locality vs node mobility, scale-up requires state migration, disaster recovery нужно отдельно. Disaggregated state — ответ на эту проблему.
  • Scheduler limitations — Default Scheduler требовал full resources перед стартом job-а. В мире elastic clusters это плохо.

Flink 2.0 (март 2025) — это release, где этот долг ликвидируется. Breaking changes большие, миграция требует усилий, но архитектура становится готовой к next decade.

Карта релизов

Timeline релизов Flink 1.18 -> 2.2
1.18 (Oct 2023)Java 17 support (preview). FLIP-323 Adaptive Scheduler API stabilized. SQL CALL statement. Mostly cleanup release.
1.19 (Mar 2024)Java 21 support. Source V2 production-ready improvements. SQL stored procedures. Last release that's still 'incremental'.
1.20 LTS (Aug 2024)Long-Term Support release. Support до 2027. Многие production-инсталляции на 2026 сидят на 1.20. Stable 1.x — рекомендованный 'предмиграционный' baseline.
2.0 (Mar 2025)МАЖОРНЫЙ release с breaking changes. Удалены: DataSet API, Scala API, SourceFunction, SinkFunction, MemoryStateBackend. Добавлены: disaggregated state (FLIP-423), ForStDB, Adaptive Scheduler как default.
2.1 (Sep 2025)AI inflection: CREATE MODEL (FLIP-437), ML_PREDICT (FLIP-460) для SQL. Improvements к disaggregated state. Operator runtime stabilization.
2.2 (Apr 2026)Current. VECTOR_SEARCH SQL function (FLIP-461). Disaggregated state default для new deployments. Fluss integration в core. Production-grade всё, что начали в 2.0.

1.18 -> 1.19 -> 1.20: дoрожка к major

В большинстве своём — cleanup release перед major. Главное:

  • Java 17 support (preview). Можно было запускать Flink на Java 17 JVM (раньше — только 8/11).
  • Adaptive Scheduler stabilization (FLIP-323). Adaptive Scheduler стал production-ready, хотя default ещё оставался Default Scheduler.
  • SQL CALL statement (FLIP-336). Поддержка вызова user-defined stored procedures из SQL.
  • State Processor API improvements. Удобный API для offline-чтения savepoint-ов.

Главные deprecations в 1.18:

  • MemoryStateBackend — deprecated (alias для HashMapStateBackend, но всё ещё работал). Удалён в 2.0.
  • Несколько Source V1 connectors помечены deprecated.
  • Java 21 support (production). Java 21 — LTS, поэтому production-grade.
  • Source V2 production-ready improvements. К этому моменту почти все built-in connectors перенесены на V2.
  • SQL stored procedures (FLIP-311). Можно создавать процедуры через CREATE PROCEDURE.
  • Async profiler integration — встроенная поддержка профилирования из JM UI.

Deprecations:

  • Scala API официально deprecated (FLIP-265). Communication: “будет удалён в 2.0”.
  • SourceFunction/SinkFunction finalized deprecation.

Это последний релиз 1.x, и Long-Term Support (LTS). Поддержка обещана до 2027 включительно. Это значит, что большое количество production-инсталляций на 2026 сидят именно здесь — и upgrade на 2.x обсуждается осторожно.

Главные фичи 1.20 LTS:

  • Materialized Tables в SQL (FLIP-435). Concept: можно объявить SQL VIEW как materialized, и Flink будет автоматически поддерживать его свежим через streaming aggregation.
  • Hybrid Source improvements. Поддержка switching between bounded и unbounded sources в одном job (например, “сначала прочитай файл, потом переключись на Kafka”).
  • Disaggregated state preview (FLIP-423). Первая публичная версия disaggregated state. Использовалась преимущественно для testing.

1.20 LTS — рекомендованный baseline для миграции на 2.x. Если вы на 1.18/1.19, сначала upgrade до 1.20, стабилизируйтесь, потом — на 2.x.

Flink версии в 2026: что выбирать

Это самый значимый релиз в истории Flink с момента 1.0. Перечислим, что удалено и что добавлено.

Удалённые API

Удалено в Flink 2.0
DataSet APIorg.apache.flink.api.java.DataSet и all связанное. Использовался для batch processing. Replaced: DataStream с Boundedness.BOUNDED + RuntimeExecutionMode.BATCH.
Scala APIflink-scala и flink-streaming-scala удалены полностью. Замена: Java DataStream API. Сообщество может поддерживать форк, но это не часть Apache Flink.
SourceFunctionorg.apache.flink.streaming.api.functions.source.SourceFunction. Удалён, потому что не поддерживает watermark alignment, multiple splits, unified batch/streaming. Замена: Source V2 (FLIP-27).
SinkFunctionorg.apache.flink.streaming.api.functions.sink.SinkFunction. Замена: Sink V2 (FLIP-191) с TwoPhaseCommittingSink для exactly-once.
MemoryStateBackendБыл alias для HashMapStateBackend, удалён окончательно. Use HashMapStateBackend или EmbeddedRocksDBStateBackend.
StatefulSequenceSourceСтарый Source для testing, заменён на DataGeneratorSource в Source V2.
GellyGraph processing API. Снято с поддержки много лет назад, в 2.0 окончательно удалён.
Mesos integrationУдалён ещё в 1.13. К 2026 даже namespace org.apache.flink.mesos удалён.

Главное правило миграции: если ваш job использует что-то из этого списка, в 2.0 он не запустится. Compile errors появятся уже на стадии build против Flink 2.0.

Удалённые конфиги

Многие deprecated configuration keys удалены. Если у вас в flink-conf.yaml есть taskmanager.memory.framework.heap.size, проверьте migration guide — некоторые ключи переименованы.

Добавленные фичи

Добавлено в Flink 2.0
Disaggregated state (FLIP-423)State хранится на DFS (s3, hdfs), локально только cache. Async state API. Решает проблему data locality в K8s, позволяет state быть терабайтным.
ForStDBНовый state backend, оптимизированный под disaggregated режим. LSM-tree, но storage на DFS, не на local disk. Async access patterns.
Adaptive Scheduler defaultAdaptive Scheduler стал default scheduler для streaming-mode. Default Scheduler ещё доступен через configuration, но not recommended for new deployments.
Job submission via REST 2.0Старый REST API endpoints maintained, но новый API дизайн для job submissions. Cleaner error handling, async submission.
Native K8s deployment changesNative K8s integration упрощена. Recommend deploying через flink-kubernetes-operator вместо native.
Java 21 baselineJava 11 minimum, recommended Java 21. Java 8 support окончательно прекращён.

Миграция на 2.0

Если вы на 1.20 LTS и планируете upgrade на 2.0, типичный workflow:

  1. Audit dependencies. Проверьте, нет ли в вашем коде использования удалённых API. Например, grep -r "SourceFunction" --include="*.java" .. Если есть — мигрируйте на Source V2.

  2. Audit configurations. Сравните ваш flink-conf.yaml с migration guide. Переименуйте устаревшие ключи.

  3. Update build. В pom.xml или build.gradle обновите Flink version и зависимости connectors (они теперь живут в отдельных репозиториях, версии независимы).

  4. Test in non-prod. Запустите job в staging-кластере 2.0 с production-like data. Проверьте, что метрики выглядят похожими.

  5. Savepoint compatibility. Проверьте, что savepoint, созданный в 1.20, restore-ится в 2.0. Это поддерживается для большинства state types, но есть edge cases (см. release notes).

  6. Plan downtime для production rollout. Cтоп job-а на 1.20, savepoint, рестарт на 2.0.

2.1 не имеет таких breaking changes, как 2.0, но добавляет AI-фичи, которые становятся центральной темой Flink 2.x.

CREATE MODEL и ML_PREDICT (FLIP-437, FLIP-460)

-- Регистрация LLM-модели как catalog entry
CREATE MODEL gpt5
INPUT (prompt STRING)
OUTPUT (response STRING)
COMMENT 'OpenAI GPT-5 endpoint'
WITH (
  'provider' = 'openai',
  'model' = 'gpt-5',
  'endpoint' = '${OPENAI_ENDPOINT}',
  'api_key' = '${OPENAI_API_KEY}'
);

-- Использование модели в streaming SQL
SELECT
  user_id,
  message,
  ML_PREDICT(gpt5, message) AS llm_response
FROM user_messages;

Это позволяет встраивать LLM-inference прямо в streaming SQL pipeline. Модель регистрируется как catalog object, вызовы — через ML_PREDICT.

Async SQL functions (FLIP-453)

Поддержка async UDF в SQL. Это критично для ML model calls (которые внешние и медленные) — без async UDF каждый row ждёт response от model, throughput падает в десятки раз.

Disaggregated state — production-ready

В 2.0 disaggregated state был доступен, но “use at your own risk”. В 2.1 — production-grade. Несколько крупных Flink users (Alibaba, Tencent) сообщили о успешных production deployments терабайтного state на disaggregated backend.

Сompactions для checkpoint files

Optimization: компакция small checkpoint files на DFS, чтобы уменьшить count files (что важно для S3 listing latency).

Текущая стабильная версия на момент курса. Главные фичи:

VECTOR_SEARCH SQL function (FLIP-461)

-- Vector embeddings table
CREATE TABLE embeddings (
  doc_id STRING,
  embedding ARRAY<FLOAT>
) WITH ('connector' = 'pinecone', ...);

-- Streaming vector search
SELECT
  query.query_id,
  search.doc_id,
  search.similarity
FROM queries query,
LATERAL TABLE(VECTOR_SEARCH(
  embeddings,
  query.query_embedding,
  TOP_K => 10,
  METRIC => 'cosine'
)) search;

Это позволяет делать RAG (Retrieval-Augmented Generation) и semantic search прямо в Flink SQL.

Fluss integration в core

Fluss — stream-storage layer, который был внешним проектом, теперь интегрирован как first-class option для Flink streaming-tables. Это даёт streaming-native lakehouse: ваши данные хранятся в Fluss tables (column-oriented, optimized для analytical queries), и Flink читает/пишет их как streaming sources/sinks.

Подробно — в модуле 14.

Adaptive Batch Scheduler improvements

Adaptive Batch Scheduler (FLIP-187) — отдельный scheduler для batch workloads, который определяет parallelism per-stage в runtime, основываясь на размере intermediate data. В 2.2 он стал default для BATCH-mode execution.

Disaggregated state default

Для new deployments на 2.2 disaggregated state — recommended default. Classic RocksDB на local disk всё ещё доступен и поддерживается, но new docs рекомендуют ForStDB + disaggregated.

Kubernetes operator 1.10

flink-kubernetes-operator достиг версии 1.10 (на момент Flink 2.2). Стабильная multi-tenancy, namespace-isolated deployments, secure secrets management через external secret operators (External Secrets, Sealed Secrets).

Стратегия миграции для production

Если вы — engineering lead, ответственный за Flink-инфраструктуру, ваш план мог бы выглядеть так.

Upgrade modes в Flink K8s Operator

Сценарий 1: текущая база 1.18 / 1.19

  1. Q1 2026: upgrade всех job-ов на 1.20 LTS. Минимальные breaking changes между minor releases.
  2. Q2-Q3 2026: stabilize на 1.20 LTS. Mark technical debt audit для Source V2 migrations.
  3. Q4 2026: pilot 2.2 в non-prod environment. Audit все Source/Sink V1 usages, мигрируйте на V2.
  4. Q1 2027: production rollout 2.2. Включает full integration testing, savepoint compatibility verification.

Сценарий 2: текущая база 1.20 LTS

  1. Q1-Q2 2026: complete Source/Sink V1 -> V2 migration в существующих job-ах.
  2. Q3 2026: pilot 2.2 в staging. Test disaggregated state на маленьком job-е.
  3. Q4 2026: production rollout 2.2. Решите, миграть ли state backend на ForStDB сразу или оставаться на RocksDB.

Сценарий 3: greenfield в 2026

Используйте Flink 2.2 сразу. Никакой legacy. Disaggregated state default, Adaptive Scheduler default, K8s Operator для deployment. Это — золотой стандарт на момент курса.

WARNING

Не торопитесь с миграцией production на 2.0 в первые 6 месяцев после релиза. Любой major release Flink стабилизируется примерно полгода. Production-ready точка — обычно patch release (2.0.2 или 2.0.3). К 2.2 (current) это уже не проблема.

Что осталось от 1.x в 2.x

Не всё изменилось. Многие core API остались стабильными:

  • DataStream API (как concept) — стабильна с 1.0. env.fromSource(...).map(...).keyBy(...).process(...) работает идентично.
  • State APIValueState, MapState, ListState — те же signatures. Меняется реализация (state backends), но user-facing API стабилен.
  • WatermarkStrategy — добавлена в 1.11, стабильна с тех пор. WatermarkStrategy.forBoundedOutOfOrderness(...) работает.
  • Window API.window(TumblingEventTimeWindows.of(...)) работает.
  • Connector API через V2 — стабильна, и rest of Flink scaffolding (RestartStrategy, CheckpointConfig, ExecutionConfig) остался похожим.
  • REST API — большая часть endpoints обратно-совместима с 1.x.
  • Metrics names — большая часть метрик имеет те же имена, что в 1.x. Это критично для dashboards: ваш Grafana dashboard на 1.20 будет работать на 2.2 с минимальными правками.

Это значит: migration не означает rewrite. Большинство job-ов мигрируют изменением imports + замены deprecated calls + Maven version bump.

Code references: что искать в репозитории

Если хотите проследить эволюцию через git history:

# Список FLIP-ов, реализованных в release 2.0:
git log v1.20.0..v2.0.0 --grep "FLIP-" --oneline | head -50

# Список removed классов между 1.20 и 2.0:
git diff v1.20.0..v2.0.0 --name-only --diff-filter=D | grep "\.java$" | head -50

# Список added FLIPs в 2.x:
git log v2.0.0..v2.2.0 --grep "FLIP-" --oneline | head -50

Это даёт точное представление, что изменилось. Лучше любого release notes.

Главные FLIPs последних 30 месяцев:

  • FLIP-265 — Drop Scala API
  • FLIP-323 — Adaptive Scheduler stabilization
  • FLIP-423 — Disaggregated State
  • FLIP-437 — Materialized Tables и CREATE MODEL
  • FLIP-453 — Async UDF
  • FLIP-460 — ML_PREDICT
  • FLIP-461 — VECTOR_SEARCH

Все доступны на confluence.

Что дальше

Модуль 01 закрыт. Дальше — модуль 02, который начинает фундаментальный блок: архитектура Flink на уровне процессов. JobManager и его компоненты (Dispatcher, ResourceManager, JobMaster), TaskManager, slot model, граф трансформаций (StreamGraph -> JobGraph -> ExecutionGraph), HA, типы schedulers.

После него — network stack (модуль 03), memory model (04), state backends (05), checkpoint internals (06), savepoints (07), watermarks (08). Это — фундаментальный блок, обязательный для всех.

Проверка знанийKnowledge check
Ваша компания имеет Flink 1.18 в production: 12 job-ов, общий state ~2 TiB, использует SourceFunction для custom connector к internal message bus, deployment через legacy YARN cluster. План миграции на текущий Flink (2.2). Сформулируйте поэтапный roadmap на 12-18 месяцев с обоснованием каждого шага.
ОтветAnswer
Phase 1 (3 месяца): upgrade на 1.20 LTS. Зачем: 1.20 — LTS до 2027, минимизирует breaking changes vs прыжок сразу на 2.x. Параллельно начать миграцию custom SourceFunction на Source V2 (FLIP-27) — это самая трудозатратная часть, нужно переписать всю логику с разделением SplitEnumerator + SourceReader. Phase 2 (3-4 месяца): миграция с YARN на Kubernetes через flink-kubernetes-operator. YARN deprecation accelerates, K8s — future. Это требует переосмысления deployment pipeline (CI/CD на FlinkDeployment CRD), secrets management, observability stack. Параллельно — завершить Source V2 migration. Phase 3 (3-4 месяца): pilot 2.2 на non-critical job-ах в staging. Test compatibility savepoint 1.20 -> 2.2. Audit performance, особенно для state-heavy job-ов. Phase 4 (3-6 месяцев): production rollout 2.2. Job by job, начиная с less critical. Для каждого: savepoint в 1.20, deploy на 2.2 кластер, restore. Plan downtime windows. Decision point: миграть ли на disaggregated state (FLIP-423) сразу или оставаться на classical RocksDB? Для 2 TiB state — disaggregated даёт benefits в восстановлении, но добавляет latency для state access. Рекомендация: stay на RocksDB первоначально, мигрировать на ForStDB в Phase 5 если нужно. Risks: (a) Source V2 migration — самая большая работа, тестируйте throughput тщательно; (b) state savepoint format compatibility — verify per job; (c) ResourceManager changes между 1.x и 2.x могут require config adjustments. Без этой стратегии прыжок сразу 1.18 -> 2.2 чреват: removed APIs ломают компиляцию, savepoint compatibility под вопросом, deployment changes одновременно с API changes — too much risk.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 4. Что было удалено в Flink 2.0 как breaking changes, и почему это major release не minor?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 3