This is an automated email from the ASF dual-hosted git repository.
Abacn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/beam.git
The following commit(s) were added to refs/heads/master by this push:
new 041bd00e4f6 Blog post: Beam modernization at project 10-year mark
(#40368)
041bd00e4f6 is described below
commit 041bd00e4f6d2190fb5bad50b2e2bd85887dc847
Author: Yi Hu <[email protected]>
AuthorDate: Mon Oct 5 12:19:14 2026 -0400
Blog post: Beam modernization at project 10-year mark (#40368)
* Blog post: Beam modernization at project 10-year mark
* Add label
---
.../site/content/en/blog/beam-modernization-10y.md | 243 +++++++++++++++++++++
1 file changed, 243 insertions(+)
diff --git a/website/www/site/content/en/blog/beam-modernization-10y.md
b/website/www/site/content/en/blog/beam-modernization-10y.md
new file mode 100644
index 00000000000..b8ae389cbd5
--- /dev/null
+++ b/website/www/site/content/en/blog/beam-modernization-10y.md
@@ -0,0 +1,243 @@
+---
+title: "Beam modernization at project 10-year mark"
+date: 2026-09-30 20:00:01 -0800
+categories:
+ - blog
+ - update
+authors:
+ - yhu
+
+---
+<!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+## Summary
+
+This blog summarizes recent modernization efforts across the Apache Beam
codebase mainly between Beam 2.68.0 and 2.75.0, such as major package upgrades,
aligning APIs with new programming language standards, deprecations, etc. Note
that **new features** are intentionally not included in the scope of this post,
as it focuses on the modernization effort of existing components. Thank you to
all contributors!
+
+Originally part of the "Beam 3.0" proposal, systematic modernization efforts
were planned towards Beam 2.75.0. As the community agreed on delivering
improvements incrementally while maximally preserving compatibility, we instead
named 2.75.0 the "10-year anniversary release"---marking 10 years since the
first release ([v0.1.0-incubating](/blog/first-release)).
+
+## Package Upgrades
+
+### Core languages
+
+#### \[Java\] Java 25 Support
([**2.69.0**](https://github.com/apache/beam/issues/35627)) and dropped Java 8
support ([**2.74.0**](https://github.com/apache/beam/issues/31678))
+
+Java 8 has been supported since [Beam 2.3.0](/blog/beam-2.3.0). Since 2025,
the ecosystem has shifted to Java 11 and Java 17 for certain core dependencies.
Because Java 8 remained the baseline language version for Beam for a long time,
a phased transition was conducted in subsequent Beam versions:
+
+* Introduced a framework to allow different Beam components with different
Java version compatibility
([**2.66.0**](https://github.com/apache/beam/pull/34858),
[**2.67.0**](https://github.com/apache/beam/pull/35232)).
+
+* Stopped publishing Java 8 SDK container image. Java 8 pipeline execution
uses Java 11 container
([**2.66.0**](https://github.com/apache/beam/pull/35064)).
+
+* IO expansion service
([**2.68.0**](https://github.com/apache/beam/pull/35981)) and certain
components (IcebergIO, HCatalogIO) started moving to Java 11.
+
+And finally, the Beam baseline moved to Java 11. As of Beam 2.75.0, certain
Beam components require Java 17:
+
+* IcebergIO
+* DebeziumIO
+* DeltaIO
+* IO expansion service
+* Spark 4 runner
+
+#### \[Python\] Python 3.13 and 3.14 Support
([**2.69.0**](https://github.com/apache/beam/issues/34869),
[**2.73.0**](https://github.com/apache/beam/issues/37247)) and removed Python
3.9 support ([**2.70.0**](https://github.com/apache/beam/issues/36665))
+
+#### \[Go\] Minimum Go version updated to 1.26
([**2.69.0**](https://github.com/apache/beam/issues/36461),
[**2.73.0**](https://github.com/apache/beam/issues/37897))
+
+#### \[SQL\] Upgraded Beam vendored Calcite from 1.28.0 to 1.40.0 for Beam SQL
([**2.68.0**](https://github.com/apache/beam/issues/35483)) and removed ZetaSQL
support ([**2.68.0**](https://github.com/apache/beam/issues/34423))
+
+Beam SQL was on Calcite 1.28.0 since Beam 2.35.0 (2021). As part of the
Lakehouse initiative, Beam SQL has received renewed attention and moved to
Calcite 1.40.0. A notable new feature is support for dialects such as BigQuery,
SparkSQL, etc.
+
+Here is an example of using a PostgreSQL dialect-provided scalar function in
Beam YAML:
+
+```yaml
+pipeline:
+ transforms:
+ - type: Create
+ name: CreateSampleData
+ config:
+ elements:
+ - {id: 1, tags: "java python go"}
+ - {id: 2, tags: "rust cpp"}
+ - {id: 3, tags: "javascript typescript"}
+ - type: Sql
+ name: TransformWithPostgresFunction
+ input: CreateSampleData
+ config:
+ query: "SELECT id, STRING_TO_ARRAY(tags, ' ') as tag_list FROM
PCOLLECTION"
+ - type: LogForTesting
+ input: TransformWithPostgresFunction
+
+options:
+ calcite_connection_properties: {"fun": "postgresql"}
+```
+
+ZetaSQL support was removed; Calcite SQL with the BigQuery dialect is the
preferred alternative within Beam, or migrating to use BigQuery directly is
also recommended.
+
+### Core dependencies
+
+#### \[Java\] Upgraded Avro to 1.12
([**2.74.0**](https://github.com/apache/beam/pull/38373))
+
+Avro 1.12 was released back in August 2024 and dropped Java 8 support. As part
of Java 8 support removal, Beam upgraded its Avro dependency to 1.12 in Beam
2.74.0.
+
+#### \[Java\] Upgraded GCS connector (gcsio) to 3.x
([**2.74.0**](https://github.com/apache/beam/pull/38419))
+
+GCS connector 3.0 was released back in December 2023 and dropped Java 8
support. As part of Java 8 support removal, Beam upgraded its GCS connector
dependency to 3.1 in Beam 2.74.0. Note that there is a [performance
regression](https://github.com/apache/beam/issues/39548) related to this
upgrade in Beam 2.74.0 and 2.75.0 affecting pipelines with a moderate to heavy
Cloud Storage read workload. To resolve this, upgrading to Beam 2.76.0 is
recommended.
+
+#### \[Python\] Protobuf 6.x Support
([**2.69.0**](https://github.com/apache/beam/pull/35477))
+
+#### \[Python\] Migrated default pickler to cloudpickle and made dill optional
([**2.68.0**](https://github.com/apache/beam/pull/35725),
[**2.69.0**](https://github.com/apache/beam/issues/21298))
+
+Previously, the Python SDK relied on a pinned `dill==0.3.1.1` dependency for
serialization, which frequently caused dependency conflicts and blocked new
Python version upgrades. After switching the default pickler to `cloudpickle`,
Beam migrated the deterministic fallback coder for complex types (`NamedTuple`,
`Enum`, `dataclass`) to `cloudpickle` in Beam 2.68.0 and moved `dill` out of
the core requirements into an optional extra (`apache-beam[dill]`) in Beam
2.69.0.
+
+#### \[Python\] Migrating GCP clients off `google-apitools`
([**2.72.0**](https://github.com/apache/beam/pull/37309),
[**2.75.0**](https://github.com/apache/beam/pull/37639))
+
+The Python SDK has been migrating its internal GCP service integrations off
the legacy `google-apitools` library and generated V1 clients to official
`google-cloud-*` client libraries:
+
+* Migrated Cloud Build client in container builder to `google-cloud-build`
([**2.72.0**](https://github.com/apache/beam/pull/37309)) and removed
standalone `apitools` `HttpError` usages
([**2.72.0**](https://github.com/apache/beam/pull/37296)).
+
+* Migrated Dataflow runner job submission and metrics client from generated
`dataflow_v1b3` `apitools` bindings to `google-cloud-dataflow-client`
([**2.75.0**](https://github.com/apache/beam/pull/37639)).
+
+BigQuery is now the last remaining `google-apitools` client in the Python SDK,
and its migration is in progress.
+
+#### \[YAML\] Switched JavaScript engine from js2py to QuickJS
([**2.75.0**](https://github.com/apache/beam/issues/38473))
+
+Because `js2py` is no longer actively maintained, lacked Python 3.12+ support,
and was affected by
[CVE-2024-28397](https://www.cve.org/CVERecord?id=CVE-2024-28397), Beam YAML
switched its JavaScript UDF execution engine to `quickjs`.
+
+### IO dependencies
+
+#### \[Java\] Upgraded Apache Iceberg to 1.9.2
([**2.68.0**](https://github.com/apache/beam/pull/35981)) and 1.10.0
([**2.69.0**](https://github.com/apache/beam/issues/36123))
+
+Iceberg 1.7.0 dropped Java 8 support. After enabling individual Beam
components to be compiled with different Java versions, IcebergIO was updated
to build on top of Iceberg 1.9.2 in Beam 2.68.0. Later in Beam 2.69.0, it was
upgraded to 1.10.0.
+
+#### \[Java\] Upgraded HCatalogIO to Hive 4.0.1
([**2.71.0**](https://github.com/apache/beam/issues/32189))
+
+HCatalog 4.0 dropped Java 8 support. Beam moved from HCatalog 3.1.3 to 4.0.1
in Beam 2.71.0, requiring Java 11.
+
+#### \[Java\] Elasticsearch 9 Support
([**2.71.0**](https://github.com/apache/beam/issues/36491))
+
+#### \[Java\] Upgraded MongoDB Java driver from 3.x to 5.5.0
([**2.68.0**](https://github.com/apache/beam/pull/35946))
+
+#### \[Java\] Migrated ClickHouseIO to ClickHouse Java Client v2
([**2.72.0**](https://github.com/apache/beam/issues/37610))
+
+### Runners
+
+#### Apache Flink 2.x Runner Support (2.0 since
[**2.72.0**](https://github.com/apache/beam/issues/36947), 2.1 and 2.2 since
[**2.75.0**](https://github.com/apache/beam/issues/38947)) and dropped Flink
1.17 and 1.18 runner support
([**2.75.0**](https://github.com/apache/beam/pull/39006))
+
+Flink 2.0 dropped the legacy DataSet API. Batch pipelines now run on the Flink
DataStream API.
+
+#### Apache Spark 4 Runner Support
([**2.74.0**](https://github.com/apache/beam/issues/38255))
+
+Spark 3.5 (and 4.0) deprecated the DStream API and improved the Dataset
(Structured Streaming) API. Spark 4 streaming support is in progress.
+
+## Programming language interface modernization
+
+### Java
+
+#### JUnit 5 support
([**2.69.0**](https://github.com/apache/beam/issues/18733))
+
+Previously, `TestPipeline` relied on JUnit 4's `TestRule` (`@Rule`). Beam now
provides a dedicated `org.apache.beam:beam-sdks-java-testing-junit` module
featuring `TestPipelineExtension`, enabling JUnit 5 tests to inject
`TestPipeline` via `@ExtendWith` (or configure custom options with
`@RegisterExtension`) while maintaining backward compatibility with JUnit 4:
+
+```java
+import org.apache.beam.sdk.testing.TestPipelineExtension;
+...
+
+@ExtendWith(TestPipelineExtension.class)
+class MyPipelineTest {
+
+ @Test
+ void testPipeline(TestPipeline pipeline) {
+ PCollection<String> output = pipeline.apply("Create", Create.of("hello",
"world"));
+
+ PAssert.that(output).containsInAnyOrder("hello", "world");
+ pipeline.run();
+ }
+}
+```
+
+#### DoFn OutputReceiver fluent OutputBuilder API for extended metadata
([**2.69.0**](https://github.com/apache/beam/issues/34902))
+
+To support extensible per-element metadata (such as Change Data Capture
operations, OpenTelemetry trace propagation, and pipeline drain indicators)
without introducing combinatorial `outputWith*` method overloads on
`OutputReceiver` and `ProcessContext`, `DoFn.OutputReceiver` now provides a
fluent `OutputBuilder` API (`receiver.builder(element)...output()`). See the
[Beam Element Extended Metadata design
doc](https://s.apache.org/beam-element-extended-metadata) for details.
+
+### Python
+
+#### Dataclass-backed Beam portable Row
([**2.73.0**](https://github.com/apache/beam/issues/22085))
+
+Python 3.7 (PEP 557) introduced `dataclass` and recommended it over
`NamedTuple`, while the Beam Python SDK previously only used `NamedTuple` for
Beam Rows under the Beam portable schema framework.
+
+Beam Row also had limited support for custom types: an arbitrary object type
could be assigned to a Beam Row and work within the Python SDK, yet break
across language boundaries.
+
+Incremental improvements have been made to address these limitations:
+
+* Support `dataclass` for Beam Row
([**2.73.0**](https://github.com/apache/beam/issues/22085)).
+
+* Preserving registered `NamedTuple` and `dataclass` types with `register_row`
and field type inference
([**2.74.0**](https://github.com/apache/beam/issues/38108),
[**2.75.0**](https://github.com/apache/beam/issues/38797)).
+
+* Support for Python user types in Beam SQL
([**2.74.0**](https://github.com/apache/beam/issues/20738)).
+
+Using Beam SQL with the Python SDK now supports rows containing arbitrary
Python user types, as well as Python built-in types:
+
+```python
+class Arbitrary:
+ def __init__(self, obj):
+ self.obj = obj
+
+ def __eq__(self, other):
+ return self.obj == other.obj
+
+with Pipeline() as p:
+ out = (
+ p | beam.Create([
+ UserRow(1, Arbitrary(1.0), 1 + 2.5j),
+ UserRow(1, Arbitrary("abc"), -1j),
+ ])
+ | SqlTransform("SELECT arb, complex FROM PCOLLECTION"))
+# result: [(Arbitrary(1.0), 1 + 2.5j), (Arbitrary("abc"), -1j)]
+```
+
+#### Made Beartype the default fallback runtime type checker
([**2.74.0**](https://github.com/apache/beam/issues/38275))
+
+Beam's custom typehint system previously fell back to `Any` for newer standard
Python `typing` constructs. Integrating `beartype` as the default fallback
enables fast runtime type checking for modern Python type annotations (which
can be disabled if needed via `--disable_beartype`).
+
+#### Enhanced typehint support
+
+* for tagged output type hints
([**2.72.0**](https://github.com/apache/beam/issues/37434))
+* for exception handling
([**2.73.0**](https://github.com/apache/beam/issues/37590),
[**2.74.0**](https://github.com/apache/beam/issues/38173))
+
+#### \[Python\] Split optional dependencies
([**2.69.0**](https://github.com/apache/beam/issues/21298),
[**2.70.0**](https://github.com/apache/beam/issues/34554))
+
+Feature- and connector-specific dependencies (`dill`, `hadoop`, `redis`,
`interactive`, `tfrecord`, `yaml`) have been split out of the core
`apache-beam` package into optional extras (e.g., `pip install
apache-beam[gcp,interactive,yaml,redis,hadoop,tfrecord]`), reducing the default
installation footprint and minimizing transitive dependency conflicts.
+
+## Deprecations
+
+### Sunsets
+
+#### \[Runner\] Removed Apache Samza runner support
([**2.74.0**](https://github.com/apache/beam/issues/35448))
+
+Apache Samza has been in a "dormant" state. As part of the Java 8 sunset,
Samza runner support has been removed from Beam.
+
+#### \[IO\] Removed Pub/Sub Lite IO support
([**2.72.0**](https://github.com/apache/beam/issues/37375))
+
+GCP Pub/Sub Lite is no longer available for new customers after September 24,
2024. In line with this, Pub/Sub Lite IO has been sunset from Beam.
+
+### Deprecations
+
+Since the community has decided to keep the major version number for now and
avoid deliberate breaking changes, the following components are marked as
**deprecated** while remaining available.
+
+#### \[Java\] Deprecated Beam Euphoria API
([**2.69.0**](https://github.com/apache/beam/issues/29451))
+
+#### \[Java\] Removed deprecated Hadoop 2.x and 3.2.x versions from IcebergIO
([**2.69.0**](https://github.com/apache/beam/issues/36282))
+
+#### \[Python\] Deprecated native Python SpannerIO in favor of cross-language
wrapper ([**2.68.0**](https://github.com/apache/beam/issues/35860))
+
+#### \[Runner\] Deprecated Twister2 runner support
([**2.68.0**](https://github.com/apache/beam/issues/35905))