<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>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><item><title>Apache Beam 2.70.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.70.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2700-2025-12-16">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.70.0, check out the &lt;a href="https://github.com/apache/beam/milestone/38?closed=1">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>Flink 1.20 support added (&lt;a href="https://github.com/apache/beam/issues/32647">#32647&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>Python examples added for Milvus search enrichment handler on &lt;a href="https://beam.apache.org/documentation/transforms/python/elementwise/enrichment-milvus/">Beam Website&lt;/a>
including jupyter notebook example (Python) (&lt;a href="https://github.com/apache/beam/issues/36176">#36176&lt;/a>).&lt;/li>
&lt;li>Milvus sink I/O connector added (Python) (&lt;a href="https://github.com/apache/beam/issues/36702">#36702&lt;/a>).
Now Beam has full support for Milvus integration including Milvus enrichment and sink operations.&lt;/li>
&lt;/ul>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;ul>
&lt;li>(Python) Some Python dependencies have been split out into extras. To ensure all previously installed dependencies are installed, when installing Beam you can &lt;code>pip install apache-beam[gcp,interactive,yaml,redis,hadoop,tfrecord]&lt;/code>, though most users will not need all of these extras (&lt;a href="https://github.com/apache/beam/issues/34554">#34554&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="deprecations">Deprecations&lt;/h3>
&lt;ul>
&lt;li>(Python) Python 3.9 reached EOL in October 2025 and support for the language version has been removed. (&lt;a href="https://github.com/apache/beam/issues/36665">#36665&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.70.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Abdelrahman Ibrahim, Ahmed Abualsaud, Alex Chermenin, Andrew Crites, Arun Pandian, Celeste Zeng, Chamikara Jayalath, Chenzo, Claire McGinty, Danny McCormick, Derrick Williams, Dustin Rhodes, Enrique Calderon, Ian Liao, Jack McCluskey, Jessica Hsiao, Joey Tran, Karthik Talluri, Kenneth Knowles, Maciej Szwaja, Mehdi.D, Mohamed Awnallah, Praneet Nadella, Radek Stankiewicz, Radosław Stankiewicz, Reuven Lax, RuiLong J., S. Veyrié, Sam Whittle, Shunping Huang, Stephan Hoyer, Steven van Rossum, Tanu Sharma, Tarun Annapareddy, Tom Stepp, Valentyn Tymofieiev, Vitaly Terentyev, XQ Hu, Yi Hu, changliiu, claudevdm, fozzie15, kristynsmith, wolfchris-google&lt;/p></description><link>/blog/beam-2.70.0/</link><pubDate>Tue, 16 Dec 2025 15:00:00 -0500</pubDate><guid>/blog/beam-2.70.0/</guid><category>blog</category><category>release</category></item><item><title>Apache Beam 2.69.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.69.0 release of Beam.
This release includes both improvements and new functionality.
See the &lt;a href="/get-started/downloads/#2690-2025-10-28">download page&lt;/a> for this release.&lt;/p>
&lt;p>For more information on changes in 2.69.0, check out the &lt;a href="https://github.com/apache/beam/milestone/37?closed=1">detailed release notes&lt;/a>.&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>(Python) Add YAML Editor and Visualization Panel (&lt;a href="https://github.com/apache/beam/issues/35772">#35772&lt;/a>).&lt;/li>
&lt;li>(Java) Java 25 Support (&lt;a href="https://github.com/apache/beam/issues/35627">#35627&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="ios">I/Os&lt;/h3>
&lt;ul>
&lt;li>Upgraded Iceberg dependency to 1.10.0 (&lt;a href="https://github.com/apache/beam/issues/36123">#36123&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="new-features--improvements">New Features / Improvements&lt;/h3>
&lt;ul>
&lt;li>Enhance JAXBCoder with XMLInputFactory support (Java) (&lt;a href="https://github.com/apache/beam/issues/36446">#36446&lt;/a>).&lt;/li>
&lt;li>Python examples added for CloudSQL enrichment handler on &lt;a href="https://beam.apache.org/documentation/transforms/python/elementwise/enrichment-cloudsql/">Beam website&lt;/a> (Python) (&lt;a href="https://github.com/apache/beam/issues/36095">#35473&lt;/a>).&lt;/li>
&lt;li>Support for batch mode execution in WriteToPubSub transform added (Python) (&lt;a href="https://github.com/apache/beam/issues/35990">#35990&lt;/a>).&lt;/li>
&lt;li>Added official support for Python 3.13 (&lt;a href="https://github.com/apache/beam/issues/34869">#34869&lt;/a>).&lt;/li>
&lt;li>Added an optional output_schema verification to all YAML transforms (&lt;a href="https://github.com/apache/beam/issues/35952">#35952&lt;/a>).&lt;/li>
&lt;li>Support for encryption when using GroupByKey added, along with &lt;code>--gbek&lt;/code> pipeline option to automatically replace all GroupByKey transforms (Java/Python) (&lt;a href="https://github.com/apache/beam/issues/36214">#36214&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="breaking-changes">Breaking Changes&lt;/h3>
&lt;ul>
&lt;li>(Python) &lt;code>dill&lt;/code> is no longer a required, default dependency for Apache Beam (&lt;a href="https://github.com/apache/beam/issues/21298">#21298&lt;/a>).
&lt;ul>
&lt;li>This change only affects pipelines that explicitly use the &lt;code>pickle_library=dill&lt;/code> pipeline option.&lt;/li>
&lt;li>While &lt;code>dill==0.3.1.1&lt;/code> is still pre-installed on the official Beam SDK base images, it is no longer a direct dependency of the apache-beam Python package. This means it can be overridden by other dependencies in your environment.&lt;/li>
&lt;li>If your pipeline uses &lt;code>pickle_library=dill&lt;/code>, you must manually ensure &lt;code>dill==0.3.1.1&lt;/code> is installed in both your submission and runtime environments.
&lt;ul>
&lt;li>Submission environment: Install the dill extra in your local environment &lt;code>pip install apache-beam[gcpdill]&lt;/code>.&lt;/li>
&lt;li>Runtime (worker) environment: Your action depends on how you manage your worker&amp;rsquo;s environment.
&lt;ul>
&lt;li>If using default containers or custom containers with the official Beam base image e.g. &lt;code>FROM apache/beam_python3.10_sdk:2.69.0&lt;/code>
&lt;ul>
&lt;li>Add &lt;code>dill==0.3.1.1&lt;/code> to your worker&amp;rsquo;s requirements file (e.g., requirements.txt)&lt;/li>
&lt;li>Pass this file to your pipeline using the &amp;ndash;requirements_file requirements.txt pipeline option (For more details see &lt;a href="https://cloud.google.com/dataflow/docs/guides/manage-dependencies#py-custom-containers">managing Dataflow dependencies&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>If custom containers with a non-Beam base image e.g. &lt;code>FROM python:3.9-slim&lt;/code>
&lt;ul>
&lt;li>Install apache-beam with the dill extra in your docker file e.g. &lt;code>RUN pip install --no-cache-dir apache-beam[gcp,dill]&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>If there is a dill version mismatch between submission and runtime environments you might encounter unpickling errors like &lt;code>Can't get attribute '_create_code' on &amp;lt;module 'dill._dill' from...&lt;/code>.&lt;/li>
&lt;li>If dill is not installed in the runtime environment you will see the error &lt;code>ImportError: Pipeline option pickle_library=dill is set, but dill is not installed...&lt;/code>&lt;/li>
&lt;li>Report any issues you encounter when using &lt;code>pickle_library=dill&lt;/code> to the GitHub issue (&lt;a href="https://github.com/apache/beam/issues/21298">#21298&lt;/a>)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>(Python) Added a &lt;code>pickle_library=dill_unsafe&lt;/code> pipeline option. This allows overriding &lt;code>dill==0.3.1.1&lt;/code> using dill as the pickle_library. Use with extreme caution. Other versions of dill has not been tested with Apache Beam (&lt;a href="https://github.com/apache/beam/issues/21298">#21298&lt;/a>).&lt;/li>
&lt;li>(Python) The deterministic fallback coder for complex types like NamedTuple, Enum, and dataclasses now normalizes filepaths for better determinism guarantees. This affects streaming pipelines updating from 2.68 to 2.69 that utilize this fallback coder. If your pipeline is affected, you may see a warning like: &amp;ldquo;Using fallback deterministic coder for type X&amp;hellip;&amp;rdquo;. To update safely sepcify the pipeline option &lt;code>--update_compatibility_version=2.68.0&lt;/code> (&lt;a href="https://github.com/apache/beam/pull/36345">#36345&lt;/a>).&lt;/li>
&lt;li>(Python) Fixed transform naming conflict when executing DataTransform on a dictionary of PColls (&lt;a href="https://github.com/apache/beam/issues/30445">#30445&lt;/a>).
This may break update compatibility if you don&amp;rsquo;t provide a &lt;code>--transform_name_mapping&lt;/code>.&lt;/li>
&lt;li>Removed deprecated Hadoop versions (2.10.2 and 3.2.4) that are no longer supported for &lt;a href="https://github.com/apache/iceberg/issues/10940">Iceberg&lt;/a> from IcebergIO (&lt;a href="https://github.com/apache/beam/issues/36282">#36282&lt;/a>).&lt;/li>
&lt;li>(Go) Coder construction on SDK side is more faithful to the specs from runners without stripping length-prefix. This may break streaming pipeline update as the underlying coder could be changed (&lt;a href="https://github.com/apache/beam/issues/36387">#36387&lt;/a>).&lt;/li>
&lt;li>Minimum Go version for Beam Go updated to 1.25.2 (&lt;a href="https://github.com/apache/beam/issues/36461">#36461&lt;/a>).&lt;/li>
&lt;li>(Java) DoFn OutputReceiver now requires implementing a builder method as part of extended metadata support for elements (&lt;a href="https://github.com/apache/beam/issues/34902">#34902&lt;/a>).&lt;/li>
&lt;li>(Java) Removed ProcessContext outputWindowedValue introduced in 2.68 that allowed setting offset and record Id. Use OutputReceiver&amp;rsquo;s builder to set those field (&lt;a href="https://github.com/apache/beam/pull/36523">#36523&lt;/a>).&lt;/li>
&lt;/ul>
&lt;h3 id="bugfixes">Bugfixes&lt;/h3>
&lt;ul>
&lt;li>Fixed passing of pipeline options to x-lang transforms when called from the Java SDK (Java) (&lt;a href="https://github.com/apache/beam/issues/36443">#36443&lt;/a>).&lt;/li>
&lt;li>PulsarIO has now changed support status from incomplete to experimental. Both read and writes should now minimally
function (un-partitioned topics, without schema support, timestamp ordered messages for read) (Java)
(&lt;a href="https://github.com/apache/beam/issues/36141">#36141&lt;/a>).&lt;/li>
&lt;li>Fixed Spanner Change Stream reading stuck issue due to watermark of partition moving backwards (&lt;a href="https://github.com/apache/beam/issues/36470">#36470&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.69.0 release. Thank you to all contributors!&lt;/p>
&lt;p>Abdelrahman Ibrahim, Ahmed Abualsaud, Andrew Crites, Arun Pandian, Bryan Dang, Chamikara Jayalath, Charles Nguyen, Chenzo, Clay Johnson, Danny McCormick, David A, Derrick Williams, Enrique Calderon, Hai Joey Tran, Ian Liao, Ian Mburu, Jack McCluskey, Jiang Zhu, Joey Tran, Kenneth Knowles, Kyle Stanley, Maciej Szwaja, Minbo Bae, Mohamed Awnallah, Radek Stankiewicz, Radosław Stankiewicz, Razvan Culea, Reuven Lax, Sagnik Ghosh, Sam Whittle, Shunping Huang, Steven van Rossum, Talat UYARER, Tanu Sharma, Tarun Annapareddy, Tom Stepp, Valentyn Tymofieiev, Vitaly Terentyev, XQ Hu, Yi Hu, Yilei, claudevdm, flpablo, fozzie15, johnjcasey, lim1t, parveensania, yashu&lt;/p></description><link>/blog/beam-2.69.0/</link><pubDate>Tue, 28 Oct 2025 15:00:00 -0500</pubDate><guid>/blog/beam-2.69.0/</guid><category>blog</category><category>release</category></item></channel></rss>