Apache BeamApache 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./Hugo -- gohugo.ioApache Beam 2.70.0 <!-- 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. --> <p>We are happy to present the new 2.70.0 release of Beam. This release includes both improvements and new functionality. See the <a href="/get-started/downloads/#2700-2025-12-16">download page</a> for this release.</p> <p>For more information on changes in 2.70.0, check out the <a href="https://github.com/apache/beam/milestone/38?closed=1">detailed release notes</a>.</p> <h2 id="highlights">Highlights</h2> <ul> <li>Flink 1.20 support added (<a href="https://github.com/apache/beam/issues/32647">#32647</a>).</li> </ul> <h3 id="new-features--improvements">New Features / Improvements</h3> <ul> <li>Python examples added for Milvus search enrichment handler on <a href="https://beam.apache.org/documentation/transforms/python/elementwise/enrichment-milvus/">Beam Website</a> including jupyter notebook example (Python) (<a href="https://github.com/apache/beam/issues/36176">#36176</a>).</li> <li>Milvus sink I/O connector added (Python) (<a href="https://github.com/apache/beam/issues/36702">#36702</a>). Now Beam has full support for Milvus integration including Milvus enrichment and sink operations.</li> </ul> <h3 id="breaking-changes">Breaking Changes</h3> <ul> <li>(Python) Some Python dependencies have been split out into extras. To ensure all previously installed dependencies are installed, when installing Beam you can <code>pip install apache-beam[gcp,interactive,yaml,redis,hadoop,tfrecord]</code>, though most users will not need all of these extras (<a href="https://github.com/apache/beam/issues/34554">#34554</a>).</li> </ul> <h3 id="deprecations">Deprecations</h3> <ul> <li>(Python) Python 3.9 reached EOL in October 2025 and support for the language version has been removed. (<a href="https://github.com/apache/beam/issues/36665">#36665</a>).</li> </ul> <h2 id="list-of-contributors">List of Contributors</h2> <p>According to git shortlog, the following people contributed to the 2.70.0 release. Thank you to all contributors!</p> <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</p>/blog/beam-2.70.0/Tue, 16 Dec 2025 15:00:00 -0500/blog/beam-2.70.0/blogreleaseApache Beam 2.69.0 <!-- 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. --> <p>We are happy to present the new 2.69.0 release of Beam. This release includes both improvements and new functionality. See the <a href="/get-started/downloads/#2690-2025-10-28">download page</a> for this release.</p> <p>For more information on changes in 2.69.0, check out the <a href="https://github.com/apache/beam/milestone/37?closed=1">detailed release notes</a>.</p> <h2 id="highlights">Highlights</h2> <ul> <li>(Python) Add YAML Editor and Visualization Panel (<a href="https://github.com/apache/beam/issues/35772">#35772</a>).</li> <li>(Java) Java 25 Support (<a href="https://github.com/apache/beam/issues/35627">#35627</a>).</li> </ul> <h3 id="ios">I/Os</h3> <ul> <li>Upgraded Iceberg dependency to 1.10.0 (<a href="https://github.com/apache/beam/issues/36123">#36123</a>).</li> </ul> <h3 id="new-features--improvements">New Features / Improvements</h3> <ul> <li>Enhance JAXBCoder with XMLInputFactory support (Java) (<a href="https://github.com/apache/beam/issues/36446">#36446</a>).</li> <li>Python examples added for CloudSQL enrichment handler on <a href="https://beam.apache.org/documentation/transforms/python/elementwise/enrichment-cloudsql/">Beam website</a> (Python) (<a href="https://github.com/apache/beam/issues/36095">#35473</a>).</li> <li>Support for batch mode execution in WriteToPubSub transform added (Python) (<a href="https://github.com/apache/beam/issues/35990">#35990</a>).</li> <li>Added official support for Python 3.13 (<a href="https://github.com/apache/beam/issues/34869">#34869</a>).</li> <li>Added an optional output_schema verification to all YAML transforms (<a href="https://github.com/apache/beam/issues/35952">#35952</a>).</li> <li>Support for encryption when using GroupByKey added, along with <code>--gbek</code> pipeline option to automatically replace all GroupByKey transforms (Java/Python) (<a href="https://github.com/apache/beam/issues/36214">#36214</a>).</li> </ul> <h3 id="breaking-changes">Breaking Changes</h3> <ul> <li>(Python) <code>dill</code> is no longer a required, default dependency for Apache Beam (<a href="https://github.com/apache/beam/issues/21298">#21298</a>). <ul> <li>This change only affects pipelines that explicitly use the <code>pickle_library=dill</code> pipeline option.</li> <li>While <code>dill==0.3.1.1</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.</li> <li>If your pipeline uses <code>pickle_library=dill</code>, you must manually ensure <code>dill==0.3.1.1</code> is installed in both your submission and runtime environments. <ul> <li>Submission environment: Install the dill extra in your local environment <code>pip install apache-beam[gcpdill]</code>.</li> <li>Runtime (worker) environment: Your action depends on how you manage your worker&rsquo;s environment. <ul> <li>If using default containers or custom containers with the official Beam base image e.g. <code>FROM apache/beam_python3.10_sdk:2.69.0</code> <ul> <li>Add <code>dill==0.3.1.1</code> to your worker&rsquo;s requirements file (e.g., requirements.txt)</li> <li>Pass this file to your pipeline using the &ndash;requirements_file requirements.txt pipeline option (For more details see <a href="https://cloud.google.com/dataflow/docs/guides/manage-dependencies#py-custom-containers">managing Dataflow dependencies</a>).</li> </ul> </li> <li>If custom containers with a non-Beam base image e.g. <code>FROM python:3.9-slim</code> <ul> <li>Install apache-beam with the dill extra in your docker file e.g. <code>RUN pip install --no-cache-dir apache-beam[gcp,dill]</code></li> </ul> </li> </ul> </li> </ul> </li> <li>If there is a dill version mismatch between submission and runtime environments you might encounter unpickling errors like <code>Can't get attribute '_create_code' on &lt;module 'dill._dill' from...</code>.</li> <li>If dill is not installed in the runtime environment you will see the error <code>ImportError: Pipeline option pickle_library=dill is set, but dill is not installed...</code></li> <li>Report any issues you encounter when using <code>pickle_library=dill</code> to the GitHub issue (<a href="https://github.com/apache/beam/issues/21298">#21298</a>)</li> </ul> </li> <li>(Python) Added a <code>pickle_library=dill_unsafe</code> pipeline option. This allows overriding <code>dill==0.3.1.1</code> using dill as the pickle_library. Use with extreme caution. Other versions of dill has not been tested with Apache Beam (<a href="https://github.com/apache/beam/issues/21298">#21298</a>).</li> <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: &ldquo;Using fallback deterministic coder for type X&hellip;&rdquo;. To update safely sepcify the pipeline option <code>--update_compatibility_version=2.68.0</code> (<a href="https://github.com/apache/beam/pull/36345">#36345</a>).</li> <li>(Python) Fixed transform naming conflict when executing DataTransform on a dictionary of PColls (<a href="https://github.com/apache/beam/issues/30445">#30445</a>). This may break update compatibility if you don&rsquo;t provide a <code>--transform_name_mapping</code>.</li> <li>Removed deprecated Hadoop versions (2.10.2 and 3.2.4) that are no longer supported for <a href="https://github.com/apache/iceberg/issues/10940">Iceberg</a> from IcebergIO (<a href="https://github.com/apache/beam/issues/36282">#36282</a>).</li> <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 (<a href="https://github.com/apache/beam/issues/36387">#36387</a>).</li> <li>Minimum Go version for Beam Go updated to 1.25.2 (<a href="https://github.com/apache/beam/issues/36461">#36461</a>).</li> <li>(Java) DoFn OutputReceiver now requires implementing a builder method as part of extended metadata support for elements (<a href="https://github.com/apache/beam/issues/34902">#34902</a>).</li> <li>(Java) Removed ProcessContext outputWindowedValue introduced in 2.68 that allowed setting offset and record Id. Use OutputReceiver&rsquo;s builder to set those field (<a href="https://github.com/apache/beam/pull/36523">#36523</a>).</li> </ul> <h3 id="bugfixes">Bugfixes</h3> <ul> <li>Fixed passing of pipeline options to x-lang transforms when called from the Java SDK (Java) (<a href="https://github.com/apache/beam/issues/36443">#36443</a>).</li> <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) (<a href="https://github.com/apache/beam/issues/36141">#36141</a>).</li> <li>Fixed Spanner Change Stream reading stuck issue due to watermark of partition moving backwards (<a href="https://github.com/apache/beam/issues/36470">#36470</a>).</li> </ul> <h2 id="list-of-contributors">List of Contributors</h2> <p>According to git shortlog, the following people contributed to the 2.69.0 release. Thank you to all contributors!</p> <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</p>/blog/beam-2.69.0/Tue, 28 Oct 2025 15:00:00 -0500/blog/beam-2.69.0/blogreleaseGoogle Summer of Code 2025 - Enhanced Interactive Pipeline Development Environment for JupyterLab <!-- 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. --> <h1 id="gsoc-2025-basic-information">GSoC 2025 Basic Information</h1> <p><strong>Student:</strong> [Canyu Chen] (<a href="https://github.com/Chenzo1001">@Chenzo1001</a>) <strong>Mentors:</strong> [XQ Hu] (<a href="https://github.com/liferoad">@liferoad</a>) <strong>Organization:</strong> [Apache Beam] <strong>Proposal Link:</strong> <a href="https://drive.google.com/file/d/1gmrSUGpXMXujVnFffuj0UWQjbghWI8Oy/view?usp=sharing">Here</a></p> <h1 id="project-overview">Project Overview</h1> <p>BeamVision significantly enhances the Apache Beam development experience within JupyterLab by providing a unified, visual interface for pipeline inspection and analysis. This project successfully delivered a production-ready JupyterLab extension that replaces fragmented workflows with an integrated workspace, featuring a dynamic side panel for pipeline visualization and a multi-tab interface for comparative workflow analysis.</p> <p>Core Achievements:</p> <p>Modernized Extension: Upgraded the JupyterLab Sidepanel to v4.x, ensuring compatibility with the latest ecosystem and releasing the package on both <a href="https://www.npmjs.com/package/apache-beam-jupyterlab-sidepanel">NPM</a> and <a href="https://pypi.org/project/apache-beam-jupyterlab-sidepanel/">PyPI</a>.</p> <p>YAML Visualization Suite: Implemented a powerful visual editor for Beam YAML, combining a code editor, an interactive flow chart (built with @xyflow/react-flow), and a collapsible key-value panel for intuitive pipeline design.</p> <p>Enhanced Accessibility &amp; Stability: Added pip installation support and fixed critical bugs in Interactive Beam, improving stability and user onboarding.</p> <p>Community Engagement: Active participation in the Beam community, including contributing to a hackathon project and successfully integrating all work into the Apache Beam codebase via merged Pull Requests.</p> <h1 id="development-workflow">Development Workflow</h1> <p>As early as the beginning of March, I saw Apache&rsquo;s project information on the official GSoC website and came across Beam among the projects released by Apache. Since I have some interest in front-end development and wanted to truly integrate into the open-source community for development work, I contacted mentor XQ Hu via email and received positive feedback from him. In April, XQ Hu posted notes for all GSoC students on the Beam Mailing List. It was essential to keep an eye on the Mailing List promptly. Between March and May, besides completing the project proposal and preparation work, I also used my spare time to partially migrate the Beam JupyterLab Extension to version 4.0. This helped me get into the development state more quickly.</p> <p>I also participated in the Beam Hackathon held in May. There were several topics to choose from, and I opted for the free topic. This allowed me to implement any innovative work on Beam. I combined Beam and GCP to create an <a href="https://github.com/Chenzo1001/Beam_auto_emotion_analysis">Automatic Emotion Analysis Tool for comments</a>. This tool integrates Beam Pipeline, Flink, Docker, and GCP to collect and perform sentiment analysis on real-time comment stream data, storing the results in GCP&rsquo;s BigQuery. This is a highly meaningful task because sentiment analysis of comments can help businesses better understand users&rsquo; opinions about their products, thereby improving the products more effectively. However, the time during the Hackathon was too tight, so I haven&rsquo;t fully completed this project yet, and it can be further improved later. This Hackathon gave me a deeper understanding of Beam and GCP, and also enhanced my knowledge of the development of the Beam JupyterLab Extension.</p> <p>In June, I officially started the project development and maintained close communication with my mentor to ensure the project progressed smoothly. XQ Hu and I held a half-hour weekly meeting every Monday on Google Meet, primarily to address issues encountered during the previous week&rsquo;s development and to discuss the tasks for the upcoming week. XQ Hu is an excellent mentor, and I had no communication barriers with him whatsoever. He is also very understanding; sometimes, when I needed to postpone some development tasks due to personal reasons, he was always supportive and gave me ample freedom. During this month, I improved the plugin to make it fully compatible with JupyterLab 4.0.</p> <p>In July and August, I made some modifications to the plugin&rsquo;s source code structure and published it on PyPI to facilitate user installation and promote the plugin. During this period, I also fixed several bugs. Afterwards, I began developing a new feature: the YAML visual editor (design doc <a href="https://s.apache.org/beam-yaml-jupyterlab">HERE</a>). This feature is particularly meaningful because Beam&rsquo;s Pipeline is described through YAML files, and a visual editor for YAML files can significantly improve developers&rsquo; efficiency. In July, I published the proposal for the YAML visual editor and, after gathering feedback from the community for some time, started working on its development. Initially, I planned to use native Cytoscape to build the plugin from scratch, but the workload was too heavy, and there were many mature flow chart plugins in the open-source community that could be referenced. Therefore, I chose XYFlow as the component for flow visualization and integrated it into the plugin. In August, I further optimized the YAML visual editor and fixed some bugs.</p> <img src="/images/blog/gsoc-25-jupyterlab-extensions/Yaml_main.png" alt="Main page of the YAML visual editor" width="100%"> <p>In September, I completed the project submission, passed Google&rsquo;s review, and successfully concluded the project.</p> <h1 id="development-conclusion">Development Conclusion</h1> <p>Overall, collaborating with Apache Beam&rsquo;s developers was a very enjoyable process. I learned a lot about Beam, and since I am a student engaged in high-performance geographic computing research, Beam may play a significant role in my future studies and work.</p> <p>I am excited to remain an active member of the Beam community. I hope to continue contributing to its development, applying what I have learned to both my academic pursuits and future collaborative projects. The experience has strengthened my commitment to open-source innovation and has set a strong foundation for ongoing participation in Apache Beam and related technologies.</p> <h1 id="special-thanks">Special Thanks</h1> <p>I would like to express my sincere gratitude to my mentor XQ Hu for his guidance and support throughout the project. Without his help, I would not have been able to complete this project successfully. His professionalism, patience, and passion have been truly inspiring. As a Google employee, he consistently dedicated time each week to the open-source community and willingly assisted students like me. His selfless dedication to open source is something I deeply admire and strive to emulate. He is also an exceptionally devoted teacher who not only imparted technical knowledge but also taught me how to communicate more effectively, handle interpersonal relationships, and collaborate better in a team setting. He always patiently addressed my questions and provided invaluable advice. I am immensely grateful to him and hope to have the opportunity to work with him again in the future.</p> <p>I also want to thank the Apache Beam community for their valuable feedback and suggestions, which have greatly contributed to the improvement of the plugin. I feel incredibly fortunate that we, as a society, have open-source communities where individuals contribute their intellect and time to drive collective technological progress and innovation. These communities provide students like me with invaluable opportunities to grow and develop rapidly.</p> <p>Finally, I would like to thank the Google Summer of Code program for providing me with this opportunity to contribute to open-source projects and gain valuable experience. Without Google Summer of Code, I might never have had the chance to engage with so many open-source projects, take that first step into the open-source community, or experience such substantial personal and professional growth.</p>/blog/gsoc-25-jupyterlab-extensions/Tue, 14 Oct 2025 00:00:00 +0800/blog/gsoc-25-jupyterlab-extensions/bloggsocGoogle Summer of Code 2025 - Beam ML Vector DB/Feature Store integrations <!-- 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. --> <h2 id="what-will-i-cover-in-this-blog-post">What Will I Cover In This Blog Post?</h2> <p>I have three objectives in mind when writing this blog post:</p> <ul> <li>Documenting the work I&rsquo;ve been doing during this GSoC period in collaboration with the Apache Beam community</li> <li>A thoughtful and cumulative thank you to my mentor and the Beam Community</li> <li>Writing to an older version of myself before making my first ever contribution to Beam. This can be helpful for future contributors</li> </ul> <h2 id="what-was-this-gsoc-project-about">What Was This GSoC Project About?</h2> <p>The goal of this project is to enhance Beam&rsquo;s Python SDK by developing connectors for vector databases like Milvus and feature stores like Tecton. These integrations will improve support for ML use cases such as Retrieval-Augmented Generation (RAG) and feature engineering. By bridging Beam with these systems, this project will attract more users, particularly in the ML community.</p> <h2 id="why-was-this-project-important">Why Was This Project Important?</h2> <p>While Beam&rsquo;s Python SDK supports some vector databases, feature stores and embedding generators, the current integrations are limited to a few systems as mentioned in the tables down below. Expanding this ecosystem will provide more flexibility and richness for ML workflows particularly in feature engineering and RAG applications, potentially attracting more users, particularly in the ML community.</p> <table> <thead> <tr> <th>Vector Database</th> <th>Feature Store</th> <th>Embedding Generator</th> </tr> </thead> <tbody> <tr> <td>BigQuery</td> <td>Vertex AI</td> <td>Vertex AI</td> </tr> <tr> <td>AlloyDB</td> <td>Feast</td> <td>Hugging Face</td> </tr> </tbody> </table> <h2 id="why-did-i-choose-beam-as-part-of-gsoc-among-180-orgs">Why Did I Choose Beam As Part of GSoC Among 180+ Orgs?</h2> <p>I chose to apply to Beam from among 180+ GSoC organizations because it aligns well with my passion for data processing systems that serve information retrieval systems and my core career values:</p> <ul> <li> <p><strong>Freedom:</strong> Working on Beam supports open-source development, liberating developers from vendor lock-in through its unified programming model while enabling services like <a href="https://projectshield.withgoogle.com/landing">Project Shield</a> to protect free speech globally</p> </li> <li> <p><strong>Innovation:</strong> Working on Beam allows engagement with cutting-edge data processing techniques and distributed computing paradigms</p> </li> <li> <p><strong>Accessibility:</strong> Working on Beam helps build open-source technology that makes powerful data processing capabilities available to all organizations regardless of size or resources. This accessibility enables projects like Project Shield to provide free protection to media, elections, and human rights websites worldwide</p> </li> </ul> <h2 id="what-did-i-work-on-during-the-gsoc-program">What Did I Work On During the GSoC Program?</h2> <p>During my GSoC program, I focused on developing connectors for vector databases, feature stores, and embedding generators to enhance Beam&rsquo;s ML capabilities. Here are the artifacts I worked on and what remains to be done:</p> <table> <thead> <tr> <th>Type</th> <th>System</th> <th>Artifact</th> </tr> </thead> <tbody> <tr> <td>Enrichment Handler</td> <td>Milvus</td> <td><a href="https://github.com/apache/beam/pull/35216">PR #35216</a> <br> <a href="https://github.com/apache/beam/pull/35577">PR #35577</a> <br> <a href="https://github.com/apache/beam/pull/35467">PR #35467</a></td> </tr> <tr> <td>Sink I/O</td> <td>Milvus</td> <td><a href="https://github.com/apache/beam/pull/35708">PR #35708</a> <br> <a href="https://github.com/apache/beam/pull/35944">PR #35944</a></td> </tr> <tr> <td>Enrichment Handler</td> <td>Tecton</td> <td><a href="https://github.com/apache/beam/pull/36062">PR #36062</a></td> </tr> <tr> <td>Sink I/O</td> <td>Tecton</td> <td><a href="https://github.com/apache/beam/pull/36078">PR #36078</a></td> </tr> <tr> <td>Embedding Gen</td> <td>OpenAI</td> <td><a href="https://github.com/apache/beam/pull/36081">PR #36081</a></td> </tr> <tr> <td>Embedding Gen</td> <td>Anthropic</td> <td>To Be Added</td> </tr> </tbody> </table> <p>Here are side-artifacts that are not directly linked to my project:</p> <table> <thead> <tr> <th>Type</th> <th>System</th> <th>Artifact</th> </tr> </thead> <tbody> <tr> <td>AI Code Review</td> <td>Gemini Code Assist</td> <td><a href="https://github.com/apache/beam/pull/35532">PR #35532</a></td> </tr> <tr> <td>Enrichment Handler</td> <td>CloudSQL</td> <td><a href="https://github.com/apache/beam/pull/34398">PR #34398</a> <br> <a href="https://github.com/apache/beam/pull/35473">PR #35473</a></td> </tr> <tr> <td>Pytest Markers</td> <td>GitHub CI</td> <td><a href="https://github.com/apache/beam/pull/35655">PR #35655</a> <br> <a href="https://github.com/apache/beam/pull/35740">PR #35740</a> <br> <a href="https://github.com/apache/beam/pull/35816">PR #35816</a></td> </tr> </tbody> </table> <p>For more granular contributions, checking out my <a href="https://github.com/apache/beam/pulls?q=is%3Apr+author%3Amohamedawnallah">ongoing Beam contributions</a>.</p> <h2 id="how-did-i-approach-this-project">How Did I Approach This Project?</h2> <p>My approach centered on community-driven design and iterative implementation, Originally inspired by my mentor&rsquo;s work. Here&rsquo;s how it looked:</p> <ol> <li><strong>Design Document</strong>: Created a comprehensive design document outlining the proposed ML connector architecture</li> <li><strong>Community Feedback</strong>: Shared the design with the Beam developer community mailing list for review</li> <li><strong>Iterative Implementation</strong>: Incorporated community feedback and applied learnings in subsequent pull requests</li> <li><strong>Continuous Improvement</strong>: Refined the approach based on real-world usage patterns and maintainer guidance</li> </ol> <p>Here are some samples of those design docs:</p> <table> <thead> <tr> <th>Component</th> <th>Type</th> <th>Design Document</th> </tr> </thead> <tbody> <tr> <td>Milvus</td> <td>Vector Enrichment Handler</td> <td><a href="https://lists.apache.org/thread/4c6l20tjopd94cqg6vsgj20xl2qgywtx">[Proposal][GSoC 2025] Milvus Vector Enrichment Handler for Beam</a></td> </tr> <tr> <td>Milvus</td> <td>Vector Sink I/O Connector</td> <td><a href="https://lists.apache.org/thread/cwlbwnhnf1kl7m0dn40jrqfsf4ho98tf">[Proposal][GSoC 2025] Milvus Vector Sink I/O Connector for Beam</a></td> </tr> <tr> <td>Tecton</td> <td>Feature Store Enrichment Handler</td> <td><a href="https://lists.apache.org/thread/7ynn4r8b8b1c47ojxlk39fhsn3t0jrd1">[Proposal][GSoC 2025] Tecton Feature Store Enrichment Handler for Beam</a></td> </tr> <tr> <td>Tecton</td> <td>Feature Store Sink I/O Connector</td> <td><a href="https://lists.apache.org/thread/dthd3t6md9881ksvbf4v05rxnlj1fgvn">[Proposal][GSoC 2025] Tecton Feature Store Sink I/O Connector for Beam</a></td> </tr> </tbody> </table> <h2 id="where-did-challenges-arise-during-the-project">Where Did Challenges Arise During The Project?</h2> <p>There were 2 places where challenges arose:</p> <ul> <li> <p><strong>Running Docker TestContainers in Beam Self-Hosted CI Environment:</strong> The main challenge was that Beam runs in CI on Ubuntu 20.04, which caused compatibility and connectivity issues with Milvus TestContainers due to the Docker-in-Docker environment. After several experiments with trial and error, I eventually tested with Ubuntu latest (which at the time of writing this blog post is Ubuntu 25.04), and no issues arose. This version compatibility problem led to the container startup failures and network connectivity issues</p> </li> <li> <p><strong>Triggering and Modifying the PostCommit Python Workflows:</strong> This challenge magnified the above issue since for every experiment update to the given workflow, I had to do a round trip to my mentor to include those changes in the relevant workflow files and evaluate the results. I also wasn&rsquo;t aware that someone can trigger post-commit Python workflows by updating the trigger files in <code>.github/trigger_files</code> until near the middle of GSoC. I discovered there is actually a workflows README document in <code>.github/workflows/README.md</code> that was not referenced in the <code>CONTRIBUTING.md</code> file at the time of writing this post</p> </li> </ul> <h2 id="how-did-this-project-start-to-attract-users-in-the-ml-community">How Did This Project Start To Attract Users in the ML Community?</h2> <p>It is observed that after we had a Milvus Enrichment Handler PR before even merging, we started to see community-driven contributions like <a href="https://github.com/apache/beam/pull/35686">this one that adds Qdrant</a>. Qdrant is a competitor to Milvus in the vector space. This demonstrates how the project&rsquo;s momentum and visibility in the ML community space attracted contributors who wanted to expand the Beam ML ecosystem with additional vector database integrations.</p> <h2 id="how-did-this-gsoc-experience-working-with-beam-community-shape-me">How Did This GSoC Experience Working With Beam Community Shape Me?</h2> <p>If I have to boil it down across three dimensions, they would be:</p> <ul> <li><strong>Mindset:</strong> Before I was probably working in solitude making PRs about new integrations with mental chatter in the form of fingers crossed, hoping that there will be no divergence on the design. Now I can engage people I am working with through design docs, making sure my work aligns with their vision, which potentially leads to faster PR merges</li> <li><strong>Skillset:</strong> It was one year before contributing to Beam where I wrote professionally in Python, so it was a great opprtunity to brush up on my Python skills and seeing how some design patterns are used in practice, like the query builder pattern seen in CloudSQL Vector Ingestion in the RAG package. I also learned about vector databases and feature stores, and also some AI integrations. I also think I got a bit better than before in root cause analysis and filtering signals from noise in long log files like PostCommit Python workflows</li> <li><strong>Toolset:</strong> Learning about Beam Python SDK, Milvus, Tecton, Google CloudSQL, OpenAI and Anthropic text embedding generators, and lnav for effective log file navigation, including their capabilities and limitations</li> </ul> <h2 id="tips-for-future-contributors">Tips for Future Contributors</h2> <p>If I have to boil them down to three, they would be:</p> <ul> <li><strong>Observing:</strong> Observing how experienced developers in the Beam dev team work—how their PRs look, how they write design docs, what kind of feedback they get on their design docs and PRs, and how you can apply it (if feasible) to avoid getting the same feedback again. What kind of follow-up PRs do they create after their initial ones? How do they document and illustrate their work? What kind of comments do they post when reviewing other people&rsquo;s related work? Over time, you build your own mental model and knowledge base on how the ideal contribution looks in this area. There is a lot to learn and explore in an exciting, not intimidating way</li> <li><strong>Orienting:</strong> Understanding your place in the ecosystem and aligning your work with the project&rsquo;s context. This means grasping how your contribution fits into Beam&rsquo;s architecture and roadmap, identifying your role in addressing current gaps, and mapping stakeholders who will review, use, and maintain your work. Most importantly, align with both your mentor&rsquo;s vision and the community&rsquo;s vision to ensure your work serves the broader goals</li> <li><strong>Acting:</strong> Acting on feedback from code reviews, design document discussions, and community input. This means thoughtfully addressing suggested changes in a way that moves the discussion forward, addressing concerns raised by maintainers, and iterating on your work based on community guidance. Being responsive to feedback, asking clarifying questions when needed, and demonstrating that you&rsquo;re incorporating the community&rsquo;s input into your contributions given that it is aligned with the project direction</li> </ul> <h2 id="who-do-i-want-to-thank-for-making-this-journey-possible">Who Do I Want To Thank for Making This Journey Possible?</h2> <p>If I have to boil them down to three, they would be:</p> <ul> <li><strong>My Mentor, Danny McCormick:</strong> I wouldn&rsquo;t hesitate to say that Danny is the best mentor I have worked with so far, given that I have worked with several mentors. What makes me say that: <ul> <li><strong>Generosity:</strong> Danny is very generous with his time, feedback, and genuinely committed to reviewing my work on a regular basis. We have weekly 30-minute sync calls over almost 21 weeks (5 months) since the official community bonding period, where he shares with me his contextual expertise and addresses any questions I may have with openness to extend time if needed and flexible about skipping calls when there was no agenda</li> <li><strong>Flexibility:</strong> When I got accepted to GSoC, after a few days I also got accepted to a part-time internship that I had applied to before GSoC, while also managing my last semester in my Bachelor of Computer Science, which was probably the hardest semester. During our discussion about working capacity, Danny was very flexible regarding that, with more emphasis on making progress, which encouraged me to make even more progress. I have also never felt there are very hard boundaries around my project scope—I felt there was an area to explore that motivated me to think of and add some side-artifacts to Beam, e.g., adding Gemini Code Assist for AI code review</li> <li><strong>Proactivity</strong>: Danny was very proactive in offering support and help without originally asking, e.g., making Beam Infra tickets that add API keys to unblock my work</li> </ul> </li> <li><strong>Beam Community:</strong> From my first ever contribution to Beam <a href="https://github.com/apache/beam/issues/32840#issuecomment-2424055627">adding FlattenWith and Tee examples to the playground</a>, I was welcomed with open arms and felt encouraged to make more contributions. Also, for their valuable comments on my design documents on the dev mailing list as well as the PRs</li> <li><strong>Google:</strong> I would like to genuinely thank Google for introducing me to open source in <a href="https://summerofcode.withgoogle.com/archive/2023/projects/u7Y9S6sc">GSoC 2023</a> and giving me a second chance to interact with Apache Beam through GSoC 2025. Without it, I probably wouldn&rsquo;t be here writing this blog post, nor would I have this fruitful experience</li> </ul> <h2 id="whats-next">What&rsquo;s Next?</h2> <p>I am now focusing on helping move the remaining artifacts in this project scope from the in-progress state to the merging state. After this, I would love to keep my contributions alive in Beam Python and Go SDK, to name a few. I would also love to connect with you all on my <a href="https://www.linkedin.com/in/mohamedawnallah/">LinkedIn</a> and <a href="https://github.com/mohamedawnallah">GitHub</a>.</p> <h2 id="references">References</h2> <ul> <li><a href="https://summerofcode.withgoogle.com/programs/2025/projects/X32yGjqz">Google Summer of Code Project Listing</a></li> <li><a href="https://docs.google.com/document/d/1YOeK3jb94kSOUxucfqeZL0pkRI08dYljV_4v5SH5i5U/edit?usp=sharing">Original GSoC Proposal</a></li> <li><a href="https://github.com/apache/beam/issues/35046">GSoC 2025 Tracking Issue</a></li> </ul>/blog/gsoc-25-ml-connectors/Fri, 26 Sep 2025 00:00:00 -0400/blog/gsoc-25-ml-connectors/bloggsocGoogle Summer of Code 2025 - Beam YAML, Kafka and Iceberg User Accessibility <!-- 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. --> <p>The relatively new Beam YAML SDK was introduced in the spirit of making data processing easy, but it has gained little adoption for complex ML tasks and hasn’t been widely used with <a href="https://beam.apache.org/documentation/io/managed-io/">Managed I/O</a> such as Kafka and Iceberg. As part of Google Summer of Code 2025, new illustrative, production-ready pipeline examples of ML use cases with Kafka and Iceberg data sources using the YAML SDK have been developed to address this adoption gap.</p> <h2 id="context">Context</h2> <p>The YAML SDK was introduced in Spring 2024 as Beam’s first no-code SDK. It follows a declarative approach of defining a data processing pipeline using a YAML DSL, as opposed to other programming language specific SDKs. At the time, it had few meaningful examples and documentation to go along with it. Key missing examples were ML workflows and integration with the Kafka and Iceberg Managed I/O. Foundational work had already been done to add support for ML capabilities as well as Kafka and Iceberg IO connectors in the YAML SDK, but there were no end-to-end examples demonstrating their usage.</p> <p>Beam, as well as Kafka and Iceberg, are mainstream big data technologies but they also have a learning curve. The overall theme of the project is to help democratize data processing for scientists and analysts who traditionally don’t have a strong background in software engineering. They can now refer to these meaningful examples as the starting point, helping them onboard faster and be more productive when authoring ML/data pipelines to their use cases with Beam and its YAML DSL.</p> <h2 id="contributions">Contributions</h2> <p>The data pipelines/workflows developed are production-ready: Kafka and Iceberg data sources are set up on GCP, and the data used are raw public datasets. The pipelines are tested end-to-end on Google Cloud Dataflow and are also unit tested to ensure correct transformation logic.</p> <p>Delivered pipelines/workflows, each with documentation as README.md, address 4 main ML use cases below:</p> <ol> <li> <p><strong>Streaming Classification Inference</strong>: A streaming ML pipeline that demonstrates Beam YAML capability to perform classification inference on a stream of incoming data from Kafka. The overall workflow also includes DistilBERT model deployment and serving on Google Cloud Vertex AI where the pipeline can access for remote inferences. The pipeline is applied to a sentiment analysis task on a stream of YouTube comments, preprocessing data and classifying whether a comment is positive or negative. See <a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/yaml/examples/transforms/ml/sentiment_analysis/streaming_sentiment_analysis.yaml">pipeline</a> and <a href="https://github.com/apache/beam/tree/master/sdks/python/apache_beam/yaml/examples/transforms/ml/sentiment_analysis">documentation</a>.</p> </li> <li> <p><strong>Streaming Regression Inference</strong>: A streaming ML pipeline that demonstrates Beam YAML capability to perform regression inference on a stream of incoming data from Kafka. The overall workflow also includes custom model training, deployment and serving on Google Cloud Vertex AI where the pipeline can access for remote inferences. The pipeline is applied to a regression task on a stream of taxi rides, preprocessing data and predicting the fare amount for every ride. See <a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/yaml/examples/transforms/ml/taxi_fare/streaming_taxifare_prediction.yaml">pipeline</a> and <a href="https://github.com/apache/beam/tree/master/sdks/python/apache_beam/yaml/examples/transforms/ml/taxi_fare">documentation</a>.</p> </li> <li> <p><strong>Batch Anomaly Detection</strong>: A ML workflow that demonstrates ML-specific transformations and reading from/writing to Iceberg IO. The workflow contains unsupervised model training and several pipelines that leverage Iceberg for storing results, BigQuery for storing vector embeddings and MLTransform for computing embeddings to demonstrate an end-to-end anomaly detection workflow on a dataset of system logs. See <a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/yaml/examples/transforms/ml/log_analysis/batch_log_analysis.sh">workflow</a> and <a href="https://github.com/apache/beam/tree/master/sdks/python/apache_beam/yaml/examples/transforms/ml/log_analysis">documentation</a>.</p> </li> <li> <p><strong>Feature Engineering &amp; Model Evaluation</strong>: A ML workflow that demonstrates Beam YAML capability to do feature engineering which is subsequently used for model evaluation, and its integration with Iceberg IO. The workflow contains model training and several pipelines, showcasing an end-to-end Fraud Detection MLOps solution that generates features and evaluates models to detect credit card transaction frauds. See <a href="https://github.com/apache/beam/blob/master/sdks/python/apache_beam/yaml/examples/transforms/ml/fraud_detection/fraud_detection_mlops_beam_yaml_sdk.ipynb">workflow</a> and <a href="https://github.com/apache/beam/tree/master/sdks/python/apache_beam/yaml/examples/transforms/ml/fraud_detection">documentation</a>.</p> </li> </ol> <h2 id="challenges">Challenges</h2> <p>The main challenge of the project was a lack of previous YAML pipeline examples and good documentation to rely on. Unlike the Python or Java SDKs where there are already many notebooks and end-to-end examples demonstrating various use cases, the examples for YAML SDK only involved simple transformations such as filter, group by, etc. More complex transforms like <code>MLTransform</code> and <code>ReadFromIceberg</code> had no examples and requires configurations that didn&rsquo;t have clear API reference at the time. As a result, there were a lot of deep dives into the actual implementation of the PTransforms across YAML, Python and Java SDKs to understand the error messages and how to correctly use the transforms.</p> <p>Another challenge was writing unit tests for the pipeline to ensure that the pipeline’s logic is correct. It was a learning curve to understand how the existing test suite is set up and how it can be used to write unit tests for the data pipelines. A lot of time was spent on properly writing mocks for the pipeline&rsquo;s sources and sinks, as well as for the transforms that require external services such as Vertex AI.</p> <h2 id="conclusion--personal-thoughts">Conclusion &amp; Personal Thoughts</h2> <p>These production-ready pipelines demonstrate the potential of Beam YAML SDK to author complex ML workflows that interact with Iceberg and Kafka. The examples are a nice addition to Beam, especially with Beam 3.0.0 milestones coming up where low-code/no-code, ML capabilities and Managed I/O are focused on.</p> <p>I had an amazing time working with the big data technologies Beam, Iceberg, and Kafka as well as many Google Cloud services (Dataflow, Vertex AI and Google Kubernetes Engine, to name a few). I’ve always wanted to work more in the ML space, and this experience has been a great growth opportunity for me. Google Summer of Code this year has been selective, and the project&rsquo;s success would not have been possible without the support of my mentor, Chamikara Jayalath. It&rsquo;s been a pleasure working closely with him and the broader Beam community to contribute to this open-source project that has a meaningful impact on the data engineering community.</p> <p>My advice for future Google Summer of Code participants is to first and foremost research and choose a project that aligns closely with your interest. Most importantly, spend a lot of time making yourself visible and writing a good proposal when the program is opened for applications. Being visible (e.g. by sharing your proposal, or generally any ideas and questions on the project&rsquo;s communication channel early on) makes it more likely for you to be selected; and a good proposal not only will make you even more likely to be in the program, but also give you a lot of confidence when contributing to and completing the project.</p> <h2 id="references">References</h2> <ul> <li><a href="https://summerofcode.withgoogle.com/programs/2025/projects/f4kiDdus">Google Summer of Code Project Listing</a></li> <li><a href="https://docs.google.com/document/d/1MSAVF6X9ggtVZbqz8YJGmMgkolR_dve0Lr930cByyac/edit?usp=sharing">Google Summer of Code Final Report</a></li> </ul>/blog/gsoc-25-yaml-user-accessibility/Tue, 23 Sep 2025 00:00:00 -0400/blog/gsoc-25-yaml-user-accessibility/bloggsocApache Beam 2.68.0 <!-- 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. --> <p>We are happy to present the new 2.68.0 release of Beam. This release includes both improvements and new functionality. See the <a href="/get-started/downloads/#2680-2025-09-??">download page</a> for this release.</p> <p>For more information on changes in 2.68.0, check out the <a href="https://github.com/apache/beam/milestone/36?closed=1">detailed release notes</a>.</p> <h2 id="highlights">Highlights</h2> <ul> <li>[Python] Prism runner now enabled by default for most Python pipelines using the direct runner (<a href="https://github.com/apache/beam/pull/34612">#34612</a>). This may break some tests, see <a href="https://github.com/apache/beam/pull/34612">https://github.com/apache/beam/pull/34612</a> for details on how to handle issues.</li> </ul> <h3 id="ios">I/Os</h3> <ul> <li>Upgraded Iceberg dependency to 1.9.2 (<a href="https://github.com/apache/beam/pull/35981">#35981</a>)</li> </ul> <h3 id="new-features--improvements">New Features / Improvements</h3> <ul> <li>BigtableRead Connector for BeamYaml added with new Config Param (<a href="https://github.com/apache/beam/pull/35696">#35696</a>)</li> <li>MongoDB Java driver upgraded from 3.12.11 to 5.5.0 with API refactoring and GridFS implementation updates (Java) (<a href="https://github.com/apache/beam/pull/35946">#35946</a>).</li> <li>Introduced a dedicated module for JUnit-based testing support: <code>sdks/java/testing/junit</code>, which provides <code>TestPipelineExtension</code> for JUnit 5 while maintaining backward compatibility with existing JUnit 4 <code>TestRule</code>-based tests (Java) (<a href="https://github.com/apache/beam/issues/18733">#18733</a>, <a href="https://github.com/apache/beam/pull/35688">#35688</a>). <ul> <li>To use JUnit 5 with Beam tests, add a test-scoped dependency on <code>org.apache.beam:beam-sdks-java-testing-junit</code>.</li> </ul> </li> <li>Google CloudSQL enrichment handler added (Python) (<a href="https://github.com/apache/beam/pull/34398">#34398</a>). Beam now supports data enrichment capabilities using SQL databases, with built-in support for: <ul> <li>Managed PostgreSQL, MySQL, and Microsoft SQL Server instances on CloudSQL</li> <li>Unmanaged SQL database instances not hosted on CloudSQL (e.g., self-hosted or on-premises databases)</li> </ul> </li> <li>[Python] Added the <code>ReactiveThrottler</code> and <code>ThrottlingSignaler</code> classes to streamline throttling behavior in DoFns, expose throttling mechanisms for users (<a href="https://github.com/apache/beam/pull/35984">#35984</a>)</li> <li>Added a pipeline option to specify the processing timeout for a single element by any PTransform (Java/Python/Go) (<a href="https://github.com/apache/beam/issues/35174">#35174</a>). <ul> <li>When specified, the SDK harness automatically restarts if an element takes too long to process. Beam runner may then retry processing of the same work item.</li> <li>Use the <code>--element_processing_timeout_minutes</code> option to reduce the chance of having stalled pipelines due to unexpected cases of slow processing, where slowness might not happen again if processing of the same element is retried.</li> </ul> </li> <li>(Python) Adding GCP Spanner Change Stream support for Python (apache_beam.io.gcp.spanner) (<a href="https://github.com/apache/beam/issues/24103">#24103</a>).</li> </ul> <h3 id="breaking-changes">Breaking Changes</h3> <ul> <li>Previously deprecated Beam ZetaSQL component has been removed (<a href="https://github.com/apache/beam/issues/34423">#34423</a>). ZetaSQL users could migrate to Calcite SQL with BigQuery dialect enabled.</li> <li>Upgraded Beam vendored Calcite to 1.40.0 for Beam SQL (<a href="https://github.com/apache/beam/issues/35483">#35483</a>), which improves support for BigQuery and other SQL dialects. Note: Minor behavior changes are observed such as output significant digits related to casting.</li> <li>(Python) The deterministic fallback coder for complex types like NamedTuple, Enum, and dataclasses now uses cloudpickle instead of dill. If your pipeline is affected, you may see a warning like: &ldquo;Using fallback deterministic coder for type X&hellip;&rdquo;. You can revert to the previous behavior by using the pipeline option <code>--update_compatibility_version=2.67.0</code> (<a href="https://github.com/apache/beam/pull/35725">35725</a>). Report any pickling related issues to <a href="https://github.com/apache/beam/issues/34903">#34903</a></li> <li>(Python) Prism runner now enabled by default for most Python pipelines using the direct runner (<a href="https://github.com/apache/beam/pull/34612">#34612</a>). This may break some tests, see <a href="https://github.com/apache/beam/pull/34612">https://github.com/apache/beam/pull/34612</a> for details on how to handle issues.</li> <li>Dropped Java 8 support for <a href="https://central.sonatype.com/artifact/org.apache.beam/beam-sdks-java-io-expansion-service">IO expansion-service</a>. Cross-language pipelines using this expansion service will need a Java11+ runtime (<a href="https://github.com/apache/beam/pull/35981">#35981</a>.</li> </ul> <h3 id="deprecations">Deprecations</h3> <ul> <li>Python SDK native SpannerIO (apache_beam/io/gcp/experimental/spannerio) is deprecated. Use cross-language wrapper (apache_beam/io/gcp/spanner) instead (Python) (<a href="https://github.com/apache/beam/issues/35860">#35860</a>).</li> <li>Samza runner is deprecated and scheduled for removal in Beam 3.0 (<a href="https://github.com/apache/beam/issues/35448">#35448</a>).</li> <li>Twister2 runner is deprecated and scheduled for removal in Beam 3.0 (<a href="https://github.com/apache/beam/issues/35905">#35905</a>)).</li> </ul> <h3 id="bugfixes">Bugfixes</h3> <ul> <li>(Python) Fixed Java YAML provider fails on Windows (<a href="https://github.com/apache/beam/issues/35617">#35617</a>).</li> <li>Fixed BigQueryIO creating temporary datasets in wrong project when temp_dataset is specified with a different project than the pipeline project. For some jobs, temporary datasets will now be created in the correct project (Python) (<a href="https://github.com/apache/beam/issues/35813">#35813</a>).</li> <li>(Go) Fix duplicates due to reads after blind writes to Bag State (<a href="https://github.com/apache/beam/issues/35869">#35869</a>). <ul> <li>Earlier Go SDK versions can avoid the issue by not reading in the same call after a blind write.</li> </ul> </li> </ul> <h2 id="list-of-contributors">List of Contributors</h2> <p>According to git shortlog, the following people contributed to the 2.68.0 release. Thank you to all contributors!</p> <p>Ahmed Abualsaud, Andrew Crites, Ashok Devireddy, Chamikara Jayalath, Charles Nguyen, Danny McCormick, Davda James, Derrick Williams, Diego Hernandez, Dip Patel, Dustin Rhodes, Enrique Calderon, Hai Joey Tran, Jack McCluskey, Kenneth Knowles, Keshav, Khorbaladze A., LEEKYE, Lanny Boarts, Mattie Fu, Minbo Bae, Mohamed Awnallah, Naireen Hussain, Nathaniel Young, Radosław Stankiewicz, Razvan Culea, Robert Bradshaw, Robert Burke, Sam Whittle, Shehab, Shingo Furuyama, Shunping Huang, Steven van Rossum, Suvrat Acharya, Svetak Sundhar, Tarun Annapareddy, Tom Stepp, Valentyn Tymofieiev, Vitaly Terentyev, XQ Hu, Yi Hu, apanich, arnavarora2004, claudevdm, flpablo, kristynsmith, shreyakhajanchi</p>/blog/beam-2.68.0/Mon, 22 Sep 2025 15:00:00 -0500/blog/beam-2.68.0/blogreleaseGoogle Summer of Code 25 - Improving Apache Beam's Infrastructure <!-- 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. --> <p>I loved contributing to Apache Beam during Google Summer of Code 2025. I worked on improving the infrastructure of Apache Beam, which included enhancing the CI/CD pipelines, automating various tasks, and improving the overall developer experience.</p> <h2 id="motivation">Motivation</h2> <p>Since I was in high school, I have been fascinated by computers, but when I discovered Open Source, I was amazed by the idea of people from all around the world collaborating to build software that anyone can use, just for the love of it. I started participating in open source communities, and I found it to be a great way to learn and grow as a developer.</p> <p>When I heard about Google Summer of Code, I saw it as an opportunity to take my open source contributions to the next level. The idea of working on a real-world project while being mentored by experienced developers sounded like an amazing opportunity. I heard about Apache Beam from another contributor and ex-GSoC participant, and I was immediately drawn to the project, specifically on the infrastructure side of things, as I have a strong interest in DevOps and automation.</p> <h2 id="the-challenge">The Challenge</h2> <p>When searching for a project, I was told that Apache Beam&rsquo;s infrastructure had several areas that could be improved. I was excited because the ideas were focused on improving the developer experience, and creating tools that could benefit not only Beam&rsquo;s developers but also the wider open source community.</p> <p>There were four main challenges:</p> <ol> <li>Automating the cleanup of unused cloud resources to reduce costs and improve resource management.</li> <li>Implementing a system for managing permissions through Git, allowing for better tracking and auditing of changes.</li> <li>Creating a tool for rotating service account keys to enhance security.</li> <li>Developing a security monitoring system to detect and respond to potential threats.</li> </ol> <h2 id="the-solution">The Solution</h2> <p>I worked closely with my mentor to break down and define each challenge into manageable tasks, creating a plan for the summer. I started by taking a look at the current state of the infrastructure, after which I began working on each challenge one by one.</p> <ol> <li> <p><strong>Automating the cleanup of unused cloud resources:</strong> We noticed that some resources in the GCP project, especially Pub/Sub topics created for testing, were often forgotten, leading to unnecessary costs. Since the infrastructure is primarily for testing and development, there&rsquo;s no need to keep unused resources. I developed a Python script that identifies and removes stale Pub/Sub topics that have existed for too long. This tool is now scheduled to run periodically via a GitHub Actions workflow to keep the project tidy and cost-effective.</p> </li> <li> <p><strong>Implementing a system for managing permissions through Git:</strong> This was more challenging, as it required a good understanding of both GCP IAM and the existing workflow. After some investigation, I learned that the current process was mostly manual and error-prone. The task involved creating a more automated and reliable system. This was achieved by using Terraform to define the desired state of IAM roles and permissions in code, which allows for better tracking and auditing of changes. This also included some custom roles, but that is still a work in progress.</p> </li> <li> <p><strong>Creating a tool for rotating service account keys:</strong> Key rotation is a security practice that we don&rsquo;t always follow, but it is essential to ensure that service account keys are not compromised. I noticed that GCP had some APIs that could help with this, but the rotation process itself was not automated. So I wrote a Python script that automates the rotation of GCP service account keys, enhancing the security of service account credentials.</p> </li> <li> <p><strong>Developing a security monitoring system:</strong> To keep track of incorrect usage and potential threats, I built a log analysis tool that monitors GCP audit logs for suspicious activity, collecting and parsing logs to identify potential security threats, delivering email alerts when something unusual is detected.</p> </li> </ol> <p>As an extra, and after noticing that some of these tools and policies could be ignored by developers, we also came up with the idea of an enforcement module to ensure the usage of these new tools and policies. This module would be integrated into the CI/CD pipeline, checking for compliance with the new infrastructure policies and notifying developers of any violations.</p> <h2 id="the-impact">The Impact</h2> <p>The tools developed during this project will have an impact on the Apache Beam community and the wider open source community. The automation of resource cleanup will help reduce costs and improve resource management, while the permission management system will provide better tracking and auditing of changes. The service account key rotation tool will enhance security, and the security monitoring system will help detect and respond to potential threats.</p> <h2 id="wrap-up">Wrap Up</h2> <p>This project has been an incredible learning experience for me. I have gained a better understanding of how GCP works, as well as how to use Terraform and GitHub Actions. I have also learned a lot about security best practices and how to implement them in a real-world project.</p> <p>I also learned a lot about working in an open source community, having direct communication with such experienced developers, and the importance of collaboration and communication in a distributed team. I am grateful for the opportunity to work on such an important project and to contribute to the Apache Beam community.</p> <p>Finally, a special thanks to my mentor, Pablo Estrada, for his guidance and support throughout the summer. I am grateful not only for his amazing technical skills but especially for his patience and encouragement on my journey contributing to open source.</p> <p>You can find my final report <a href="https://gist.github.com/ksobrenat32/b028b8303393afbe73a8fc5e17daff90">here</a> if you want to take a look at the details of my work.</p> <h2 id="advice-for-future-participants">Advice for Future Participants</h2> <p>If you are considering participating in Google Summer of Code, my advice would be to choose an area you are passionate about; this will make any coding challenge easier to overcome. Also, don&rsquo;t be afraid to ask questions and seek help from your mentors and the community. At the start, I made that mistake, and I learned that asking for help is a sign of strength, not weakness.</p> <p>Finally, make sure to manage your time effectively and stay organized (keeping a progress journal is a great idea). GSoC is a great opportunity to learn and grow as a developer, but it can also be time-consuming, so it&rsquo;s important to stay focused and on track.</p>/blog/gsoc-25-infra/Mon, 15 Sep 2025 00:00:00 -0600/blog/gsoc-25-infra/bloggsocApache Beam 2.67.0 <!-- 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. --> <p>We are happy to present the new 2.67.0 release of Beam. This release includes both improvements and new functionality. See the <a href="/get-started/downloads/#2670-2025-08-12">download page</a> for this release.</p> <p>For more information on changes in 2.67.0, check out the <a href="https://github.com/apache/beam/milestone/35?closed=1">detailed release notes</a>.</p> <h2 id="highlights">Highlights</h2> <h3 id="ios">I/Os</h3> <ul> <li>Debezium IO upgraded to 3.1.1 requires Java 17 (Java) (<a href="https://github.com/apache/beam/issues/34747">#34747</a>).</li> <li>Add support for streaming writes in IOBase (Python)</li> <li>Implement support for streaming writes in FileBasedSink (Python)</li> <li>Expose support for streaming writes in TextIO (Python)</li> </ul> <h3 id="new-features--improvements">New Features / Improvements</h3> <ul> <li>Added support for Processing time Timer in the Spark Classic runner (<a href="https://github.com/apache/beam/issues/33633">#33633</a>).</li> <li>Add pip-based install support for JupyterLab Sidepanel extension (<a href="https://github.com/apache/beam/issues/35397">#35397</a>).</li> <li>[IcebergIO] Create tables with a specified table properties (<a href="https://github.com/apache/beam/pull/35496">#35496</a>)</li> <li>Add support for comma-separated options in Python SDK (Python) (<a href="https://github.com/apache/beam/pull/35580">#35580</a>). Python SDK now supports comma-separated values for experiments and dataflow_service_options, matching Java SDK behavior while maintaining backward compatibility.</li> <li>Milvus enrichment handler added (Python) (<a href="https://github.com/apache/beam/pull/35216">#35216</a>). Beam now supports Milvus enrichment handler capabilities for vector, keyword, and hybrid search operations.</li> <li>[Beam SQL] Add support for DATABASEs, with an implementation for Iceberg (<a href="https://github.com/apache/beam/issues/35637">#35637</a>)</li> <li>Respect BatchSize and MaxBufferingDuration when using <code>JdbcIO.WriteWithResults</code>. Previously, these settings were ignored (<a href="https://github.com/apache/beam/pull/35669">#35669</a>).</li> </ul> <h3 id="breaking-changes">Breaking Changes</h3> <ul> <li>Go: The pubsubio.Read transform now accepts ReadOptions as a value type instead of a pointer, and requires exactly one of Topic or Subscription to be set (they are mutually exclusive). Additionally, the ReadOptions struct now includes a Topic field for specifying the topic directly, replacing the previous topic parameter in the Read function signature (<a href="https://github.com/apache/beam/pull/35369">#35369</a>).</li> <li>SQL: The <code>ParquetTable</code> external table provider has changed its handling of the <code>LOCATION</code> property. To read from a directory, the path must now end with a trailing slash (e.g., <code>LOCATION '/path/to/data/'</code>). Previously, a trailing slash was not required. This change was made to enable support for glob patterns and single-file paths (<a href="https://github.com/apache/beam/pull/35582">#35582</a>).</li> </ul> <h3 id="bugfixes">Bugfixes</h3> <ul> <li>[YAML] Fixed handling of missing optional fields in JSON parsing (<a href="https://github.com/apache/beam/issues/35179">#35179</a>).</li> <li>[Python] Fix WriteToBigQuery transform using CopyJob does not work with WRITE_TRUNCATE write disposition (<a href="https://github.com/apache/beam/issues/34247">#34247</a>)</li> <li>[Python] Fixed dicomio tags mismatch in integration tests (<a href="https://github.com/apache/beam/issues/30760">#30760</a>).</li> <li>[Java] Fixed spammy logging issues that affected versions 2.64.0 to 2.66.0.</li> </ul> <h3 id="known-issues">Known Issues</h3> <ul> <li>(<a href="https://github.com/apache/beam/issues/35666">#35666</a>). YAML Flatten incorrectly drops fields when input PCollections&rsquo; schema are different. This issue exists for all versions since 2.52.0.</li> </ul> <h2 id="list-of-contributors">List of Contributors</h2> <p>According to git shortlog, the following people contributed to the 2.67.0 release. Thank you to all contributors!</p> <p>Aditya Shukla, Ahmed Abualsaud, Arun Pandian, Boris Li, Chamikara Jayalath, Charles Nguyen, Chenzo, Danny McCormick, David Adeniji, Derrick Williams, Dmytro Tsyliuryk, Dustin Rhodes, Enrique Calderon, Gottipati Gautam, Hai Joey Tran, Hunor Portik, Jack McCluskey, Kenneth Knowles, Khorbaladze A., Marcio Sugar, Minh Son Nguyen, Mohamed Awnallah, Nathaniel Young, Nhon Dinh, Quentin Sommer, Rafael Raposo, Rakesh Kumar, Razvan Culea, Reuven Lax, Robert Bradshaw, Sam Whittle, Shunping Huang, Steven van Rossum, Talat UYARER, Tanu Sharma, Tarun Annapareddy, Tobi Kaymak, Tobias Kaymak, Valentyn Tymofieiev, Veronica Wasson, Vitaly Terentyev, XQ Hu, Yi Hu, akashorabek, arnavarora2004, changliiu, claudevdm, fozzie15, mvhensbergen, twosom</p>/blog/beam-2.67.0/Tue, 12 Aug 2025 15:00:00 -0500/blog/beam-2.67.0/blogreleaseOur Experience at Beam College 2025: 1st Place Hackathon Winners <!-- 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. --> <h2 id="introduction-the-beam-of-an-idea">Introduction: The Beam of an Idea</h2> <p>In the world of machine learning for healthcare, preprocessing large pathology image datasets at scale remains a bottleneck. Whole Slide Images (WSIs) in medical imaging can reach massive sizes. Traditional Python tools (PIL, etc.) fail under memory pressure, especially when handling thousands of such high-resolution images. This becomes a bottleneck for ML modeling tasks using standard tools.</p> <p>Having previously worked on image processing for object detection in machine learning, we also understood how crucial it is to preprocess and structure image data correctly for downstream tasks. These challenges are non-trivial and even more critical in healthcare, making it a natural and high-impact use case for scalable data processing frameworks like Apache Beam.</p> <p>So, in the <a href="https://beamcollege.dev/hackathon/">Beam Summit 2025 Hackathon</a>, we joined as team &ldquo;PCollectors&rdquo; with the goal to leverage Beam to process large image data and convert it to a format suitable for downstream ML tasks. We were amazed to know that we secured 1st place with the implemented solution!</p> <h2 id="the-project-scalable-wsi-preprocessing-beam-pipeline">The Project: Scalable WSI Preprocessing Beam Pipeline</h2> <p><a href="https://github.com/adityashukla8/medical_image_processing_beam">GitHub Repo</a></p> <h3 id="the-goal">The Goal</h3> <p>The primary objective of the pipeline was to process patient data (CSV) &amp; WSIs, extract embeddings, combine the metadata, and output the final dataset in TFRecord format, ready for large-scale ML training.</p> <h3 id="solution-overview">Solution Overview</h3> <p>Our pipeline processes:</p> <ul> <li>Patient metadata (CSV)</li> <li>WSI files (.tif)</li> <li>Split the images into “tiles”</li> <li>Extract filtered image tiles based on the background threshold</li> <li>Generate max &amp; avg embeddings per patient using EfficientNet</li> <li>Merge metadata + embeddings into TFRecords</li> </ul> <p>All in a scalable, memory-efficient, cloud-native pipeline using Apache Beam and Dataflow.</p> <h3 id="dataset">Dataset</h3> <p>Source: Mayo Clinic STRIP AI Dataset (Kaggle) Metadata: Each row = { image_id, center_id, patient_id, image_num, label } Multiple images per patient Labels exist only at the patient level Images: High-res .tif pathology slides</p> <h3 id="tech-stack">Tech Stack</h3> <ul> <li>Apache Beam: Orchestration engine</li> <li>Google Cloud Dataflow: Scalable runner</li> <li>Google Cloud Storage: Input TIFFs + output TFRecords</li> <li>TensorFlow: For embedding generation (EfficientNet) and TFRecord serialization</li> </ul> <h2 id="the-hackathon-journey">The Hackathon Journey</h2> <p>Participating in the hackathon introduced us to multiple new things and allowed us to learn and implement simultaneously. Through the hackathon weekend, we:</p> <ul> <li>Designed the end-to-end pipeline</li> <li>Integrated pyvips + openslide for efficient image loading</li> <li>Used Beam&rsquo;s RunInference API with TensorFlow</li> <li>Tiled and filtered images</li> <li>Wrote patient-level embeddings to TFRecords</li> </ul> <h2 id="what-we-learnt">What we Learnt</h2> <p>Apache Beam is really powerful for parallel and cloud-native ML preprocessing. Dataflow is the go-to tool when processing large data, like medical images</p> <h2 id="whats-next-for-the-project">What’s Next for The Project</h2> <p>Looking ahead, the pipeline can be extended beyond fixed-size tiling by incorporating image segmentation techniques to generate more meaningful patches based on tissue regions. This approach can improve ML model performance by focusing only on relevant areas. Moreover, the same preprocessing framework can be adapted for video data, where frames can be treated as time-indexed image slices, effectively enabling temporal modeling for time-series tasks such as motion analysis or progression tracking. Finally, we plan to adapt this pipeline to multiple downstream use cases for AI in healthcare by combining histology images with genomic data, clinical notes, or radiology scans, paving the way for more comprehensive and context-aware models in biomedical machine learning.</p> <p><strong>Project Submission Demo</strong>: <a href="https://drive.google.com/file/d/1Os5SvgqHiqfMkoCWOuaVvEPXsnhqXlLx/view?usp=sharing">Beam Demo - PCollectors.mp4</a></p> <h2 id="conclusion">Conclusion</h2> <p>We are ML Engineers, working at <a href="www.intuitive.cloud">Intuitive.Cloud</a>, where we play around with large-scale data to build scalable, efficient, dynamic data processing pipelines that prepare it for downstream ML tasks, with Apache Beam and Google Cloud DataFlow being the central pieces.</p> <p>Participating in the hackathon was a great learning opportunity, huge thanks to the organizers, mentors, and the Apache Beam community!</p> <p>- <a href="https://www.linkedin.com/in/adityashukla8/">Aditya Shukla</a> &amp; <a href="https://in.linkedin.com/in/darshan-kanade-0797851b3">Darshan Kanade</a></p>/blog/beam-summit-2025-hackathon-pcollectors-blog/Tue, 08 Jul 2025 00:00:00 +0000/blog/beam-summit-2025-hackathon-pcollectors-blog/blogApache Beam 2.66.0 <!-- 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. --> <p>We are happy to present the new 2.66.0 release of Beam. This release includes both improvements and new functionality. See the <a href="/get-started/downloads/#2660-2025-07-01">download page</a> for this release.</p> <p>For more information on changes in 2.66.0, check out the <a href="https://github.com/apache/beam/milestone/30?closed=1">detailed release notes</a>.</p> <h2 id="beam-300-development-highlights">Beam 3.0.0 Development Highlights</h2> <ul> <li>[Java] Java 8 support is now deprecated. It is still supported until Beam 3. From now, pipeline submitted by Java 8 client uses Java 11 SDK container for remote pipeline execution (<a href="https://github.com/apache/beam/pull/35064">35064</a>).</li> </ul> <h2 id="highlights">Highlights</h2> <ul> <li>[Python] Several quality-of-life improvements to the vLLM model handler. If you use Beam RunInference with vLLM model handlers, we strongly recommend updating past this release.</li> </ul> <h3 id="ios">I/Os</h3> <ul> <li>[IcebergIO] Now available with Beam SQL! (<a href="https://github.com/apache/beam/pull/34799">#34799</a>)</li> <li>[IcebergIO] Support reading with column pruning (<a href="https://github.com/apache/beam/pull/34856">#34856</a>)</li> <li>[IcebergIO] Support reading with pushdown filtering (<a href="https://github.com/apache/beam/pull/34827">#34827</a>)</li> <li>[IcebergIO] Create tables with a specified partition spec (<a href="https://github.com/apache/beam/pull/34966">#34966</a>, <a href="https://github.com/apache/beam/pull/35268">#35268</a>)</li> <li>[IcebergIO] Dynamically create namespaces if needed (<a href="https://github.com/apache/beam/pull/35228">#35228</a>)</li> </ul> <h3 id="new-features--improvements">New Features / Improvements</h3> <ul> <li>[Beam SQL] Introducing Beam Catalogs (<a href="https://github.com/apache/beam/pull/35223">#35223</a>)</li> <li>Adding Google Storage Requests Pays feature (Golang)(<a href="https://github.com/apache/beam/issues/30747">#30747</a>).</li> <li>[Python] Prism runner now auto-enabled for some Python pipelines using the direct runner (<a href="https://github.com/apache/beam/pull/34921">#34921</a>).</li> <li>[YAML] WriteToTFRecord and ReadFromTFRecord Beam YAML support</li> <li>Python: Added JupyterLab 4.x extension compatibility for enhanced notebook integration (<a href="https://github.com/apache/beam/pull/34495">#34495</a>).</li> </ul> <h3 id="breaking-changes">Breaking Changes</h3> <ul> <li>Yapf version upgraded to 0.43.0 for formatting (Python) (<a href="https://github.com/apache/beam/pull/34801/">#34801</a>).</li> <li>Python: Added JupyterLab 4.x extension compatibility for enhanced notebook integration (<a href="https://github.com/apache/beam/pull/34495">#34495</a>).</li> <li>Python: Argument abbreviation is no longer enabled within Beam. If you previously abbreviated arguments (e.g. <code>--r</code> for <code>--runner</code>), you will now need to specify the whole argument (<a href="https://github.com/apache/beam/pull/34934">#34934</a>).</li> <li>Java: Users of ReadFromKafkaViaSDF transform might encounter pipeline graph compatibility issues when updating the pipeline. To mitigate, set the <code>updateCompatibilityVersion</code> option to the SDK version used for the original pipeline, example <code>--updateCompatabilityVersion=2.64.0</code></li> <li>Python: Updated <code>AlloyDBVectorWriterConfig</code> API to align with new <code>PostgresVectorWriter</code> transform. Heres a quick guide to update your code: (<a href="https://github.com/apache/beam/issues/35225">#35225</a>)</li> </ul> <h3 id="bugfixes">Bugfixes</h3> <ul> <li>(Java) Fixed CassandraIO ReadAll does not let a pipeline handle or retry exceptions (<a href="https://github.com/apache/beam/pull/34191">#34191</a>).</li> <li>[Python] Fixed vLLM model handlers breaking Beam logging. (<a href="https://github.com/apache/beam/pull/35053">#35053</a>).</li> <li>[Python] Fixed vLLM connection leaks that caused a throughput bottleneck and underutilization of GPU (<a href="https://github.com/apache/beam/pull/35053">#35053</a>).</li> <li>[Python] Fixed vLLM server recovery mechanism in the event of a process termination (<a href="https://github.com/apache/beam/pull/35234">#35234</a>).</li> <li>(Python) Fixed cloudpickle overwriting class states every time loading a same object of dynamic class (<a href="https://github.com/apache/beam/issues/35062">#35062</a>).</li> <li>[Python] Fixed pip install apache-beam[interactive] causes crash on google colab (<a href="https://github.com/apache/beam/pull/35148">#35148</a>).</li> <li>[IcebergIO] Fixed Beam &lt;-&gt; Iceberg conversion logic for arrays of structs and maps of structs (<a href="https://github.com/apache/beam/pull/35230">#35230</a>).</li> </ul> <h3 id="known-issues">Known Issues</h3> <p>N/A</p> <h2 id="list-of-contributors">List of Contributors</h2> <p>According to git shortlog, the following people contributed to the 2.66.0 release. Thank you to all contributors!</p> <p>Aditya Yadav, Adrian Stoll, Ahmed Abualsaud, Bhargavkonidena, Chamikara Jayalath, Charles Nguyen, Chenzo, Damon, Danny McCormick, Derrick Williams, Enrique Calderon, Hai Joey Tran, Jack McCluskey, Kenneth Knowles, Leonardo Cesar Borges, Michael Gruschke, Minbo Bae, Minh Son Nguyen, Niel Markwick, Radosław Stankiewicz, Rakesh Kumar, Robert Bradshaw, S. Veyrié, Sam Whittle, Shubham Jaiswal, Shunping Huang, Steven van Rossum, Tanu Sharma, Vardhan Thigle, Vitaly Terentyev, XQ Hu, Yi Hu, akashorabek, atask-g, atognolag, bullet03, changliiu, claudevdm, fozzie15, ikarapanca, kristynsmith, Pablo Rodriguez Defino, tvalentyn, twosom, wollowizard</p>/blog/beam-2.66.0/Tue, 01 Jul 2025 15:00:00 -0500/blog/beam-2.66.0/blogrelease