Между 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.
Карта релизов
1.18 -> 1.19 -> 1.20: дoрожка к major
Flink 1.18 (октябрь 2023)
В большинстве своём — 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.
Flink 1.19 (март 2024)
- 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.
Flink 1.20 LTS (август 2024)
Это последний релиз 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 2.0 (март 2025): major breaking release
Это самый значимый релиз в истории Flink с момента 1.0. Перечислим, что удалено и что добавлено.
Удалённые API
Главное правило миграции: если ваш job использует что-то из этого списка, в 2.0 он не запустится. Compile errors появятся уже на стадии build против Flink 2.0.
Удалённые конфиги
Многие deprecated configuration keys удалены. Если у вас в flink-conf.yaml есть taskmanager.memory.framework.heap.size, проверьте migration guide — некоторые ключи переименованы.
Добавленные фичи
Миграция на 2.0
Если вы на 1.20 LTS и планируете upgrade на 2.0, типичный workflow:
-
Audit dependencies. Проверьте, нет ли в вашем коде использования удалённых API. Например,
grep -r "SourceFunction" --include="*.java" .. Если есть — мигрируйте на Source V2. -
Audit configurations. Сравните ваш
flink-conf.yamlс migration guide. Переименуйте устаревшие ключи. -
Update build. В
pom.xmlилиbuild.gradleобновите Flink version и зависимости connectors (они теперь живут в отдельных репозиториях, версии независимы). -
Test in non-prod. Запустите job в staging-кластере 2.0 с production-like data. Проверьте, что метрики выглядят похожими.
-
Savepoint compatibility. Проверьте, что savepoint, созданный в 1.20, restore-ится в 2.0. Это поддерживается для большинства state types, но есть edge cases (см. release notes).
-
Plan downtime для production rollout. Cтоп job-а на 1.20, savepoint, рестарт на 2.0.
Flink 2.1 (сентябрь 2025): AI inflection
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).
Flink 2.2 (апрель 2026): current
Текущая стабильная версия на момент курса. Главные фичи:
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
- Q1 2026: upgrade всех job-ов на 1.20 LTS. Минимальные breaking changes между minor releases.
- Q2-Q3 2026: stabilize на 1.20 LTS. Mark technical debt audit для Source V2 migrations.
- Q4 2026: pilot 2.2 в non-prod environment. Audit все Source/Sink V1 usages, мигрируйте на V2.
- Q1 2027: production rollout 2.2. Включает full integration testing, savepoint compatibility verification.
Сценарий 2: текущая база 1.20 LTS
- Q1-Q2 2026: complete Source/Sink V1 -> V2 migration в существующих job-ах.
- Q3 2026: pilot 2.2 в staging. Test disaggregated state на маленьком job-е.
- 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. Это — золотой стандарт на момент курса.
Не торопитесь с миграцией 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 API —
ValueState,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). Это — фундаментальный блок, обязательный для всех.