This is an automated email from the ASF dual-hosted git repository.
alpinegizmo pushed a commit to branch release-2.3
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/release-2.3 by this push:
new c19a3dfe794 [FLINK-39619][docs] Add release notes for Flink 2.3
c19a3dfe794 is described below
commit c19a3dfe7943cdc57c5acb3150fb2540dba35896
Author: Hao Li <[email protected]>
AuthorDate: Mon May 25 12:31:27 2026 -0700
[FLINK-39619][docs] Add release notes for Flink 2.3
---
docs/content/release-notes/flink-2.3.md | 290 +++++++++++++++++++++++++++++++-
1 file changed, 281 insertions(+), 9 deletions(-)
diff --git a/docs/content/release-notes/flink-2.3.md
b/docs/content/release-notes/flink-2.3.md
index 3b239f25996..8ddc99dbd92 100644
--- a/docs/content/release-notes/flink-2.3.md
+++ b/docs/content/release-notes/flink-2.3.md
@@ -27,19 +27,291 @@ These release notes discuss important aspects, such as
configuration, behavior o
that changed between Flink 2.2 and Flink 2.3. Please read these notes
carefully if you are
planning to upgrade your Flink version to 2.3.
+### Table SQL / API
-### Core
+#### FROM_CHANGELOG and TO_CHANGELOG built-in PTFs
-#### Set security.ssl.algorithms default value to modern cipher suite
+##### [FLINK-39258](https://issues.apache.org/jira/browse/FLINK-39258)
(FLIP-564)
-### [FLINK-39022](https://issues.apache.org/jira/browse/FLINK-39022)
+The DataStream API has long offered `toChangelogStream()` and
`fromChangelogStream()` for working
+with changelog streams; Flink 2.3 brings equivalent functionality to SQL via
two new built-in
+Process Table Functions:
-A JDK update (affecting JDK 11.0.30+, 17.0.18+, 21.0.10+, and 24+) disabled
`TLS_RSA_*` cipher suites.
-This was done to support forward-secrecy (RFC 9325) and comply with the IETF
Draft on *Deprecating Obsolete Key Exchange Methods in TLS*.
+- `FROM_CHANGELOG` converts an append-only stream that carries an operation
column into a dynamic
+ table. A configurable `op_mapping` makes it straightforward to plug in
custom CDC formats and
+ controls how rows with unmapped operation codes are treated.
+- `TO_CHANGELOG` is the inverse: it materializes a dynamic table back into an
append-only
+ changelog stream. This is the first SQL-level operator that lets users
convert retract or
+ upsert streams into append form — useful for archival, audit, writing to
append-only sinks,
+ and working around pipelines that require an append-only table.
-To support these and future JDK versions, the default value for the Flink
configuration option `security.ssl.algorithms` has been changed to a modern,
widely available cipher suite:
+The 2.3 release covers limited basic use cases for both. Future versions will
extend both
+functions with `PARTITION BY`, `invalid_op_handling`, `produces_full_deletes`
and more to make
+both features powerful and extensive. See
[FLIP-564](https://cwiki.apache.org/confluence/display/FLINK/FLIP-564%3A+Support+FROM_CHANGELOG+and+TO_CHANGELOG+built-in+PTFs).
-`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384`
+#### CREATE/ALTER for MATERIALIZED TABLE aligned with TABLE
-This default provides strong security and wide compatibility. You can
customize the cipher suites using the `security.ssl.algorithms` configuration
option if your environment has different requirements.
-If these cipher suites are not supported on your setup, you will see that
Flink processes will not be able to connect to each other.
+##### [FLINK-38673](https://issues.apache.org/jira/browse/FLINK-38673)
(FLIP-550)
+
+The DDL surface of `MATERIALIZED TABLE` is brought to parity with regular
tables. `CREATE
+MATERIALIZED TABLE` now accepts an explicit column list (including watermarks
and primary keys)
+in front of the defining `AS` query. `ALTER MATERIALIZED TABLE` gains `ADD`,
`MODIFY` and `DROP`
+operations on metadata and computed columns, plus `RENAME TO`, allowing
materialized tables to
+evolve through the same workflow already used for regular Flink tables.
+
+#### Granular control over data reprocessing during materialized table
evolution
+
+##### [FLINK-39301](https://issues.apache.org/jira/browse/FLINK-39301)
(FLIP-557)
+
+When a materialized table's defining query is changed, Flink would previously
always reprocess
+historical data from the beginning. Flink 2.3 introduces an optional
`START_MODE` clause on
+`CREATE [OR ALTER]` and `ALTER MATERIALIZED TABLE`, letting users start the
refresh pipeline
+`FROM_BEGINNING`, `FROM_NOW[(interval)]`, `FROM_TIMESTAMP(timestamp)`, or
resume from previous
+offsets when available
(`RESUME_OR_FROM_BEGINNING`/`RESUME_OR_FROM_NOW`/`RESUME_OR_FROM_TIMESTAMP`).
+The default remains `FROM_BEGINNING` for backward compatibility.
+
+#### ARTIFACT keyword in CREATE FUNCTION
+
+##### [FLINK-39081](https://issues.apache.org/jira/browse/FLINK-39081)
(FLIP-559)
+
+The `USING` clause of `CREATE FUNCTION` accepts a new `ARTIFACT` keyword as an
alternative to
+`JAR`. `ARTIFACT` is intentionally generic so that future ecosystem assets
(Python wheels, etc.)
+can be referenced through the same syntax. Both keywords are interchangeable
and may even be
+mixed within a single statement; existing `USING JAR` syntax continues to work
unchanged.
+
+```sql
+CREATE FUNCTION my_func AS 'com.example.MyUdf'
+ USING ARTIFACT 's3://bucket/path/my-udf.jar';
+```
+
+#### SinkUpsertMaterializer improvements and changelog disorder handling
+
+##### [FLINK-38926](https://issues.apache.org/jira/browse/FLINK-38926)
(FLIP-558)
+
+Flink 2.3 reworks how `SinkUpsertMaterializer` handles the case where a
query's upsert key
+differs from the sink's primary key. Previously this required maintaining the
full history of
+records and could blow up state. Two changes address this:
+
+- A new `ON CONFLICT` clause with `DO NOTHING`, `DO ERROR` and `DO
DEDUPLICATE` strategies makes
+ the behavior on key conflict explicit. By default, planning now fails when
the upsert and
+ primary keys differ, requiring the user to choose a conflict strategy.
+- Watermark-based record compaction is introduced to fix internal changelog
disorder. The
+ trigger and frequency of compaction are controlled by:
+ - `table.exec.sink.upserts.compaction-mode` (default: `WATERMARK`) —
`WATERMARK` or
+ `CHECKPOINT`.
+ - `table.exec.sink.upserts.compaction-interval` — optional fallback interval
for emitting
+ watermarks when none arrive naturally.
+
+#### Process Table Function enhancements
+
+##### [FLINK-39254](https://issues.apache.org/jira/browse/FLINK-39254)
(FLIP-565)
+
+Process Table Functions (PTFs), introduced in Flink 2.1, gain several
capabilities aligning them
+with the DataStream API:
+
+- **Late data handling**: late records are no longer silently dropped; PTFs
can react to them.
+- **`ORDER BY` on table arguments**: `MyPtf(input => TABLE t PARTITION BY k
ORDER BY ts)` lets a
+ PTF receive partitioned rows in deterministic temporal order.
+
+#### Fix for MiniBatchGroupAggFunction silently dropping records
+
+##### [FLINK-35661](https://issues.apache.org/jira/browse/FLINK-35661)
+
+When mini-batch aggregation is enabled and the planner falls back to a
`ONE_PHASE` aggregation
+strategy (for example, because a UDAF does not implement `merge`),
`MiniBatchGroupAggFunction`
+could silently drop records and produce incorrect aggregation results. The bug
occurred when a
+key's bundle contained only retraction messages with no existing state for
that key — the
+function would `return` from `finishBundle` instead of skipping the key,
dropping all remaining
+keys in the bundle. Flink 2.3 fixes this so the remaining keys are processed
correctly.
+
+### Connectors
+
+#### Flink Native S3 FileSystem
+
+##### [FLINK-38592](https://issues.apache.org/jira/browse/FLINK-38592)
(FLIP-555)
+
+Flink 2.3 introduces a new native S3 file system plugin (`flink-s3-fs-native`)
implemented
+directly on top of the AWS SDK v2, removing the Hadoop and Presto dependencies
of the previous
+S3 connectors. The unified plugin provides both `FileSystem` and
`RecoverableWriter`
+implementations (so streaming sinks retain exactly-once semantics), uses
non-blocking I/O, and
+natively supports modern AWS auth patterns such as IAM Roles for Service
Accounts.
+
+The plugin registers the standard `s3://` URI scheme and is deployed via the
regular plugins
+directory. Configuration uses a new `s3.*` namespace (e.g. `s3.region`,
`s3.endpoint`,
+`s3.path-style-access`, `s3.access-key`, `s3.secret-key`,
`s3.upload.min.part.size`,
+`s3.upload.max.concurrent.uploads`, `s3.bulk-copy.enabled`, `s3.async.enabled`,
+`s3.read.buffer.size`, `s3.entropy.key`, plus SSE-KMS and
chunked-encoding/checksum-validation
+controls).
+
+See the [Native S3 FileSystem
documentation](https://nightlies.apache.org/flink/flink-docs-release-2.3/docs/deployment/filesystems/s3/)
+for setup details.
+
+### Runtime
+
+#### Adaptive Partition Selection for StreamPartitioner
+
+##### [FLINK-31655](https://issues.apache.org/jira/browse/FLINK-31655)
(FLIP-339)
+
+When upstream and downstream parallelism differ, Flink uses
`RebalancePartitioner`, which selects
+target channels round-robin. For jobs that interact with external RPC services
(Redis, HBase,
+LLM serving, etc.) round-robin selection causes severe backpressure as soon as
a single
+downstream subtask slows down — the partitioner keeps feeding it new data even
though it is
+already overloaded. Flink 2.3 adds an adaptive, load-aware partition-selection
mode for
+`StreamPartitioner` that routes records to the least-loaded downstream channel
instead. In
+benchmarks, this delivers up to ~3x throughput improvement under skewed
downstream processing.
+The feature is opt-in via two new options:
+
+- `taskmanager.network.adaptive-partitioner.enabled` (default: `false`)
+- `taskmanager.network.adaptive-partitioner.max-traverse-size` (default: `4`)
— number of
+ channels examined when selecting the idlest target.
+
+#### AdaptiveScheduler rescale history
+
+##### [FLINK-38333](https://issues.apache.org/jira/browse/FLINK-38333)
(FLIP-495)
+
+Streaming jobs running with the adaptive scheduler now record a history of
rescale events,
+including job-vertex parallelisms, slot allocations, scheduler-state
transitions and termination
+reasons. Events are kept in memory and on disk following the existing
`ExecutionGraphInfoStore`
+pattern. The same data is available through new REST endpoints:
+
+- `/jobs/:jobid/rescales/overview`
+- `/jobs/:jobid/rescales/history`
+- `/jobs/:jobid/rescales/details/:rescaleuuid`
+- `/jobs/:jobid/rescales/summary`
+
+The feature is controlled by:
+
+- `web.adaptive-scheduler.rescale-history.size` (default: `0`) — maximum
number of rescale
+ records retained per job. Setting `0` disables the feature.
+
+#### Web UI for AdaptiveScheduler rescale history
+
+##### [FLINK-22258](https://issues.apache.org/jira/browse/FLINK-22258)
(FLIP-487)
+
+Building on FLIP-495, the Flink Web UI gains a new "Rescales" tab for
streaming jobs running
+with the adaptive scheduler. Subpages expose rescale counts, the latest
events, a historical
+timeline, duration statistics with percentiles, per-event details, and the
adaptive scheduler
+configuration in effect. The existing `/jobs/overview` endpoint is extended
with `schedulerType`
+and `jobType` fields so the UI can render adaptive-scheduler-specific
information.
+
+See the [Elastic Scaling
documentation](https://nightlies.apache.org/flink/flink-docs-release-2.3/docs/deployment/elastic_scaling/)
+for details.
+
+#### Watermark alignment improvements for backlog processing
+
+##### [FLINK-37399](https://issues.apache.org/jira/browse/FLINK-37399)
+
+Prior to Flink 2.3, watermark alignment due to the announcement delays was
inadvertently
+limiting how quickly a job could process a backlog. For example with max
allowed drift
+configured to 30s and watermark alignment updated every ~1s, prior to Flink
2.3 watermark
+alignment was de facto capping the backlog processing speed to:
+
+> 30 "event time" seconds per each 1 "real world" second
+
+In Flink 2.3 the watermark alignment was redesigned to solve those
announcement delays by an
+introduction of the watermark alignment buffer. By default this buffer has
size of 3 and it
+delays the application of the watermark alignment algorithm by 3 update
intervals. This means
+in Flink 2.3+ by default watermark alignment will be pausing sources a couple
of seconds later
+than it used to, potentially slightly increasing state size of windowed and
temporal operators.
+However this should be negligible for all practical use cases. Nevertheless,
size of this
+buffer can be configured using:
+
+- `pipeline.watermark-alignment.buffer-size`
+
+Setting its value to zero restores the old behaviour from Flink 2.2. For more
information
+please refer to the documentation of this config option.
+
+#### Checkpointing during recovery
+
+##### [FLINK-35761](https://issues.apache.org/jira/browse/FLINK-35761)
(FLIP-547)
+
+Flink now supports triggering checkpoints while a job is still recovering from
unaligned
+checkpoints. Previously, a checkpoint could only be triggered after all
restored channel state
+had been fully consumed; when the in-flight state was large, this meant no new
checkpoint could
+complete for hours, and any restart or rescaling during that window forced the
job to redo the
+entire recovery from the original checkpoint.
+
+With this feature enabled, jobs can checkpoint early during recovery,
preserving work across
+subsequent restarts and scaling events. Exactly-once semantics are unchanged.
+
+The feature is disabled by default and can be enabled via two new options:
+
+- `execution.checkpointing.unaligned.recover-output-on-downstream.enabled`
(default: `false`)
+- `execution.checkpointing.unaligned.during-recovery.enabled` (default:
`false`, requires the
+ option above to be enabled)
+
+Enabling both is recommended for jobs with large unaligned checkpoint state or
frequent
+rescaling.
+
+#### Application Management
+
+##### [FLINK-38755](https://issues.apache.org/jira/browse/FLINK-38755)
(FLIP-549)
+
+Flink 2.3 introduces a first-class **application** concept that sits above
jobs and unifies the
+behavior of user code across deployment modes. The cluster-job model is
replaced by a
+cluster-application-job hierarchy, with two backing implementations
+(`PackagedProgramApplication` and `SingleJobApplication`). Application
archives are organized
+by cluster and application IDs.
+
+New REST APIs:
+
+- `GET /applications/overview` — list applications.
+- `GET /applications/:applicationid` — application details.
+- `POST /applications/:applicationid/cancel` — cancel an application.
+- `POST /jars/:jarid/run-application` — submit an application asynchronously.
+
+New configuration options:
+
+- `execution.terminate-application-on-any-job-terminated-exceptionally`
(default: `true`).
+- `cluster.id` (default: all-zero UUID).
+- `historyserver.archive.clean-expired-applications` (default: `false`).
+- `historyserver.archive.retained-applications` (default: `-1`).
+
+The Web UI gains an Applications tab and a redesigned home page; jobs link
back to the
+application that owns them. See the
+[Application Lifecycle
documentation](https://nightlies.apache.org/flink/flink-docs-release-2.3/docs/internals/application_lifecycle/)
+for details.
+
+#### Application Capability Enhancement
+
+##### [FLINK-38972](https://issues.apache.org/jira/browse/FLINK-38972)
(FLIP-560)
+
+Building on the application management framework introduced in FLIP-549, Flink
2.3.0 further
+enhances application capabilities via FLIP-560. High-availability (HA)
recovery is strengthened
+by improving the handling of applications and their constituent jobs,
including the automatic
+re-execution of incomplete applications in session mode. Furthermore, Flink
now supports
+multiple batch jobs within a single application, using job names to ensure
correct matching
+during HA recovery. Finally, application-level failure exceptions and
JobManager configurations
+are now exposed through the REST API to facilitate troubleshooting.
+
+#### Robust OTel gRPC metric exporter
+
+##### [FLINK-38603](https://issues.apache.org/jira/browse/FLINK-38603)
(FLIP-553)
+
+Jobs with large numbers of tasks and operators can produce metric payloads big
enough for the
+OTel gRPC backend to reject them, causing exported metric data to be dropped
in production. The
+existing exporter had two concrete limitations: gzip compression was not
exposed in Flink
+configuration, and all data points went out in a single gRPC call without
pagination. Flink 2.3
+adds two opt-in robustness features to address these (all backward compatible):
+
+- `metrics.reporter.otel.exporter.compression` — `gzip` or `none` (default).
+- `metrics.reporter.otel.batch.size` — split a single export into multiple
gRPC calls; default
+ `0` (disabled).
+
+### Documentation
+
+#### Documentation restructure
+
+##### [FLINK-38945](https://issues.apache.org/jira/browse/FLINK-38945)
(FLIP-561)
+
+The Flink documentation has been reorganized to make navigation easier.
Highlights:
+
+- Flink SQL gets a dedicated top-level section, separated from the Table API.
+- Relational streaming concepts (changelogs, dynamic tables, state, etc.) are
promoted to a
+ top-level Concepts section.
+- Python documentation is integrated into the relevant API sections instead of
living in a
+ standalone area.
+- Contributor-facing content has been relocated outside the main user-facing
docs.
+
+Existing URLs continue to work via redirects. The top-level structure is
documented on the
+[docs landing
page](https://nightlies.apache.org/flink/flink-docs-release-2.3/).