<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Apache Beam</title><description>Apache Beam is an open source, unified model and set of language-specific SDKs for defining and executing data processing workflows, and also data ingestion and integration flows, supporting Enterprise Integration Patterns (EIPs) and Domain Specific Languages (DSLs). Dataflow pipelines simplify the mechanics of large-scale batch and streaming data processing and can run on a number of runtimes like Apache Flink, Apache Spark, and Google Cloud Dataflow (a cloud service). Beam also brings DSL in different languages, allowing users to easily implement their data integration processes.</description><link>/</link><generator>Hugo -- gohugo.io</generator><item><title>Apache Beam 2.77.0</title><description>
&lt;!--
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.
-->
&lt;p>We are happy to present the new 2.77.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2770-2026-10-07">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.77.0, check out the &lt;a href="https://github.com/apache/beam/milestone/44">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;h3 id="ios">I/Os&lt;/h3>
&lt;ul>
&lt;li>Added &lt;code>schema_update_options&lt;/code> to &lt;code>WriteToBigQuery&lt;/code> file loads, allowing BigQuery load jobs to add nullable fields or relax required fields when appending data (Python) (&lt;a href="https://github.com/apache/beam/issues/21141">#21141&lt;/a>).&lt;/li>
&lt;li>BigQueryIO now supports reading BigQuery Lakehouse runtime catalog (BigLake metastore) Iceberg tables with the Storage Read API, using 4-part &lt;code>project.catalog.namespace.table&lt;/code> identifiers (or a &lt;code>TableReference&lt;/code> with a composite &lt;code>catalog.namespace&lt;/code> dataset id). Previously such references were silently mis-parsed (Java) (&lt;a href="https://github.com/apache/beam/issues/39597">#39597&lt;/a>) .&lt;/li>
&lt;li>SolaceIO now supports reading and writing binary and text content data payload (Java) (&lt;a href="https://github.com/apache/beam/issues/39875">#39875&lt;/a>).&lt;/li>
&lt;li>ClickHouseIO: support writing &lt;code>Decimal(P, S)&lt;/code> / &lt;code>Decimal32/64/128/256&lt;/code> columns (Java) (&lt;a href="https://github.com/apache/beam/issues/39840">#39840&lt;/a>).&lt;/li>
&lt;li>SolaceIO now supports reading and writing user properties (message metadata) (Java) (&lt;a href="https://github.com/apache/beam/issues/40099">#40099&lt;/a>).&lt;/li>
&lt;li>[IcebergIO] AddFiles (&lt;code>IcebergAddFiles&lt;/code> in YAML) can evolve the table schema before registering files, with &lt;code>schema_evolution_options&lt;/code>, &lt;code>required_columns&lt;/code>, &lt;code>incompatible_schema_handling&lt;/code> and &lt;code>unverifiable_file_handling&lt;/code> (Java/YAML, batch only) (&lt;a href="https://github.com/apache/beam/issues/40144">#40144&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>(Java/Python) &lt;code>Watch&lt;/code> can bound its deduplication state by event time, retiring an output key once the greatest emitted timestamp has moved more than the allowed lateness past it. Java adds &lt;code>Watch.growthOf(...).withTimestampCursor()&lt;/code>. Python adds &lt;code>allowed_lateness&lt;/code> for the existing &lt;code>timestamp_cursor&lt;/code> option (&lt;a href="https://github.com/apache/beam/issues/18459">#18459&lt;/a>).&lt;/li>
&lt;li>(Java) Spark Structured Streaming runner: stateful ParDo with state, timers, &lt;code>@RequiresTimeSortedInput&lt;/code> and tagged outputs is now supported in batch mode (&lt;a href="https://github.com/apache/beam/issues/39779">#39779&lt;/a>).&lt;/li>
&lt;li>(Python) Added support for Vertex AI Model Monitoring V2 in RunInference (&lt;a href="https://github.com/apache/beam/issues/39738">#39738&lt;/a>).&lt;/li>
&lt;li>[Flink Runner] Added opt-in static round-robin split assignment for small bounded sources via the new &lt;code>sourceStaticSplitThresholdMb&lt;/code> pipeline option. The default of 0 keeps the existing lazy pull-based assignment (&lt;a href="https://github.com/apache/beam/issues/39873">#39873&lt;/a>).&lt;/li>
&lt;li>Added automatic caching of bounded, single-pane side-input views for classic Java Flink DataStream execution (&lt;a href="https://github.com/apache/beam/issues/39866">#39866&lt;/a>).&lt;/li>
&lt;li>(Python) Added &lt;code>Sample.Any&lt;/code>, the Python equivalent of Java&amp;rsquo;s &lt;code>Sample.any&lt;/code>, which returns up to n arbitrary elements from a PCollection (&lt;a href="https://github.com/apache/beam/issues/18552">#18552&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;ul>
&lt;li>Portable Java SDK now encodes SchemaCoders in a portable way (&lt;a href="https://github.com/apache/beam/issues/34672">#34672&lt;/a>).
&lt;ul>
&lt;li>Original custom Java coder encoding can still be obtained using &lt;a href="https://github.com/apache/beam/blob/2cf0930e7ae1aa389c26ce6639b584877a3e31d9/sdks/java/core/src/main/java/org/apache/beam/sdk/options/StreamingOptions.java#L47">StreamingOptions.setUpdateCompatibilityVersion(&amp;ldquo;2.76&amp;rdquo;)&lt;/a> (&lt;a href="https://github.com/apache/beam/issues/34672">#34672&lt;/a>).&lt;/li>
&lt;li>Fixes (&lt;a href="https://github.com/apache/beam/issues/36496">#36496&lt;/a>), (&lt;a href="https://github.com/apache/beam/issues/30276">#30276&lt;/a>), (&lt;a href="https://github.com/apache/beam/issues/29245">#29245&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>(Python) &lt;code>TensorRTEngineHandlerNumPy&lt;/code> now requires TensorRT 10 or later. TensorRT 8.x is no longer supported, since TensorRT 10 removed the engine binding API the handler was written against (&lt;a href="https://github.com/apache/beam/issues/36306">#36306&lt;/a>).
&lt;ul>
&lt;li>Engines serialized by TensorRT 8.x must be rebuilt, as an engine can only be deserialized by the major version that built it.&lt;/li>
&lt;li>TensorRT 10 and later require a GPU with compute capability 7.5 or higher, which excludes NVIDIA Pascal and Volta GPUs.&lt;/li>
&lt;li>If dropping TensorRT 8.x support is a hard blocker for you, please comment on (&lt;a href="https://github.com/apache/beam/issues/36306">#36306&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>(Java) Fixed the Spark runner firing processing-time timers in reverse timestamp order (&lt;a href="https://github.com/apache/beam/issues/39824">#39824&lt;/a>).&lt;/li>
&lt;li>(Java) Fixed the Spark runner dropping the stored watermark of a streaming source with no update in a batch (&lt;a href="https://github.com/apache/beam/issues/39822">#39822&lt;/a>).&lt;/li>
&lt;li>(Python) Fixed incorrect profiler options handling on portable runners (&lt;a href="https://github.com/apache/beam/issues/39613">#39613&lt;/a>).&lt;/li>
&lt;li>(Java) KafkaIO dynamic reads no longer require the obsolete &lt;code>beam_fn_api&lt;/code> experiment (&lt;a href="https://github.com/apache/beam/issues/29998">#29998&lt;/a>).&lt;/li>
&lt;li>(Prism) Self-checkpointing splittable DoFns now resume after their requested delay instead of immediately, so polling SDFs no longer busy-spin (&lt;a href="https://github.com/apache/beam/issues/39848">#39848&lt;/a>).&lt;/li>
&lt;li>(Java) MongoDbIO read splitting now preserves non-ObjectId &lt;code>_id&lt;/code> types (e.g. string ids) instead of failing to parse the generated range filters (&lt;a href="https://github.com/apache/beam/issues/39900">#39900&lt;/a>).&lt;/li>
&lt;li>(Go) Fixed GCS glob matching silently dropping objects when the glob pattern contains multi-byte characters (&lt;a href="https://github.com/apache/beam/issues/39969">#39969&lt;/a>).&lt;/li>
&lt;li>(Python) Fixed &lt;code>TensorRTEngineHandlerNumPy&lt;/code> failing with &lt;code>CUDA_ERROR_INVALID_VALUE&lt;/code> on models with a single-element input or output tensor (&lt;a href="https://github.com/apache/beam/issues/36306">#36306&lt;/a>).&lt;/li>
&lt;li>(Python) Fixed &lt;code>PickleCoder&lt;/code>/&lt;code>_MemoizingPickleCoder.as_deterministic_coder()&lt;/code> raising &lt;code>TypeError&lt;/code> instead of returning a working deterministic coder (&lt;a href="https://github.com/apache/beam/issues/28558">#28558&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>According to git shortlog, the following people contributed to the 2.77.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Abdelrahman Ibrahim, Aditya Narayan, Ahmed Abualsaud, Alex Bevilacqua, Alexander Pochill, Ali Ebrahim, Andrew Crites, Arun Pandian, Ashwin S, Bruno Volpato, Chamikara Jayalath, Chris Gavin, Claire McGinty, Danny McCormick, Derrick Williams, Eiji Ogiwara, Elia Liu, Fabian Loris, Goutam Adwant, HansMarcus01, Israel Herraiz, Jack McCluskey, Jan Lukavský, Jeremy Schoemaker, Kenneth Knowles, Lalit Yadav, Lawrence Qiu, M Junaid Shaukat, Makoto Nagai, Maksym Tymoshyk, Manvith Panyam, Mattie Fu, Michael Gruschke, Mukesh Bhandarkar, Nicolas Gibanel, Paulius Kuzmickas, Radosław Stankiewicz, Ryan Wigglesworth, Sam Whittle, Sharan Teja M, Shizuma5, Shunping Huang, SreeramaYeshwanthGowd, Tobias Kaymak, Tom Newton, Udit Jain, Vitaly Terentyev, Yi Hu, ZIHAN DAI, akshayjadiyanv, claudevdm, darshan-sj, feefs, junaiddshaukat, kellen, nitinware, parveensania, tvalentyn&lt;/p></description><link>/blog/beam-2.77.0/</link><pubDate>Wed, 07 Oct 2026 14:00:00 -0500</pubDate><guid>/blog/beam-2.77.0/</guid><category>blog</category><category>release</category></item><item><title>Beam modernization at project 10-year mark</title><description>
&lt;!--
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.
-->
&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>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 &lt;strong>new features&lt;/strong> 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!&lt;/p>
&lt;p>Originally part of the &amp;ldquo;Beam 3.0&amp;rdquo; 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 &amp;ldquo;10-year anniversary release&amp;rdquo;&amp;mdash;marking 10 years since the first release (&lt;a href="/blog/first-release">v0.1.0-incubating&lt;/a>).&lt;/p>
&lt;h2 id="package-upgrades">Package Upgrades&lt;/h2>
&lt;h3 id="core-languages">Core languages&lt;/h3>
&lt;h4 id="java-java-25-support-2690httpsgithubcomapachebeamissues35627-and-dropped-java-8-support-2740httpsgithubcomapachebeamissues31678">[Java] Java 25 Support (&lt;a href="https://github.com/apache/beam/issues/35627">&lt;strong>2.69.0&lt;/strong>&lt;/a>) and dropped Java 8 support (&lt;a href="https://github.com/apache/beam/issues/31678">&lt;strong>2.74.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Java 8 has been supported since &lt;a href="/blog/beam-2.3.0">Beam 2.3.0&lt;/a>. 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:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Introduced a framework to allow different Beam components with different Java version compatibility (&lt;a href="https://github.com/apache/beam/pull/34858">&lt;strong>2.66.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/pull/35232">&lt;strong>2.67.0&lt;/strong>&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Stopped publishing Java 8 SDK container image. Java 8 pipeline execution uses Java 11 container (&lt;a href="https://github.com/apache/beam/pull/35064">&lt;strong>2.66.0&lt;/strong>&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>IO expansion service (&lt;a href="https://github.com/apache/beam/pull/35981">&lt;strong>2.68.0&lt;/strong>&lt;/a>) and certain components (IcebergIO, HCatalogIO) started moving to Java 11.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>And finally, the Beam baseline moved to Java 11. As of Beam 2.75.0, certain Beam components require Java 17:&lt;/p>
&lt;ul>
&lt;li>IcebergIO&lt;/li>
&lt;li>DebeziumIO&lt;/li>
&lt;li>DeltaIO&lt;/li>
&lt;li>IO expansion service&lt;/li>
&lt;li>Spark 4 runner&lt;/li>
&lt;/ul>
&lt;h4 id="python-python-313-and-314-support-2690httpsgithubcomapachebeamissues34869-2730httpsgithubcomapachebeamissues37247-and-removed-python-39-support-2700httpsgithubcomapachebeamissues36665">[Python] Python 3.13 and 3.14 Support (&lt;a href="https://github.com/apache/beam/issues/34869">&lt;strong>2.69.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/issues/37247">&lt;strong>2.73.0&lt;/strong>&lt;/a>) and removed Python 3.9 support (&lt;a href="https://github.com/apache/beam/issues/36665">&lt;strong>2.70.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="go-minimum-go-version-updated-to-126-2690httpsgithubcomapachebeamissues36461-2730httpsgithubcomapachebeamissues37897">[Go] Minimum Go version updated to 1.26 (&lt;a href="https://github.com/apache/beam/issues/36461">&lt;strong>2.69.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/issues/37897">&lt;strong>2.73.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="sql-upgraded-beam-vendored-calcite-from-1280-to-1400-for-beam-sql-2680httpsgithubcomapachebeamissues35483-and-removed-zetasql-support-2680httpsgithubcomapachebeamissues34423">[SQL] Upgraded Beam vendored Calcite from 1.28.0 to 1.40.0 for Beam SQL (&lt;a href="https://github.com/apache/beam/issues/35483">&lt;strong>2.68.0&lt;/strong>&lt;/a>) and removed ZetaSQL support (&lt;a href="https://github.com/apache/beam/issues/34423">&lt;strong>2.68.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>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.&lt;/p>
&lt;p>Here is an example of using a PostgreSQL dialect-provided scalar function in Beam YAML:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">pipeline&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">transforms&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Create&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">CreateSampleData&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">elements&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">id: 1, tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;java python go&amp;#34;&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">id: 2, tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;rust cpp&amp;#34;&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- {&lt;span class="nt">id: 3, tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;javascript typescript&amp;#34;&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Sql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">TransformWithPostgresFunction&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">input&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">CreateSampleData&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">query&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;SELECT id, STRING_TO_ARRAY(tags, &amp;#39; &amp;#39;) as tag_list FROM PCOLLECTION&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">LogForTesting&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">input&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">TransformWithPostgresFunction&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">options&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">calcite_connection_properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>{&lt;span class="nt">&amp;#34;fun&amp;#34;: &lt;/span>&lt;span class="s2">&amp;#34;postgresql&amp;#34;&lt;/span>}&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>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.&lt;/p>
&lt;h3 id="core-dependencies">Core dependencies&lt;/h3>
&lt;h4 id="java-upgraded-avro-to-112-2740httpsgithubcomapachebeampull38373">[Java] Upgraded Avro to 1.12 (&lt;a href="https://github.com/apache/beam/pull/38373">&lt;strong>2.74.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>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.&lt;/p>
&lt;h4 id="java-upgraded-gcs-connector-gcsio-to-3x-2740httpsgithubcomapachebeampull38419">[Java] Upgraded GCS connector (gcsio) to 3.x (&lt;a href="https://github.com/apache/beam/pull/38419">&lt;strong>2.74.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>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 &lt;a href="https://github.com/apache/beam/issues/39548">performance regression&lt;/a> 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.&lt;/p>
&lt;h4 id="python-protobuf-6x-support-2690httpsgithubcomapachebeampull35477">[Python] Protobuf 6.x Support (&lt;a href="https://github.com/apache/beam/pull/35477">&lt;strong>2.69.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="python-migrated-default-pickler-to-cloudpickle-and-made-dill-optional-2680httpsgithubcomapachebeampull35725-2690httpsgithubcomapachebeamissues21298">[Python] Migrated default pickler to cloudpickle and made dill optional (&lt;a href="https://github.com/apache/beam/pull/35725">&lt;strong>2.68.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/issues/21298">&lt;strong>2.69.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Previously, the Python SDK relied on a pinned &lt;code>dill==0.3.1.1&lt;/code> dependency for serialization, which frequently caused dependency conflicts and blocked new Python version upgrades. After switching the default pickler to &lt;code>cloudpickle&lt;/code>, Beam migrated the deterministic fallback coder for complex types (&lt;code>NamedTuple&lt;/code>, &lt;code>Enum&lt;/code>, &lt;code>dataclass&lt;/code>) to &lt;code>cloudpickle&lt;/code> in Beam 2.68.0 and moved &lt;code>dill&lt;/code> out of the core requirements into an optional extra (&lt;code>apache-beam[dill]&lt;/code>) in Beam 2.69.0.&lt;/p>
&lt;h4 id="python-migrating-gcp-clients-off-google-apitools-2720httpsgithubcomapachebeampull37309-2750httpsgithubcomapachebeampull37639">[Python] Migrating GCP clients off &lt;code>google-apitools&lt;/code> (&lt;a href="https://github.com/apache/beam/pull/37309">&lt;strong>2.72.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/pull/37639">&lt;strong>2.75.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>The Python SDK has been migrating its internal GCP service integrations off the legacy &lt;code>google-apitools&lt;/code> library and generated V1 clients to official &lt;code>google-cloud-*&lt;/code> client libraries:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Migrated Cloud Build client in container builder to &lt;code>google-cloud-build&lt;/code> (&lt;a href="https://github.com/apache/beam/pull/37309">&lt;strong>2.72.0&lt;/strong>&lt;/a>) and removed standalone &lt;code>apitools&lt;/code> &lt;code>HttpError&lt;/code> usages (&lt;a href="https://github.com/apache/beam/pull/37296">&lt;strong>2.72.0&lt;/strong>&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Migrated Dataflow runner job submission and metrics client from generated &lt;code>dataflow_v1b3&lt;/code> &lt;code>apitools&lt;/code> bindings to &lt;code>google-cloud-dataflow-client&lt;/code> (&lt;a href="https://github.com/apache/beam/pull/37639">&lt;strong>2.75.0&lt;/strong>&lt;/a>).&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>BigQuery is now the last remaining &lt;code>google-apitools&lt;/code> client in the Python SDK, and its migration is in progress.&lt;/p>
&lt;h4 id="yaml-switched-javascript-engine-from-js2py-to-quickjs-2750httpsgithubcomapachebeamissues38473">[YAML] Switched JavaScript engine from js2py to QuickJS (&lt;a href="https://github.com/apache/beam/issues/38473">&lt;strong>2.75.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Because &lt;code>js2py&lt;/code> is no longer actively maintained, lacked Python 3.12+ support, and was affected by &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-28397">CVE-2024-28397&lt;/a>, Beam YAML switched its JavaScript UDF execution engine to &lt;code>quickjs&lt;/code>.&lt;/p>
&lt;h3 id="io-dependencies">IO dependencies&lt;/h3>
&lt;h4 id="java-upgraded-apache-iceberg-to-192-2680httpsgithubcomapachebeampull35981-and-1100-2690httpsgithubcomapachebeamissues36123">[Java] Upgraded Apache Iceberg to 1.9.2 (&lt;a href="https://github.com/apache/beam/pull/35981">&lt;strong>2.68.0&lt;/strong>&lt;/a>) and 1.10.0 (&lt;a href="https://github.com/apache/beam/issues/36123">&lt;strong>2.69.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>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.&lt;/p>
&lt;h4 id="java-upgraded-hcatalogio-to-hive-401-2710httpsgithubcomapachebeamissues32189">[Java] Upgraded HCatalogIO to Hive 4.0.1 (&lt;a href="https://github.com/apache/beam/issues/32189">&lt;strong>2.71.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>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.&lt;/p>
&lt;h4 id="java-elasticsearch-9-support-2710httpsgithubcomapachebeamissues36491">[Java] Elasticsearch 9 Support (&lt;a href="https://github.com/apache/beam/issues/36491">&lt;strong>2.71.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="java-upgraded-mongodb-java-driver-from-3x-to-550-2680httpsgithubcomapachebeampull35946">[Java] Upgraded MongoDB Java driver from 3.x to 5.5.0 (&lt;a href="https://github.com/apache/beam/pull/35946">&lt;strong>2.68.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="java-migrated-clickhouseio-to-clickhouse-java-client-v2-2720httpsgithubcomapachebeamissues37610">[Java] Migrated ClickHouseIO to ClickHouse Java Client v2 (&lt;a href="https://github.com/apache/beam/issues/37610">&lt;strong>2.72.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h3 id="runners">Runners&lt;/h3>
&lt;h4 id="apache-flink-2x-runner-support-20-since-2720httpsgithubcomapachebeamissues36947-21-and-22-since-2750httpsgithubcomapachebeamissues38947-and-dropped-flink-117-and-118-runner-support-2750httpsgithubcomapachebeampull39006">Apache Flink 2.x Runner Support (2.0 since &lt;a href="https://github.com/apache/beam/issues/36947">&lt;strong>2.72.0&lt;/strong>&lt;/a>, 2.1 and 2.2 since &lt;a href="https://github.com/apache/beam/issues/38947">&lt;strong>2.75.0&lt;/strong>&lt;/a>) and dropped Flink 1.17 and 1.18 runner support (&lt;a href="https://github.com/apache/beam/pull/39006">&lt;strong>2.75.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Flink 2.0 dropped the legacy DataSet API. Batch pipelines now run on the Flink DataStream API.&lt;/p>
&lt;h4 id="apache-spark-4-runner-support-2740httpsgithubcomapachebeamissues38255">Apache Spark 4 Runner Support (&lt;a href="https://github.com/apache/beam/issues/38255">&lt;strong>2.74.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Spark 3.5 (and 4.0) deprecated the DStream API and improved the Dataset (Structured Streaming) API. Spark 4 streaming support is in progress.&lt;/p>
&lt;h2 id="programming-language-interface-modernization">Programming language interface modernization&lt;/h2>
&lt;h3 id="java">Java&lt;/h3>
&lt;h4 id="junit-5-support-2690httpsgithubcomapachebeamissues18733">JUnit 5 support (&lt;a href="https://github.com/apache/beam/issues/18733">&lt;strong>2.69.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Previously, &lt;code>TestPipeline&lt;/code> relied on JUnit 4&amp;rsquo;s &lt;code>TestRule&lt;/code> (&lt;code>@Rule&lt;/code>). Beam now provides a dedicated &lt;code>org.apache.beam:beam-sdks-java-testing-junit&lt;/code> module featuring &lt;code>TestPipelineExtension&lt;/code>, enabling JUnit 5 tests to inject &lt;code>TestPipeline&lt;/code> via &lt;code>@ExtendWith&lt;/code> (or configure custom options with &lt;code>@RegisterExtension&lt;/code>) while maintaining backward compatibility with JUnit 4:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">org.apache.beam.sdk.testing.TestPipelineExtension&lt;/span>&lt;span class="o">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">...&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@ExtendWith&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="n">TestPipelineExtension&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="na">class&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">class&lt;/span> &lt;span class="nc">MyPipelineTest&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@Test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">void&lt;/span> &lt;span class="nf">testPipeline&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="n">TestPipeline&lt;/span> &lt;span class="n">pipeline&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="o">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PCollection&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">output&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pipeline&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="na">apply&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;Create&amp;#34;&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="n">Create&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="na">of&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;hello&amp;#34;&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="s">&amp;#34;world&amp;#34;&lt;/span>&lt;span class="o">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">PAssert&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="na">that&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="n">output&lt;/span>&lt;span class="o">).&lt;/span>&lt;span class="na">containsInAnyOrder&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;hello&amp;#34;&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="s">&amp;#34;world&amp;#34;&lt;/span>&lt;span class="o">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pipeline&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="na">run&lt;/span>&lt;span class="o">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="dofn-outputreceiver-fluent-outputbuilder-api-for-extended-metadata-2690httpsgithubcomapachebeamissues34902">DoFn OutputReceiver fluent OutputBuilder API for extended metadata (&lt;a href="https://github.com/apache/beam/issues/34902">&lt;strong>2.69.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>To support extensible per-element metadata (such as Change Data Capture operations, OpenTelemetry trace propagation, and pipeline drain indicators) without introducing combinatorial &lt;code>outputWith*&lt;/code> method overloads on &lt;code>OutputReceiver&lt;/code> and &lt;code>ProcessContext&lt;/code>, &lt;code>DoFn.OutputReceiver&lt;/code> now provides a fluent &lt;code>OutputBuilder&lt;/code> API (&lt;code>receiver.builder(element)...output()&lt;/code>). See the &lt;a href="https://s.apache.org/beam-element-extended-metadata">Beam Element Extended Metadata design doc&lt;/a> for details.&lt;/p>
&lt;h3 id="python">Python&lt;/h3>
&lt;h4 id="dataclass-backed-beam-portable-row-2730httpsgithubcomapachebeamissues22085">Dataclass-backed Beam portable Row (&lt;a href="https://github.com/apache/beam/issues/22085">&lt;strong>2.73.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Python 3.7 (PEP 557) introduced &lt;code>dataclass&lt;/code> and recommended it over &lt;code>NamedTuple&lt;/code>, while the Beam Python SDK previously only used &lt;code>NamedTuple&lt;/code> for Beam Rows under the Beam portable schema framework.&lt;/p>
&lt;p>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.&lt;/p>
&lt;p>Incremental improvements have been made to address these limitations:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Support &lt;code>dataclass&lt;/code> for Beam Row (&lt;a href="https://github.com/apache/beam/issues/22085">&lt;strong>2.73.0&lt;/strong>&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Preserving registered &lt;code>NamedTuple&lt;/code> and &lt;code>dataclass&lt;/code> types with &lt;code>register_row&lt;/code> and field type inference (&lt;a href="https://github.com/apache/beam/issues/38108">&lt;strong>2.74.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/issues/38797">&lt;strong>2.75.0&lt;/strong>&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Support for Python user types in Beam SQL (&lt;a href="https://github.com/apache/beam/issues/20738">&lt;strong>2.74.0&lt;/strong>&lt;/a>).&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Using Beam SQL with the Python SDK now supports rows containing arbitrary Python user types, as well as Python built-in types:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Arbitrary&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">obj&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">obj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">obj&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__eq__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">other&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">obj&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">other&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">obj&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">with&lt;/span> &lt;span class="n">Pipeline&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">p&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">p&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Create&lt;/span>&lt;span class="p">([&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UserRow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Arbitrary&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">1.0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mf">2.5&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UserRow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Arbitrary&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;abc&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">|&lt;/span> &lt;span class="n">SqlTransform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;SELECT arb, complex FROM PCOLLECTION&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># result: [(Arbitrary(1.0), 1 + 2.5j), (Arbitrary(&amp;#34;abc&amp;#34;), -1j)]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="made-beartype-the-default-fallback-runtime-type-checker-2740httpsgithubcomapachebeamissues38275">Made Beartype the default fallback runtime type checker (&lt;a href="https://github.com/apache/beam/issues/38275">&lt;strong>2.74.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Beam&amp;rsquo;s custom typehint system previously fell back to &lt;code>Any&lt;/code> for newer standard Python &lt;code>typing&lt;/code> constructs. Integrating &lt;code>beartype&lt;/code> as the default fallback enables fast runtime type checking for modern Python type annotations (which can be disabled if needed via &lt;code>--disable_beartype&lt;/code>).&lt;/p>
&lt;h4 id="enhanced-typehint-support">Enhanced typehint support&lt;/h4>
&lt;ul>
&lt;li>for tagged output type hints (&lt;a href="https://github.com/apache/beam/issues/37434">&lt;strong>2.72.0&lt;/strong>&lt;/a>)&lt;/li>
&lt;li>for exception handling (&lt;a href="https://github.com/apache/beam/issues/37590">&lt;strong>2.73.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/issues/38173">&lt;strong>2.74.0&lt;/strong>&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h4 id="python-split-optional-dependencies-2690httpsgithubcomapachebeamissues21298-2700httpsgithubcomapachebeamissues34554">[Python] Split optional dependencies (&lt;a href="https://github.com/apache/beam/issues/21298">&lt;strong>2.69.0&lt;/strong>&lt;/a>, &lt;a href="https://github.com/apache/beam/issues/34554">&lt;strong>2.70.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Feature- and connector-specific dependencies (&lt;code>dill&lt;/code>, &lt;code>hadoop&lt;/code>, &lt;code>redis&lt;/code>, &lt;code>interactive&lt;/code>, &lt;code>tfrecord&lt;/code>, &lt;code>yaml&lt;/code>) have been split out of the core &lt;code>apache-beam&lt;/code> package into optional extras (e.g., &lt;code>pip install apache-beam[gcp,interactive,yaml,redis,hadoop,tfrecord]&lt;/code>), reducing the default installation footprint and minimizing transitive dependency conflicts.&lt;/p>
&lt;h2 id="deprecations">Deprecations&lt;/h2>
&lt;h3 id="sunsets">Sunsets&lt;/h3>
&lt;h4 id="runner-removed-apache-samza-runner-support-2740httpsgithubcomapachebeamissues35448">[Runner] Removed Apache Samza runner support (&lt;a href="https://github.com/apache/beam/issues/35448">&lt;strong>2.74.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>Apache Samza has been in a &amp;ldquo;dormant&amp;rdquo; state. As part of the Java 8 sunset, Samza runner support has been removed from Beam.&lt;/p>
&lt;h4 id="io-removed-pubsub-lite-io-support-2720httpsgithubcomapachebeamissues37375">[IO] Removed Pub/Sub Lite IO support (&lt;a href="https://github.com/apache/beam/issues/37375">&lt;strong>2.72.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;p>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.&lt;/p>
&lt;h3 id="deprecations-1">Deprecations&lt;/h3>
&lt;p>Since the community has decided to keep the major version number for now and avoid deliberate breaking changes, the following components are marked as &lt;strong>deprecated&lt;/strong> while remaining available.&lt;/p>
&lt;h4 id="java-deprecated-beam-euphoria-api-2690httpsgithubcomapachebeamissues29451">[Java] Deprecated Beam Euphoria API (&lt;a href="https://github.com/apache/beam/issues/29451">&lt;strong>2.69.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="java-removed-deprecated-hadoop-2x-and-32x-versions-from-icebergio-2690httpsgithubcomapachebeamissues36282">[Java] Removed deprecated Hadoop 2.x and 3.2.x versions from IcebergIO (&lt;a href="https://github.com/apache/beam/issues/36282">&lt;strong>2.69.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="python-deprecated-native-python-spannerio-in-favor-of-cross-language-wrapper-2680httpsgithubcomapachebeamissues35860">[Python] Deprecated native Python SpannerIO in favor of cross-language wrapper (&lt;a href="https://github.com/apache/beam/issues/35860">&lt;strong>2.68.0&lt;/strong>&lt;/a>)&lt;/h4>
&lt;h4 id="runner-deprecated-twister2-runner-support-2680httpsgithubcomapachebeamissues35905">[Runner] Deprecated Twister2 runner support (&lt;a href="https://github.com/apache/beam/issues/35905">&lt;strong>2.68.0&lt;/strong>&lt;/a>)&lt;/h4></description><link>/blog/beam-modernization-10y/</link><pubDate>Wed, 30 Sep 2026 20:00:01 -0800</pubDate><guid>/blog/beam-modernization-10y/</guid><category>blog</category><category>update</category></item><item><title>UnboundedSource and the Watch Transform in the Apache Beam Python SDK</title><description>
&lt;!--
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.
-->
&lt;p>The Apache Beam Python SDK now has an &lt;code>UnboundedSource&lt;/code> API for writing custom
unbounded sources and a &lt;code>Watch&lt;/code> transform for repeatedly polling an input that
keeps growing. I built both during my Google Summer of Code 2026 project with
Apache Beam, mentored by Yi Hu.&lt;/p>
&lt;p>This post describes both APIs as of Beam 2.77.0.&lt;/p>
&lt;h2 id="motivation">Motivation&lt;/h2>
&lt;p>Writing a connector for a message broker or database change feed means deciding
how to read records, save a position, and resume after a failure. Python already
supported custom streaming reads through a splittable DoFn (SDF). Using one
also meant learning how to represent work as a restriction, hand unfinished
work back to the runner, and report progress through a watermark estimator.
&lt;code>UnboundedSource&lt;/code> wraps that machinery in a reader API so source authors can
focus on their connector&amp;rsquo;s reading and checkpoint logic.&lt;/p>
&lt;p>Polling a growing input raises a related problem: how to remember which results
have already been emitted. Python&amp;rsquo;s &lt;code>fileio.MatchContinuously&lt;/code> could poll for
new files, but its deduplication state grew with the number of matched paths.
&lt;code>Watch&lt;/code> makes this polling logic reusable for other inputs, such as an API that
lists newly available records. Its opt-in &lt;code>timestamp_cursor&lt;/code> mode lets old
deduplication history expire when the input&amp;rsquo;s event times keep advancing.&lt;/p>
&lt;h2 id="the-unboundedsource-api">The UnboundedSource API&lt;/h2>
&lt;p>The first public Python
&lt;a href="https://github.com/apache/beam/pull/38724">&lt;code>UnboundedSource&lt;/code> API&lt;/a> addresses a
&lt;a href="https://github.com/apache/beam/issues/19137">long-standing gap&lt;/a> between the Java
and Python SDKs. Source authors implement &lt;code>UnboundedSource&lt;/code>, &lt;code>UnboundedReader&lt;/code>,
and &lt;code>CheckpointMark&lt;/code>, then read the source with &lt;code>beam.io.Read(MySource())&lt;/code>.&lt;/p>
&lt;p>The reader exposes methods such as &lt;code>start()&lt;/code>, &lt;code>advance()&lt;/code>, &lt;code>get_current()&lt;/code>,
&lt;code>get_current_timestamp()&lt;/code>, and &lt;code>get_checkpoint_mark()&lt;/code>. Reading must not block:
returning &lt;code>False&lt;/code> from &lt;code>start()&lt;/code> or &lt;code>advance()&lt;/code> means that no record is available
now, and the reader can resume when more data arrives. The reader also
reports an event-time watermark through &lt;code>get_watermark()&lt;/code>, which Beam uses to
track progress and determine when windows can close. A watermark of
&lt;code>MAX_TIMESTAMP&lt;/code> signals that the source has permanently finished.&lt;/p>
&lt;p>The SDK runs the reader through an SDF. The wrapper saves the reader&amp;rsquo;s
checkpoint with the unfinished work and reports its watermark to the runner.
This lets the same source implementation run on DirectRunner, Prism, Flink, and
Dataflow. Sources can split their work at pipeline startup; an active read is
not subdivided further.&lt;/p>
&lt;p>The wrapper uses bundle finalization to invoke
&lt;code>CheckpointMark.finalize_checkpoint&lt;/code> after the runner has durably committed
the output. A message-queue source can use this hook to acknowledge consumed
messages. Finalization is best effort: a mark may never be finalized, and
retries can produce marks covering overlapping records. The hook must therefore
be idempotent. Readers can also be reused across resumed bundles on the same
worker, with idle readers evicted from a bounded cache, reducing the need to
reopen connections.&lt;/p>
&lt;p>Mentor review led me to limit how many records a reader can emit and how long
it can run before yielding. The wrapper checks these limits between reads.
A busy source needs to yield regularly so the runner can commit its progress
and finalize checkpoints. The
&lt;a href="/documentation/io/developing-io-python/#unboundedsource">Python I/O connector guide&lt;/a>
includes an example source and explains the API&amp;rsquo;s lifecycle.&lt;/p>
&lt;h2 id="the-watch-transform">The Watch transform&lt;/h2>
&lt;p>The Python &lt;a href="https://github.com/apache/beam/pull/39023">&lt;code>Watch&lt;/code> transform&lt;/a> ports
Java&amp;rsquo;s polling transform. For each input element, it calls a user-supplied poll
function, emits newly discovered outputs, and saves progress between rounds.
Polling stops when the poll reports completion or a termination condition fires.
The API includes &lt;code>PollFn&lt;/code>, &lt;code>PollResult&lt;/code>, and the &lt;code>never()&lt;/code> and &lt;code>after_total_of()&lt;/code>
termination conditions.&lt;/p>
&lt;p>A single SDF manages each input&amp;rsquo;s polling, duplicate suppression, output,
waiting, and termination. For example, a poll can repeatedly list files under
a prefix while &lt;code>Watch&lt;/code> remembers which results it has already emitted. Keeping
this lifecycle together also lets the transform save its deduplication state
with its progress.&lt;/p>
&lt;p>An output&amp;rsquo;s identity is the hash of its encoded key. The key defaults to the
output itself, and &lt;code>output_key_fn&lt;/code> can select another identity. &lt;code>Watch&lt;/code> requires
a deterministic key coder so equal keys produce the same fingerprint across
workers and after a restart. A coder with no deterministic form is rejected
when the pipeline is built.&lt;/p>
&lt;p>The default deduplication mode retains a hash for every distinct output key,
so its history grows throughout a long-running watch. This also allows the
transform to recognize an item seen much earlier. The opt-in
&lt;a href="https://github.com/apache/beam/pull/39090">&lt;code>timestamp_cursor&lt;/code> mode&lt;/a> addresses
this &lt;a href="https://github.com/apache/beam/issues/18459">state-growth problem&lt;/a> by
letting history expire as event time advances.&lt;/p>
&lt;p>The cursor records the greatest emitted event time. Outputs more than
&lt;code>allowed_lateness&lt;/code> behind it are skipped, including previously unseen ones,
and hashes older than that threshold can be discarded. This suits inputs
arriving in roughly non-decreasing event time. Increasing &lt;code>allowed_lateness&lt;/code>
accommodates older arrivals while retaining more history. The cursor itself is
a single timestamp; the retained hashes depend on the keys within that time
range. In cursor mode, an item must keep its original event time across polls;
assigning it a new timestamp on every poll can cause it to be emitted again
after its hash expires.&lt;/p>
&lt;p>&lt;a href="https://github.com/apache/beam/pull/39461">Refactoring &lt;code>MatchContinuously&lt;/code> onto &lt;code>Watch&lt;/code>&lt;/a>
replaced its per-file state entries with the &lt;code>Watch&lt;/code> restriction, so continuous
file matching can use cursor mode and stop accumulating an entry for every file
it has ever matched. The existing implementation remains for users who disable
duplicate suppression. The cursor design was also
&lt;a href="https://github.com/apache/beam/pull/39746">ported back to Java&lt;/a>.&lt;/p>
&lt;h2 id="validation-across-runners">Validation across runners&lt;/h2>
&lt;p>I tested both transforms on DirectRunner, Prism, Flink, and Dataflow. The runs
covered pause and resume behavior, acknowledgments, watermarks, and polling.
The &lt;code>UnboundedSource&lt;/code> wrapper passed five end-to-end tests submitted
as Dataflow streaming jobs. For &lt;code>MatchContinuously&lt;/code> on Flink, testing included
killing a worker during a run and restoring from a checkpoint. Prism tests
added files while a watch was running and checked that both deduplication modes
emitted them once and terminated on time.&lt;/p>
&lt;p>These runs exposed issues beyond the SDK implementations:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/apache/beam/pull/39191">Flink&lt;/a> accumulated state entries
when an SDF saved unfinished work. Reusing a state entry addressed the growth.&lt;/li>
&lt;li>&lt;a href="https://github.com/apache/beam/pull/39572">Prism&lt;/a> could leave downstream
records unprocessed when a source paused and resumed without advancing its
watermark. Consumers with new data are now scheduled in that case.&lt;/li>
&lt;li>&lt;a href="https://github.com/apache/beam/pull/39331">Portable Spark batch&lt;/a> gained
support for retaining and resuming unfinished SDF work.&lt;/li>
&lt;/ul>
&lt;p>The work also produced a &lt;a href="https://github.com/apache/beam/pull/39580">local Flink contributor guide&lt;/a>,
documenting the cluster setup used to reproduce and investigate streaming
behavior.&lt;/p>
&lt;h2 id="benchmarks">Benchmarks&lt;/h2>
&lt;p>The &lt;a href="https://github.com/Eliaaazzz/gsoc-2026-beam#6-validation-and-benchmarks">local benchmarks&lt;/a>
measured &lt;code>UnboundedSource&lt;/code> throughput and checkpoint cadence, and &lt;code>Watch&lt;/code>
deduplication overhead as the polled set grew.&lt;/p>
&lt;p>For &lt;code>UnboundedSource&lt;/code>, an in-memory source supplied one million records to
isolate the wrapper&amp;rsquo;s overhead from external I/O. On Prism, a cap of 1,000
records per invocation produced 1,001 self-checkpoints and about 34,000 records
per second. Raising the cap to 10,000 reduced the self-checkpoint count to 101
and reached about 44,000 records per second. A cap of 100,000 reduced the count
to 11, with throughput still around 44,000 records per second. Throughput was
measured from the first record to the last, excluding runner startup.&lt;/p>
&lt;p>The &lt;code>Watch&lt;/code> benchmark repeatedly listed a set that gained 2,000 items per round
for 100 rounds. Each item retained its original event time. Both modes emitted
all 200,000 items once. Cursor mode reduced total time from 111 to 24 seconds
on DirectRunner and from 59 to 15 seconds on Prism. These single-machine
experiments show how checkpoint frequency and growing deduplication history
affect the transforms; distributed benchmarks remain future work.&lt;/p>
&lt;h2 id="remaining-work">Remaining work&lt;/h2>
&lt;p>Both Python APIs remain experimental, and
&lt;a href="https://github.com/apache/beam/issues/19468">Spark streaming SDF support&lt;/a> is
still open. The &lt;a href="https://github.com/Eliaaazzz/gsoc-2026-beam">full project report&lt;/a>
includes the contribution list, documentation, validation details, and benchmark
methodology.&lt;/p>
&lt;p>Thank you to my mentor, Yi Hu, and the Apache Beam community for their guidance
and reviews throughout Google Summer of Code 2026.&lt;/p></description><link>/blog/python-unboundedsource-watch/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +1000</pubDate><guid>/blog/python-unboundedsource-watch/</guid><category>blog</category><category>gsoc</category></item><item><title>Apache Beam 2.76.0</title><description>
&lt;!--
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.
-->
&lt;p>We are happy to present the new 2.76.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2760-2026-08-31">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.76.0, check out the &lt;a href="https://github.com/apache/beam/milestone/44">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>Added a full Iceberg batch and streaming changelog source (CDC) (&lt;a href="https://github.com/apache/beam/issues/38831">#38831&lt;/a>)&lt;/li>
&lt;li>(Java) Added per-element OpenTelemetry trace propagation across stages in the Dataflow Streaming Runner. Enable it with &lt;code>--experiments=enable_otel_defaults,element_metadata_supported,disable_portable_worker&lt;/code>. Cloud Trace incurs additional cost. (&lt;a href="https://github.com/apache/beam/issues/33176">#33176&lt;/a>)&lt;/li>
&lt;li>(Java) Added OpenTelemetry header propagation support for both reads and writes in KafkaIO and PubSubIO. (&lt;a href="https://github.com/apache/beam/issues/33176">#33176&lt;/a>)&lt;/li>
&lt;li>(Java) Added OpenTelemetry tracing support for SpannerIO change streams (&lt;a href="https://github.com/apache/beam/issues/33176">#33176&lt;/a>)&lt;/li>
&lt;li>(Python) JmsIO (IBM MQ, ActiveMQ, and other providers) is now supported in Python via cross-language (&lt;a href="https://github.com/apache/beam/issues/30716">#30716&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="ios">I/Os&lt;/h3>
&lt;ul>
&lt;li>Upgraded Iceberg dependency to 1.11.0 (Java) (&lt;a href="https://github.com/apache/beam/issues/38925">#38925&lt;/a>).&lt;/li>
&lt;li>Add ArrowFlight IO (Java) (&lt;a href="https://github.com/apache/beam/issues/20116">#20116&lt;/a>).&lt;/li>
&lt;li>Added a Delta Lake batch changelog source (CDC) (&lt;a href="https://github.com/apache/beam/issues/39492">#39492&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>Added &lt;code>GroupIntoBatches&lt;/code> transform and the standard
&lt;code>beam:coder:sharded_key:v1&lt;/code> coder to the Go SDK, along with
&lt;code>beam.Coder.IsDeterministic&lt;/code>, &lt;code>beam.PCollection.WindowingStrategy&lt;/code>,
and &lt;code>coder.RegisterDeterministicCoder&lt;/code> for opt-in deterministic
custom coders (Go) (&lt;a href="https://github.com/apache/beam/issues/19868">#19868&lt;/a>).&lt;/li>
&lt;li>TriggerStateMachineRunner changes from BitSetCoder to SentinelBitSetCoder to
encode finished bitset. SentinelBitSetCoder and BitSetCoder are state
compatible. Both coders can decode encoded bytes from the other coder
(&lt;a href="https://github.com/apache/beam/issues/38139">#38139&lt;/a>).&lt;/li>
&lt;li>(Python) Removed the &lt;code>envoy-data-plane&lt;/code> (and transitive &lt;code>betterproto&lt;/code>) dependency; &lt;code>EnvoyRateLimiter&lt;/code> now uses a small vendored protobuf definition instead, resolving dependency conflicts for downstream projects (&lt;a href="https://github.com/apache/beam/issues/37854">#37854&lt;/a>).&lt;/li>
&lt;li>(Java) Supported acknowledge mode for JmsIO (&lt;a href="https://github.com/apache/beam/issues/39253">#39253&lt;/a>).&lt;/li>
&lt;li>(Python) Staged files directory is now automatically added to &lt;code>sys.path&lt;/code> on the Python SDK worker at startup. This makes Python files provided via the &amp;lsquo;&amp;ndash;files_to_stage&amp;rsquo; pipeline option importable in the pipeline code and makes it easier to initialize Python SDK harness at startup via the &lt;code>--beam_plugins&lt;/code> pipeline option. For more information, see the &lt;a href="https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/#staging-files">Staging Individual Files&lt;/a> section of the dependency management docs. This behavior can be disabled by passing the &amp;lsquo;&amp;ndash;experiments=no_staged_dir_in_sys_path&amp;rsquo; pipeline option (&lt;a href="https://github.com/apache/beam/issues/39431">#39431&lt;/a>).&lt;/li>
&lt;li>(Python) Added &lt;code>equal_to_approx&lt;/code>, an &lt;code>assert_that&lt;/code> matcher that compares numeric pipeline outputs with a configurable tolerance (&lt;a href="https://github.com/apache/beam/issues/18028">#18028&lt;/a>).&lt;/li>
&lt;li>(Python) &lt;code>Timestamp&lt;/code> now supports variable subsecond precision, up to nanoseconds. The portable
&lt;code>beam:logical_type:timestamp:v1&lt;/code> logical type now maps to Python&amp;rsquo;s &lt;code>Timestamp&lt;/code> (&lt;a href="https://github.com/apache/beam/issues/39344">#39344&lt;/a>).&lt;/li>
&lt;li>(Python) Added &lt;code>UnboundedSource&lt;/code>, an interface for reading an infinite stream of records with checkpointing, watermark reporting, and bundle finalization. Read one with &lt;code>beam.io.Read&lt;/code>
(&lt;a href="https://github.com/apache/beam/issues/19137">#19137&lt;/a>).&lt;/li>
&lt;li>(Python) Added &lt;code>Watch&lt;/code>, a transform that polls a growing set of outputs for each input element, deduplicates outputs across poll rounds, and stops per a user-supplied termination condition
(&lt;a href="https://github.com/apache/beam/issues/21521">#21521&lt;/a>).&lt;/li>
&lt;li>(Python) Added support to analyze core dumps created after python worker segmentation faults with &lt;code>pystack&lt;/code> (or &lt;code>gdb&lt;/code> if installed) using the &lt;code>--profiler_agent=coredump&lt;/code> pipeline option. (&lt;a href="https://github.com/apache/beam/issues/39484">#39484&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>(Python) Removed &lt;code>google-perftools&lt;/code> from the SDK container images. Users who wish to use &lt;code>--profiler_agent=tcmalloc&lt;/code> should install google-perftools APT package in their custom container images separately (&lt;a href="https://github.com/apache/beam/issues/39323">#39323&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>[IcebergIO] Reading a &lt;code>timestamptz&lt;/code> column will now return a &lt;code>Timestamp.MICROS&lt;/code> Beam logical type to preserve
microseconds (the old Beam &lt;code>Schema.FieldType#DATETIME&lt;/code> primitive type truncates past milliseconds). This may break
the following use cases when a &lt;code>timestamptz&lt;/code> column is present:&lt;/p>
&lt;ul>
&lt;li>Existing streaming read pipelines.&lt;/li>
&lt;li>Managed Iceberg batch reads when upgraded from an older SDK.&lt;/li>
&lt;li>Python reads.&lt;/li>
&lt;/ul>
&lt;p>Use pipeline option &lt;code>--updateCompatibilityVersion=2.75.0&lt;/code> (or any older version) to keep the old behavior (&lt;a href="https://github.com/apache/beam/issues/39344">#39344&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>DoFn.process&lt;/code> returning a &lt;code>str&lt;/code>, &lt;code>bytes&lt;/code>, or &lt;code>dict&lt;/code> (instead of an iterable wrapping one) now raises a &lt;code>TypeError&lt;/code> rather than silently iterating per-character/byte/key (Python) (&lt;a href="https://github.com/apache/beam/issues/18712">#18712&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(Java) Added &lt;code>DRAINING&lt;/code> and &lt;code>DRAINED&lt;/code> states to &lt;code>PipelineResult&lt;/code>, including runner state mappings and Dataflow update handling (&lt;a href="https://github.com/apache/beam/issues/39020">#39020&lt;/a>).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>(Java) IcebergIO and projects that use it must now be built with Java 17 or later as a result of Iceberg 1.11.0 upgrade (&lt;a href="https://github.com/apache/beam/issues/38925">#38925&lt;/a>).&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>Fixed unresolved runtime &lt;code>ValueProvider&lt;/code> options being stringified in Python Dataflow Flex Templates (&lt;a href="https://github.com/apache/beam/issues/39499">#39499&lt;/a>).&lt;/li>
&lt;li>Fixed unbounded checkpoint state growth for splittable DoFns that self-checkpoint on the portable Flink runner (Java) (&lt;a href="https://github.com/apache/beam/issues/27648">#27648&lt;/a>).&lt;/li>
&lt;li>Improved Java pipeline performance by avoiding repeated &lt;code>DoFn&lt;/code> type descriptor resolution when creating cached invokers (&lt;a href="https://github.com/apache/beam/issues/39309">#39309&lt;/a>).&lt;/li>
&lt;li>(Python) Fixed a memory leak in Python SDK caused by storing exceptions with potentially large stack frames in a cache (&lt;a href="https://github.com/apache/beam/issues/39406">#39406&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="known-issues">Known Issues&lt;/h3>
&lt;ul>
&lt;li>(Java) Projects using the Flink runner with Flink 2.1 or later alongside libraries requiring &lt;code>org.lz4:lz4-java&lt;/code> (e.g., Kafka clients) may encounter a Gradle capability conflict, because Flink 2.1+ ships &lt;code>at.yawk.lz4:lz4-java&lt;/code> which declares the same capability. To resolve, add a &lt;code>capabilitiesResolution&lt;/code> rule to your &lt;code>build.gradle&lt;/code> that selects &lt;code>at.yawk.lz4:lz4-java&lt;/code> (&lt;a href="https://github.com/apache/beam/issues/38947">#38947&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>According to git shortlog, the following people contributed to the 2.76.0 release. Thank you to all contributors!&lt;/p>
&lt;p>ADITYA RAJ, Abdelrahman Ibrahim, Ahmed Abualsaud, Alexander Kolb, Amar3tto, Andrew Crites, Arun Pandian, Aryankn29, Atharva Moroney, Avi Kondareddy, Bruno Volpato, Chamikara Jayalath, Chris Qiu, Claire McGinty, Danny McCormick, Derrick Williams, Elia Liu, Florian TREHAUT, Guflly, HansMarcus01, Ian Liao, Ivy Xu, Jack McCluskey, KRITI MITTAL, Kenneth Knowles, Lalit Yadav, Manvith Panyam, Minh Vu, Nikita Grover, PRADDZY, Peter Tran, Radosław Stankiewicz, Ryan Wigglesworth, Shahar Epstein, Shunping Huang, SreeramaYeshwanthGowd, Steven van Rossum, Tarun Annapareddy, Tejas Iyer, Tobias Kaymak, Tomasz Wojdat, Utkarsh Parekh, Venkata Bharath Malapati, Vitaly Terentyev, Yi Hu, ZIHAN DAI, aibrahiim, akshayjadiyanv, atognolas, claudevdm, janaom, jayjayakumar, raman118, shunping, tvalentyn&lt;/p></description><link>/blog/beam-2.76.0/</link><pubDate>Mon, 31 Aug 2026 14:00:00 -0500</pubDate><guid>/blog/beam-2.76.0/</guid><category>blog</category><category>release</category></item><item><title>Beam Summit 2026 | Interview with Raj Katakam, Intuit Credit Karma</title><description>
&lt;!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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.
-->
&lt;h1 id="beam-summit-2026--interview-with-raj-katakam-intuit-credit-karma">Beam Summit 2026 | Interview with Raj Katakam, Intuit Credit Karma&lt;/h1>
&lt;p>Apache Beam and Google Cloud Dataflow are usually known for ETL and batch/streaming processing. &lt;a href="https://www.creditkarma.com/">Intuit Credit Karma&lt;/a> said, why stop there, and built an entire ML platform on top of them.&lt;/p>
&lt;p>Here is my interview with &lt;strong>Raj Katakam&lt;/strong>, Staff Machine Learning Engineer at Intuit Credit Karma. We talked about how they built a unified ML platform on Apache Beam and Dataflow to serve 140 million users, why being active in the Apache Beam community matters to him, and what advice he would give anyone just getting started with Beam and ML.&lt;/p>
&lt;hr>
&lt;p>&lt;strong>Jana: Intuit Credit Karma’s tech stack looks like a dream! You are on Google Cloud and using services like Dataflow, BigQuery, and Managed Airflow (previously, Cloud Composer). What were the main reasons for choosing this stack, and what trade-offs did you have to consider when selecting GCP and Apache Beam/Dataflow?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: The selection of Google Cloud, utilizing BigQuery, Dataflow, and Managed Airflow, was a strategic decision to standardize the ML lifecycle and enable high-velocity development at scale. By leveraging these technologies, we established a unified architectural standard that allows for elastic scalability and reliability across petabyte-scale workloads. This approach ensures that the entire ML lifecycle, from initial experimentation to global production execution, is governed by a consistent framework, providing the necessary infrastructure to manage complex data movements and distributed computing requirements without sacrificing architectural integrity.&lt;/p>
&lt;p>Our goal was to create a unified abstraction layer that could bridge various data processing tools like Spark and BigQuery with ML libraries such as scikit-learn and TensorFlow. GCP provided the deep, native integrations we required to smoothly transition from local prototypes to massive, distributed cloud execution.&lt;/p>
&lt;p>Talking about trade-offs, the biggest hurdle was simplifying the inherent complexity of a multi-framework environment. Even with powerful connectors for GCS and BigQuery, we still had to develop Vega (Intuit Credit Karma’s internal ML platform) to shield our data scientists from manual orchestration and resource management, allowing them to remain focused on a clean, unified Python API.&lt;/p>
&lt;p>&lt;strong>Jana: Dataflow is widely known for ETL and batch/streaming processing, but you took it a step further by using it for ML. You built Vega, a full ML explainability platform on Apache Beam and Dataflow. What motivated that choice, and what advantages did these technologies bring to the project?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: We utilized Dataflow as the distributed execution engine to power the broader Vega ecosystem, which serves as our comprehensive ML platform. It is important to emphasize that explainability is a foundational pillar of this ecosystem, integrated directly into the core architecture rather than treated as a standalone task. By building on Apache Beam, we ensure that every model, whether focused on feature engineering, scoring, or interpretability, benefits from a unified processing model. This integration allows us to maintain rigorous standards for model transparency and governance as a native component of our large-scale distributed ML operations.&lt;/p>
&lt;p>The main motivation was to eliminate the experimentation-to-production gap. Traditional platforms forced data scientists to manually rewrite code for production frameworks, but by using Dataflow and Apache Beam as the core engine, we were able to support both batch and streaming processing alongside ML scoring within a single workflow.&lt;/p>
&lt;p>The primary advantage that came out of this was the unified Python API. It allowed data scientists to build complex, end-to-end data and ML pipelines that transition seamlessly from local development on sampled data to cloud-scale production execution, without architectural changes or manual re-engineering.&lt;/p>
&lt;p>&lt;strong>Jana: Looking back at building Vega, what were the biggest challenges you faced, and what would you do differently today?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: The primary challenges centered on managing the inherent complexities of distributed systems and maintaining architectural coherence across a diverse ML lifecycle. Operating at the scale of over 140 million members requires solving for high-concurrency data access, managing complex dependency graphs in distributed environments, and ensuring that performance remains consistent as workloads transition from sampled data to massive production clusters. Balancing the need for developer flexibility with the strict latency and reliability constraints of a globally distributed platform represents the most significant architectural hurdle in modern ML engineering.&lt;/p>
&lt;p>Reflecting on the evolution of Vega, the biggest challenge was navigating the trade-offs of building critical infrastructure while scaling to support massive business growth with limited resources. We prioritized speed-to-market and immediate utility to enable the business, which was necessary but created technical debt in terms of documentation and onboarding. If I were starting today, I would prioritize earlier investments in developer tooling and standardized templates. We are now shifting our focus from that initial fast-and-lean build phase to long-term sustainability, refining the developer experience, automating maintenance even further, and broadening support for modern ML paradigms. This ensures that the platform remains a scalable, durable asset as it evolves to meet the next generation of business needs.&lt;/p>
&lt;p>&lt;strong>Jana: Are there any features or improvements you would love to see in Apache Beam or Dataflow in the future?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: While Vega has successfully leveraged Beam for our core workflows, there are a few areas where future improvements could make a real difference. One would be enhanced data engineering primitives. We would value deeper native support for large-scale data manipulation, specifically generalized tiling operations for distributed datasets and built-in capabilities for saving and managing partial processing states. This would significantly reduce the complexity of checkpointing and state recovery in our pipelines.&lt;/p>
&lt;p>The other area is real-time inference. While we have strong batch capabilities, we need more streamlined primitives in Beam to better integrate our data pipelines with real-time serving infrastructure. Reducing the complexity of the hand-off between processing and prediction would be a major win for our personalization engines.&lt;/p>
&lt;p>&lt;strong>Jana: You are a Staff Machine Learning Engineer at Intuit Credit Karma — could you tell us a bit about your background and journey to this role? And for readers who are interested in pursuing a career in ML, what advice would you give them?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: As a Staff Machine Learning Engineer, my career has been defined by the practice of platform-scale engineering. I have focused on architecting ecosystems that provide high-velocity developer experiences, allowing engineering teams to move from conceptual design to production-scale deployment within a unified framework. By treating the ML lifecycle as a first-class engineering problem, we build systems that automate the complexities of infrastructure management, enabling data scientists to focus on model innovation while the platform handles the rigorous demands of distributed execution and governance.&lt;/p>
&lt;p>My advice to anyone pursuing a career in ML would be to focus on first-principles thinking. Don’t just learn a specific library, understand the underlying data infrastructure, including data movement, latency constraints, and caching. The most impactful engineers I have worked with, including those I have collaborated with at Google and beyond, are the ones who can reason across domains, from low-level feature serving latency to high-level platform architecture.&lt;/p>
&lt;p>&lt;strong>Jana: You are an active member of the Apache Beam community. This is your third Beam Summit. How important do you think community involvement is for engineers, and how has it shaped your career?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: Community involvement is critical. Participating in initiatives like the Apache Beam Summit has allowed me to stay at the frontier of distributed computing and directly influence the evolution of the tools we depend on. It transforms engineering from a siloed task into a collaborative effort; seeing how other engineers solve (or struggle with) similar problems helps refine your own architectural decisions and often provides the reference architectures that we would otherwise have taken years to develop independently.&lt;/p>
&lt;p>&lt;strong>Jana: If you could give one piece of advice to someone just starting with Apache Beam, what would it be?&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: Focus on the abstraction. Do not treat Beam as just another processing framework; treat it as the “universal language” for your data pipeline. Start by leveraging the high-level transforms and built-in IO connectors rather than trying to optimize low-level custom code immediately. Understanding how to structure your pipeline to take advantage of Beam’s windowing and triggering capabilities is what will eventually separate a good engineer from a great one when you hit the scale of millions of users.&lt;/p>
&lt;p>&lt;strong>Jana: Thank you so much, Raj, for sharing these insights!&lt;/strong>&lt;/p>
&lt;p>&lt;strong>Raj&lt;/strong>: Thank you for having me, Jana, this was a great conversation!&lt;/p>
&lt;hr>
&lt;p>🌐 To learn more about &lt;strong>Intuit Credit Karma&lt;/strong>, visit their &lt;a href="https://www.creditkarma.com/">website&lt;/a> or check out their &lt;a href="https://www.linkedin.com/company/intuitcreditkarma/">LinkedIn&lt;/a>. You can also connect with &lt;strong>Raj&lt;/strong> directly on &lt;a href="https://www.linkedin.com/in/rajkiran2190">LinkedIn&lt;/a>.&lt;/p>
&lt;p>📌 Raj and Pallav Anand presented at Beam Summit 2026. Check out their talk, &lt;a href="https://beamsummit.org/sessions/2026/beyond-the-black-box-how-intuit-credit-karma-runs-ml-explainability-for-140m-members-with-beam/">‘Beyond the Black Box: How Intuit Credit Karma Runs ML Explainability for 140M Members with Beam’&lt;/a>, and explore the full program at &lt;a href="https://beamsummit.org/sessions/2026/">beamsummit.org&lt;/a>.&lt;/p>
&lt;p>📺 Session recording will be available on the &lt;a href="https://www.youtube.com/@ApacheBeamYT">Apache Beam YouTube channel&lt;/a>.&lt;/p>
&lt;p>📰 Missed the Beam Summit 2026? Read my recap: &lt;a href="https://medium.com/google-cloud/beam-summit-2026-apache-beam-just-got-even-more-interesting-7c6c9967ffb9">Beam Summit 2026: Apache Beam Just Got Even More Interesting 🐝&lt;/a>&lt;/p>
&lt;p>– &lt;a href="https://www.linkedin.com/in/jana-polianskaja/">Jana Polianskaja&lt;/a>&lt;/p></description><link>/blog/beam-summit-2026-interview-with-raj-katakam/</link><pubDate>Wed, 22 Jul 2026 15:00:00 -0500</pubDate><guid>/blog/beam-summit-2026-interview-with-raj-katakam/</guid><category>blog</category></item><item><title>Apache Beam 2.75.0</title><description>
&lt;!--
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.
-->
&lt;p>We are happy to present the new 2.75.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2750-2026-07-08">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.75.0, check out the &lt;a href="https://github.com/apache/beam/milestone/43">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>Python SDK now supports memory profiling with Memray (&lt;a href="https://github.com/apache/beam/issues/38853">#38853&lt;/a>).&lt;/li>
&lt;li>(Python) Added &lt;a href="https://qdrant.tech/">Qdrant&lt;/a> VectorDatabaseWriteConfig implementation (&lt;a href="https://github.com/apache/beam/issues/38141">#38141&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="ios">I/Os&lt;/h3>
&lt;ul>
&lt;li>Support for reading from Delta Lake added (Java) (&lt;a href="https://github.com/apache/beam/issues/38551">#38551&lt;/a>).&lt;/li>
&lt;li>ClickHouseIO: support writing &lt;code>DateTime64(precision[, 'timezone'])&lt;/code> columns with sub-second precision (Java) (&lt;a href="https://github.com/apache/beam/issues/38466">#38466&lt;/a>).&lt;/li>
&lt;li>Upgraded IO Expansion Service to Java 17 (&lt;a href="https://github.com/apache/beam/issues/38974">#38974&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>Dataflow Runner v2 has been renamed to Dataflow Portable Runner. Please refer to Dataflow &lt;a href="https://docs.cloud.google.com/dataflow/docs/runner-v2">public documentation&lt;/a> on when to enable Portable Runner.(&lt;a href="https://github.com/apache/beam/issues/39000">#39000&lt;/a>).&lt;/li>
&lt;li>(Java) Enabled state tag encoding v2 by default for new Dataflow Streaming Engine jobs. It can be disabled by passing &lt;code>--experiments=disable_streaming_engine_state_tag_encoding_v2&lt;/code> or &lt;code>--updateCompatibilityVersion=2.74.0&lt;/code> pipeline option. Note that the tag encoding version cannot change during a job update. Jobs using tag encoding v2 (enabled by default for new jobs on 2.75.0+) cannot be downgraded to Beam versions prior to 2.73.0, as only versions 2.73.0 and later support tag encoding v2. (&lt;a href="https://github.com/apache/beam/issues/38705">#38705&lt;/a>).&lt;/li>
&lt;li>(Python) Added instrumentation to support off-the-shelf profiling agents when launching Python SDK Harness (&lt;a href="https://github.com/apache/beam/issues/38853">#38853&lt;/a>).&lt;/li>
&lt;li>(Java) Added support to the FnApi Data stream protocol allowing runners to isolate bundles slowly processing input from other bundles. (&lt;a href="https://github.com/apache/beam/issues/39001">#39001&lt;/a>).&lt;/li>
&lt;li>(YAML) Switched js2py library to Quickjs (&lt;a href="https://github.com/apache/beam/issues/38473">#38473&lt;/a>).&lt;/li>
&lt;li>(YAML) Added HuggingFaceModelHandler for YAML usage (&lt;a href="https://github.com/apache/beam/issues/38696">#38696&lt;/a>).&lt;/li>
&lt;li>(YAML) Added WriteToMongoDB transform (&lt;a href="https://github.com/apache/beam/issues/38376">#38376&lt;/a>).&lt;/li>
&lt;li>(YAML) Added WriteToDatadog transform (&lt;a href="https://github.com/apache/beam/issues/38362">#38362&lt;/a>).&lt;/li>
&lt;li>(Java) Flink 2.1 and 2.2 support is added (&lt;a href="https://github.com/apache/beam/issues/38947">#38947&lt;/a>) (&lt;a href="https://github.com/apache/beam/issues/38978">#38978&lt;/a>); Flink 1.17 and 1.18 support is dropped.&lt;/li>
&lt;li>(Python) MqttIO is now supported in Python via cross-language (&lt;a href="https://github.com/apache/beam/issues/21060">#21060&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;ul>
&lt;li>(Python) Typehints of dataclass fields are honored during type inferences. To restore the behavior of fallback-to-any,
use pipeline option &lt;code>--exclude_infer_dataclass_field_type&lt;/code> (&lt;a href="https://github.com/apache/beam/issues/38797">#38797&lt;/a>).
However fixing forward is recommended.&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>Fixed GCS filesystem glob matching to correctly handle &lt;code>/&lt;/code> in object names and support &lt;code>**&lt;/code> for recursive matching (Go) (&lt;a href="https://github.com/apache/beam/issues/38059">#38059&lt;/a>).&lt;/li>
&lt;li>Fixed BigQueryEnrichmentHandler batch mode dropping earlier requests when multiple requests share the same enrichment key (Python) (&lt;a href="https://github.com/apache/beam/issues/38035">#38035&lt;/a>).&lt;/li>
&lt;li>Fixed IcebergIO writing manifest column bounds padded with trailing &lt;code>0x00&lt;/code> bytes, which broke equality predicate pushdown in some query engines (Java) (&lt;a href="https://github.com/apache/beam/issues/38580">#38580&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="known-issues">Known Issues&lt;/h3>
&lt;ul>
&lt;li>(Java) Projects using the Flink runner with Flink 2.1 or later alongside libraries requiring &lt;code>org.lz4:lz4-java&lt;/code> (e.g., Kafka clients) may encounter a Gradle capability conflict, because Flink 2.1+ ships &lt;code>at.yawk.lz4:lz4-java&lt;/code> which declares the same capability. To resolve, add a &lt;code>capabilitiesResolution&lt;/code> rule to your &lt;code>build.gradle&lt;/code> that selects &lt;code>at.yawk.lz4:lz4-java&lt;/code> (&lt;a href="https://github.com/apache/beam/issues/38947">#38947&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>According to git shortlog, the following people contributed to the 2.75.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Abdelrahman Ibrahim, Ahmed Abualsaud, Akshat, Andrew Crites, Andrew Kabas, Anurag Pappula, Arpit Jain, Arun Pandian, Atharv, Chamikara Jayalath, Danny McCormick, Deji Ibrahim, Derrick Williams, Drew Stevens, Durgaprasad M L, Elia Liu, Enzo Maruffa Moreira, Ganesh Sivakumar, Goutam Adwant, HansMarcus01, Jack McCluskey, Joe Santos, Kenneth Knowles, Lalit Yadav, Liam Miller-Cushon, Maciej Szwaja, Manan Mangal, Michael Gruschke, Nikita Grover, Radek Stankiewicz, Radosław Stankiewicz, Reuven Lax, RuiLong J., Sachin Ranjalkar, Sagnik Ghosh, Sam Whittle, Shunping Huang, Subramanya V, Tarun Annapareddy, Tobias Kaymak, TongruiLi, Valentyn Tymofieiev, Vitaly Terentyev, XQ Hu, Yi Hu, aaaZayne, claudevdm, ddebowczyk92, innuendo, kellen, parveensania, tejasiyer-dev&lt;/p></description><link>/blog/beam-2.75.0/</link><pubDate>Wed, 08 Jul 2026 14:00:00 -0500</pubDate><guid>/blog/beam-2.75.0/</guid><category>blog</category><category>release</category></item><item><title>Apache Beam 2.74.0</title><description>
&lt;!--
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.
-->
&lt;p>We are happy to present the new 2.74.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2740-2026-06-02">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.74.0, check out the &lt;a href="https://github.com/apache/beam/milestone/42">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>Spark 4 runner support for Java SDK (&lt;a href="https://github.com/apache/beam/issues/38255">#38255&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="ios">I/Os&lt;/h3>
&lt;ul>
&lt;li>IcebergIO: support declaring a table&amp;rsquo;s sort order on dynamic table creation via the new &lt;code>sort_fields&lt;/code> config (&lt;a href="https://github.com/apache/beam/issues/38269">#38269&lt;/a>).&lt;/li>
&lt;li>IcebergIO: support writing with hash distribution mode, and with autosharding (&lt;a href="https://github.com/apache/beam/issues/38061">#38061&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>Capability introduces an indicator for aggregations and timers firing during a pipeline drain, allowing users and sinks to recognize and appropriately handle potentially incomplete or partial data (&lt;a href="https://github.com/apache/beam/issues/36884">#36884&lt;/a>).&lt;/li>
&lt;li>Added support for setting disk provisioned IOPS and throughput in Dataflow runner via &lt;code>--diskProvisionedIops&lt;/code> and &lt;code>--diskProvisionedThroughputMibps&lt;/code> pipeline options (Java/Go/Python) (&lt;a href="https://github.com/apache/beam/issues/38349">#38349&lt;/a>).&lt;/li>
&lt;li>TriggerStateMachineRunner changes from BitSetCoder to SentinelBitSetCoder to
encode finished bitset. SentinelBitSetCoder and BitSetCoder are state
compatible. Both coders can decode encoded bytes from the other coder
(&lt;a href="https://github.com/apache/beam/issues/38139">#38139&lt;/a>).&lt;/li>
&lt;li>(Python) Added type alias for with_exception_handling to be used for typehints. (&lt;a href="https://github.com/apache/beam/issues/38173">#38173&lt;/a>).&lt;/li>
&lt;li>(Java) BatchElements transform for Java SDK (&lt;a href="https://github.com/apache/beam/issues/38369">#38369&lt;/a>)&lt;/li>
&lt;li>Added plugin mechanism to support different Lineage implementations (Java) (&lt;a href="https://github.com/apache/beam/issues/36790">#36790&lt;/a>).&lt;/li>
&lt;li>(Python) Supported Python user type in Beam SQL. For example, SQL statements like &lt;code>SELECT some_field from PCOLLECTION&lt;/code> can now operate a PCollection of Beam Row containing pickable Python user type (&lt;a href="https://github.com/apache/beam/issues/20738">#20738&lt;/a>).&lt;/li>
&lt;li>(Python) Introduced &lt;code>beam.coders.registry.register_row&lt;/code> as preferred API to register a named tuple or dataclass with a Beam Row. At pipelne runtime, the original type associated with the registered row are preserved across the serialization boundary (&lt;a href="https://github.com/apache/beam/issues/38108">#38108&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;ul>
&lt;li>(Python) Made Beartype the default fallback type checking tool. This can be disabled with the &lt;code>--disable_beartype&lt;/code> pipeline option. (&lt;a href="https://github.com/apache/beam/issues/38275">#38275&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h3 id="deprecations">Deprecations&lt;/h3>
&lt;ul>
&lt;li>Dropped Java 8 support (&lt;a href="https://github.com/apache/beam/issues/31678">#31678&lt;/a>).&lt;/li>
&lt;li>Removed Samza Runner support (&lt;a href="https://github.com/apache/beam/issues/35448">#35448&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>Fixed BigQueryEnrichmentHandler batch mode dropping earlier requests when multiple requests share the same enrichment key (Python) (&lt;a href="https://github.com/apache/beam/issues/38035">#38035&lt;/a>).&lt;/li>
&lt;li>Added &lt;code>max_batch_duration_secs&lt;/code> passthrough support in Python Enrichment BigQuery and CloudSQL handlers so batching duration can be forwarded to &lt;code>BatchElements&lt;/code> (&lt;a href="https://github.com/apache/beam/issues/38243">#38243&lt;/a>).&lt;/li>
&lt;/ul>
&lt;p>According to git shortlog, the following people contributed to the 2.74.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Abdelrahman Ibrahim, Ahmed Abualsaud, Andrew Crites, Andrew Kabas, Arran Cudbard-Bell, Arun Pandian, Asish Kumar, Bentsi Leviav, Blake Jones, Bruno Volpato, Chris Jordan, Danny McCormick, Deji Ibrahim, Derrick Williams, Elia LIU, Ganesh Sivakumar, Jack McCluskey, Kenneth Knowles, Lalit Yadav, M Junaid Shaukat, Matej Aleksandrov, Prabhnoor Singh, Radek Stankiewicz, Radosław Stankiewicz, Reuven Lax, RuiLong J., Sam Whittle, Shunping Huang, Subramanya V, Tarun Annapareddy, Tobias Kaymak, TongruiLi, Valentyn Tymofieiev, Vitaly Terentyev, XQ Hu, Yi Hu, ZIHAN DAI, apanich, bambadiouf1, chenxuesdu, claudevdm, harshadkhetpal, johnjcasey, parveensania, tianz101&lt;/p></description><link>/blog/beam-2.74.0/</link><pubDate>Tue, 02 Jun 2026 14:00:00 -0500</pubDate><guid>/blog/beam-2.74.0/</guid><category>blog</category><category>release</category></item><item><title>Apache Beam 2.73.0</title><description>
&lt;!--
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.
-->
&lt;p>We are happy to present the new 2.73.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2730-2026-04-29">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.73.0, check out the &lt;a href="https://github.com/apache/beam/milestone/41">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;h3 id="ios">I/Os&lt;/h3>
&lt;ul>
&lt;li>DebeziumIO (Java): added &lt;code>OffsetRetainer&lt;/code> interface and &lt;code>FileSystemOffsetRetainer&lt;/code> implementation to persist and restore CDC offsets across pipeline restarts, and exposed &lt;code>withStartOffset&lt;/code> / &lt;code>withOffsetRetainer&lt;/code> on &lt;code>DebeziumIO.Read&lt;/code> and the cross-language &lt;code>ReadBuilder&lt;/code> (&lt;a href="https://github.com/apache/beam/issues/28248">#28248&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>(Python) Added BigQuery CDC streaming source (&lt;a href="https://github.com/apache/beam/issues/37724">#37724&lt;/a>)&lt;/li>
&lt;li>Added &lt;code>ADKAgentModelHandler&lt;/code> for running Google Agent Development Kit (ADK) agents (Python) (&lt;a href="https://github.com/apache/beam/issues/37917">#37917&lt;/a>).&lt;/li>
&lt;li>(Python) Added exception chaining to preserve error context in CloudSQLEnrichmentHandler, processes utilities, and core transforms (&lt;a href="https://github.com/apache/beam/issues/37422">#37422&lt;/a>).&lt;/li>
&lt;li>(Python) Added a pipeline option &lt;code>--experiments=pip_no_build_isolation&lt;/code> to disable build isolation when installing dependencies in the runtime environment (&lt;a href="https://github.com/apache/beam/issues/37331">#37331&lt;/a>).&lt;/li>
&lt;li>(Go) Added OrderedListState support to the Go SDK stateful DoFn API (&lt;a href="https://github.com/apache/beam/issues/37629">#37629&lt;/a>).&lt;/li>
&lt;li>Added support for large pipeline options via a file (Python) (&lt;a href="https://github.com/apache/beam/issues/37370">#37370&lt;/a>).&lt;/li>
&lt;li>Supported infer schema from dataclass (Python) (&lt;a href="https://github.com/apache/beam/issues/22085">#22085&lt;/a>). Default coder for typehint-ed (or set with_output_type) for non-frozen dataclasses changed to RowCoder. To preserve the old behavior (fast primitive coder), explicitly register the type with FastPrimitiveCoder.&lt;/li>
&lt;li>Updates minimum Go version to 1.26.1 (&lt;a href="https://github.com/apache/beam/issues/37897">#37897&lt;/a>).&lt;/li>
&lt;li>(Python) Added image embedding support in &lt;code>apache_beam.ml.rag&lt;/code> package (&lt;a href="https://github.com/apache/beam/issues/37628">#37628&lt;/a>).&lt;/li>
&lt;li>(Python) Added support for Python version 3.14 (&lt;a href="https://github.com/apache/beam/issues/37247">#37247&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;ul>
&lt;li>The Python SDK container&amp;rsquo;s &lt;code>boot.go&lt;/code> now passes pipeline options through a file instead of the &lt;code>PIPELINE_OPTIONS&lt;/code> environment variable. If a user pairs a new Python SDK container with an older SDK version (which does not support the file-based approach), the pipeline options will not be recognized and the pipeline will fail. Users must ensure their SDK and container versions are synchronized (&lt;a href="https://github.com/apache/beam/issues/37370">#37370&lt;/a>).&lt;/li>
&lt;li>Python DoFn.with_exception_handling now respects user DoFn typehints. This can break update compatibility if coders change. It can also break pipeline compilation if existing typehints are incorrect. To update safely sepcify the pipeline option &lt;code>--update_compatibility_version=2.72.0&lt;/code>. To fix typehints replace any incorrect typehints that were previously ignored (&lt;a href="https://github.com/apache/beam/issues/37590">#37590&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>Fixed ProcessManager not reaping child processes, causing zombie process accumulation on long-running Flink deployments (Java) (&lt;a href="https://github.com/apache/beam/issues/37930">#37930&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="security-fixes">Security Fixes&lt;/h3>
&lt;ul>
&lt;li>Fixed &lt;a href="https://www.cve.org/CVERecord?id=CVE-2023-46604">CVE-2023-46604&lt;/a> (CVSS 10.0) and &lt;a href="https://www.cve.org/CVERecord?id=CVE-2022-41678">CVE-2022-41678&lt;/a> by upgrading ActiveMQ from 5.14.5 to 5.19.2 (Java) (&lt;a href="https://github.com/apache/beam/issues/37943">#37943&lt;/a>).&lt;/li>
&lt;li>Fixed &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-1597">CVE-2024-1597&lt;/a>, &lt;a href="https://www.cve.org/CVERecord?id=CVE-2022-31197">CVE-2022-31197&lt;/a>, and &lt;a href="https://www.cve.org/CVERecord?id=CVE-2022-21724">CVE-2022-21724&lt;/a> by upgrading PostgreSQL JDBC Driver from 42.2.16 to 42.6.2 (Java) (&lt;a href="https://github.com/apache/beam/issues/37942">#37942&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h2 id="list-of-contributors">List of Contributors&lt;/h2>
&lt;p>According to git shortlog, the following people contributed to the 2.73.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Abdelrahman Ibrahim, Ahmed Abualsaud, Alex Malao, Alexander Nieuwenhuijse, Andres Tiko, Andrew Crites, Arun Pandian, Bentsi Leviav, Bruno Volpato, Chamikara Jayalath, Chandra Kiran Bolla, Danny McCormick, Deji Ibrahim, Derrick Williams, Elia LIU, Esmelealem, Hannes Gustafsson, Jack McCluskey, Joey Tran, Kenneth Knowles, M Junaid Shaukat, Mansi Singh, Matej Aleksandrov, Mathijs Deelen, Mattie Fu, Praneet Nadella, Radek Stankiewicz, Radosław Stankiewicz, Reuven Lax, RuiLong J., S. Veyrié, Sakthivel Subramanian, Sam Whittle, Shubham Thakur, Shunping Huang, Subramanya V, Tarun Annapareddy, Tobias Kaymak, Valentyn Tymofieiev, Vitaly Terentyev, XQ Hu, Yi Hu, ZIHAN DAI, claudevdm, kishorepola, parveensania&lt;/p></description><link>/blog/beam-2.73.0/</link><pubDate>Wed, 29 Apr 2026 09:00:00 -0700</pubDate><guid>/blog/beam-2.73.0/</guid><category>blog</category><category>release</category></item><item><title>Apache Beam 2.72.0</title><description>
&lt;!--
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.
-->
&lt;p>We are happy to present the new 2.72.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2720-2026-03-30">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.72.0, check out the &lt;a href="https://github.com/apache/beam/milestone/40">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>Flink 2.0 support (&lt;a href="https://github.com/apache/beam/issues/36947">#36947&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="ios">I/Os&lt;/h3>
&lt;ul>
&lt;li>Add Datadog IO support (Java) (&lt;a href="https://github.com/apache/beam/issues/37318">#37318&lt;/a>).&lt;/li>
&lt;li>Remove Pubsublite IO support, since service will be deprecated in March 2026. (&lt;a href="https://github.com/apache/beam/issues/37375">#37375&lt;/a>).&lt;/li>
&lt;li>(Java) ClickHouse - migrating from the legacy JDBC driver (v0.6.3) to ClickHouse Java Client v2 (v0.9.6). See the &lt;a href="https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/clickhouse/ClickHouseIO.html">class documentation&lt;/a> for migration guide (&lt;a href="https://github.com/apache/beam/issues/37610">#37610&lt;/a>).&lt;/li>
&lt;li>(Java) Upgraded GoogleAdsIO to use GoogleAdsIO API v23 (&lt;a href="https://github.com/apache/beam/issues/37620">#37620&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>(Python) Added exception chaining to preserve error context in CloudSQLEnrichmentHandler, processes utilities, and core transforms (&lt;a href="https://github.com/apache/beam/issues/37422">#37422&lt;/a>).&lt;/li>
&lt;li>(Python) Added a pipeline option &lt;code>--experiments=pip_no_build_isolation&lt;/code> to disable build isolation when installing dependencies in the runtime environment (&lt;a href="https://github.com/apache/beam/issues/37331">#37331&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="deprecations">Deprecations&lt;/h3>
&lt;ul>
&lt;li>(Python) Removed previously deprecated list_prefix method for filesystem interfaces (&lt;a href="https://github.com/apache/beam/issues/37587">#37587&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>Fixed (Yaml) issue with validate compatible method (&lt;a href="https://github.com/apache/beam/issues/37588">#37588&lt;/a>).&lt;/li>
&lt;li>Fixed (Yaml) issue with Create transform dealing with different type elements (&lt;a href="https://github.com/apache/beam/issues/37585">#37585&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="security-fixes">Security Fixes&lt;/h3>
&lt;ul>
&lt;li>Fixed &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-28397">CVE-2024-28397&lt;/a> by switching from js2py to pythonmonkey (Yaml) (&lt;a href="https://github.com/apache/beam/issues/37560">#37560&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h2 id="list-of-contributors">List of Contributors&lt;/h2>
&lt;p>According to git shortlog, the following people contributed to the 2.72.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Abdelrahman Ibrahim, Ahmed Abualsaud, Andrew Crites, Arun Pandian, Ben Feinstein, Bentsi Leviav, Celeste Zeng, Danny McCormick, Danny Mccormick, Derrick Williams, Elia LIU, Ganesh, Jack McCluskey, Kenneth Knowles, Labesse Kévin, M Junaid Shaukat, Mansi Singh, Mattie Fu, Nayan Mathur, Pablo Estrada, Pirzada Ahmad Faraz, Radek Stankiewicz, Radosław Stankiewicz, Robert Bradshaw, Rohan Sah, RuiLong J., Sakthivel Subramanian, Sam Whittle, Shaheer Amjad, Shunping Huang, Steven van Rossum, Tarun Annapareddy, Tobias Kaymak, Valentyn Tymofieiev, Vitaly Terentyev, Yi Hu, XQ Hu, ZIHAN DAI, apanich, chenxuesdu, claudevdm, franzonia137&lt;/p></description><link>/blog/beam-2.72.0/</link><pubDate>Mon, 30 Mar 2026 09:00:00 -0700</pubDate><guid>/blog/beam-2.72.0/</guid><category>blog</category><category>release</category></item><item><title>Apache Beam 2.71.0</title><description>
&lt;!--
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.
-->
&lt;p>We are happy to present the new 2.71.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2710-2026-01-22">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.71.0, check out the &lt;a href="https://github.com/apache/beam/milestone/39">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="ios">I/Os&lt;/h2>
&lt;ul>
&lt;li>(Java) Elasticsearch 9 Support (&lt;a href="https://github.com/apache/beam/issues/36491">#36491&lt;/a>).&lt;/li>
&lt;li>(Java) Upgraded HCatalogIO to Hive 4.0.1 (&lt;a href="https://github.com/apache/beam/issues/32189">#32189&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>Support configuring Firestore database on ReadFn transforms (Java) (&lt;a href="https://github.com/apache/beam/issues/36904">#36904&lt;/a>).&lt;/li>
&lt;li>(Python) Inference args are now allowed in most model handlers, except where they are explicitly/intentionally disallowed (&lt;a href="https://github.com/apache/beam/issues/37093">#37093&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>Fixed FirestoreV1 Beam connectors allow configuring inconsistent project/database IDs between RPC requests and routing headers #36895 (Java) (&lt;a href="https://github.com/apache/beam/issues/36895">#36895&lt;/a>).&lt;/li>
&lt;li>Logical type and coder registry are saved for pipelines in the case of default pickler (&lt;a href="https://github.com/apache/beam/issues/36271">#36271&lt;/a>). This fixes a side effect of switching to cloudpickle as default pickler in Beam 2.65.0 (Python) (&lt;a href="https://github.com/apache/beam/issues/35738">#35738&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="known-issues">Known Issues&lt;/h3>
&lt;p>For the most up to date list of known issues, see &lt;a href="https://github.com/apache/beam/blob/master/CHANGES.md">https://github.com/apache/beam/blob/master/CHANGES.md&lt;/a>&lt;/p>
&lt;h2 id="list-of-contributors">List of Contributors&lt;/h2>
&lt;p>According to git shortlog, the following people contributed to the 2.71.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Ahmed Abualsaud, Andrew Crites, apanich, Arun, Arun Pandian, assaf127, Chamikara Jayalath, CherisPatelInfocusp, Cheskel Twersky, Claire McGinty, Claude, Danny Mccormick, Derrick Williams, Egbert van der Wal, Evan Galpin, Ganesh, hekk-kaori-maeda, Jack Dingilian, Jack McCluskey, JayajP, Jiang Zhu, Kenneth Knowles, liferoad, M Junaid Shaukat, Nayan Mathur, Noah Stapp, Paco Avila, Radek Stankiewicz, Radosław Stankiewicz, Robert Stupp, Sam Whittle, Shunping Huang, Steven van Rossum, Suvrat Acharya, Tarun Annapareddy, tvalentyn, Utkarsh Parekh, Vitaly Terentyev, Xiaochu Liu, Yala Huang Feng, Yi Hu, Yu Watanabe, zhan7236&lt;/p></description><link>/blog/beam-2.71.0/</link><pubDate>Tue, 13 Jan 2026 09:00:00 -0700</pubDate><guid>/blog/beam-2.71.0/</guid><category>blog</category><category>release</category></item></channel></rss>