blob: 6a52a883a87fecf050c2f20ef4771ab616b3bbdc [file] [log] [blame]
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Beam – beam</title><link>/categories/beam/</link><description>Recent content in beam on Apache Beam</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 11 Oct 2016 09:00:00 -0800</lastBuildDate><atom:link href="/categories/beam/index.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Strata+Hadoop World and Beam</title><link>/blog/strata-hadoop-world-and-beam/</link><pubDate>Tue, 11 Oct 2016 09:00:00 -0800</pubDate><guid>/blog/strata-hadoop-world-and-beam/</guid><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>Tyler Akidau and I gave a &lt;a href="https://conferences.oreilly.com/strata/hadoop-big-data-ny/public/schedule/detail/52129">three-hour tutorial&lt;/a> on Apache Beam at Strata+Hadoop World 2016. We had a plethora of help from our TAs: Kenn Knowles, Reuven Lax, Felipe Hoffa, Slava Chernyak, and Jamie Grier. There were a total of 66 people that attended the session.&lt;/p>
&lt;img src="/images/blog/IMG_20160927_170956.jpg" alt="Exercise time">
&lt;p>If you want to take a look at the tutorial materials, we’ve put them up &lt;a href="https://github.com/eljefe6a/beamexample">on GitHub&lt;/a>. This includes the &lt;a href="https://github.com/eljefe6a/beamexample/blob/master/BeamTutorial/slides.pdf">actual slides&lt;/a> as well as the &lt;a href="https://github.com/eljefe6a/beamexample/tree/master/BeamTutorial/src/main/java/org/apache/beam/examples/tutorial/game">exercises&lt;/a> that we covered. If you’re looking to learn a little about Beam, this is a good way to start. The exercises are based on an imaginary mobile game where data needs processing and are based on code in the &lt;a href="https://github.com/apache/beam/tree/master/examples/java/src/main/java/org/apache/beam/examples/complete/game">Beam examples directory&lt;/a>. The code has TODOs for where you need to fill in code or there are full sample solutions to look over our code. You can run these examples on your own machine or on a cluster using a runner that Beam supports.&lt;/p>
&lt;p>I want to share some of takeaways I had about Beam during the conference.&lt;/p>
&lt;p>The Data Engineers are looking to Beam as a way to &lt;a href="https://www.oreilly.com/ideas/future-proof-and-scale-proof-your-code">future-proof&lt;/a>, meaning that code is portable between the various Big Data frameworks. In fact, many of the attendees were still on Hadoop MapReduce and looking to transition to a new framework. They’re realizing that continually rewriting code isn’t the most productive approach.&lt;/p>
&lt;p>Data Scientists are really interested in using Beam. They interested in having a single API for doing analysis instead of several different APIs. We talked about Beam’s progress on the Python API. If you want to take a peek, it’s being actively developed on a &lt;a href="https://github.com/apache/beam/tree/master/sdks/python">feature branch&lt;/a>. As Beam matures, we’re looking to add other supported languages.&lt;/p>
&lt;p>We heard &lt;a href="https://twitter.com/jessetanderson/status/781124173108305920">loud and clear&lt;/a> from Beam users that great runner support is crucial to adoption. We have great Apache Flink support. During the conference we had some more volunteers offer their help on the Spark runner.&lt;/p>
&lt;p>On management and thought leader side, Beam went from “what’s Beam?” at previous conferences to “I’m interested in Beam.” or “I’ve formed an informed opinion on Beam.” at this conference. This is one of the metrics I look for in early technology adoption.&lt;/p>
&lt;img src="/images/blog/IMG_20160927_170455.jpg" alt="So much brainpower answering questions">
&lt;p>We rounded out the tutorial with live demonstrations of Beam running on Apache Spark, Apache Flink, the local runner, and DataFlow runner. Then, we brought in the big brainpower and had a Q and A session.&lt;/p>
&lt;p>If you’re attending a conference, we encourage you to look for a Beam session. If you want to use these materials to give your own Beam talk or tutorial, we’re happy to help you. In addition to this tutorial, we have &lt;a href="/contribute/presentation-materials/">other presentation materials&lt;/a>. You can reach out to us on the &lt;a href="/get-started/support/">user mailing list&lt;/a>.&lt;/p></description></item><item><title>Blog: The first release of Apache Beam!</title><link>/blog/first-release/</link><pubDate>Wed, 15 Jun 2016 00:00:01 -0700</pubDate><guid>/blog/first-release/</guid><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>I’m happy to announce that Apache Beam has officially released its first
version &amp;ndash; 0.1.0-incubating. This is an exciting milestone for the project,
which joined the Apache Software Foundation and the Apache Incubator earlier
this year.&lt;/p>
&lt;p>This release publishes the first set of Apache Beam binaries and source code,
making them readily available for our users. The initial release includes the
SDK for Java, along with three runners: Apache Flink, Apache Spark and Google
Cloud Dataflow, a fully-managed cloud service. The release is available both
in the &lt;a href="https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.beam%22">Maven Central Repository&lt;/a>,
as well as a download from the &lt;a href="/get-started/downloads/">project’s website&lt;/a>.&lt;/p>
&lt;p>The goal of this release was process-oriented. In particular, the Beam
community wanted to release existing functionality to our users, build and
validate the release processes, and obtain validation from the Apache Software
Foundation and the Apache Incubator.&lt;/p>
&lt;p>I’d like to encourage everyone to try out this release. Please keep in mind
that this is the first incubating release &amp;ndash; significant changes are to be
expected. As we march toward stability, a rapid cadence of future releases is
anticipated, perhaps one every 1-2 months.&lt;/p>
&lt;p>As always, the Beam community welcomes feedback. Stabilization, usability and
the developer experience will be our focus for the next several months. If you
have any comments or discover any issues, I’d like to invite you to reach out
to us via &lt;a href="/get-started/support/">user’s mailing list&lt;/a> or the
&lt;a href="https://issues.apache.org/jira/browse/BEAM/">Apache JIRA issue tracker&lt;/a>.&lt;/p></description></item><item><title>Blog: Apache Beam Presentation Materials</title><link>/blog/presentation-materials/</link><pubDate>Sun, 03 Apr 2016 11:00:00 -0700</pubDate><guid>/blog/presentation-materials/</guid><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>Are you interested in giving a presentation about Apache Beam? Perhaps you want to talk about Apache Beam at a local Meetup or a convention. Excellent! The Apache Beam community is excited to expand and grow the community. To help kickstart this process, we are excited to announce an initial set of &lt;a href="/contribute/presentation-materials/">Apache Beam presentation materials&lt;/a> which anyone can use to give a presentation about Apache Beam.&lt;/p>
&lt;p>As a community, we want to build a shared collection of high quality presentation materials. This initial set includes the following slide decks:&lt;/p>
&lt;ul>
&lt;li>The Apache Beam model
&lt;ul>
&lt;li>&lt;a href="https://goo.gl/r0nvWh">Long version&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://goo.gl/h5D1yR">Short version&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Using Apache Beam with runners
&lt;ul>
&lt;li>&lt;a href="https://goo.gl/2ay8mi">Google Cloud Dataflow&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>As Apache Beam grows, so will this repository of presentation materials. We are excited to add new materials as the Apache Beam ecosystem grows with new runners, SDKs, and so on. If you are interested in contributing content or have a request, please see the &lt;a href="/contribute/presentation-materials/">Apache Beam presentation materials&lt;/a> page or email the &lt;a href="mailto:user@beam.apache.org">&lt;code>user@beam.apache.org&lt;/code>&lt;/a> mailing list with your ideas or questions.&lt;/p></description></item><item><title>Blog: Clarifying &amp; Formalizing Runner Capabilities</title><link>/blog/capability-matrix/</link><pubDate>Thu, 17 Mar 2016 11:00:00 -0700</pubDate><guid>/blog/capability-matrix/</guid><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>With initial code drops complete (&lt;a href="https://github.com/apache/beam/pull/1">Dataflow SDK and Runner&lt;/a>, &lt;a href="https://github.com/apache/beam/pull/12">Flink Runner&lt;/a>, &lt;a href="https://github.com/apache/beam/pull/42">Spark Runner&lt;/a>) and expressed interest in runner implementations for &lt;a href="https://issues.apache.org/jira/browse/BEAM-9">Storm&lt;/a>, &lt;a href="https://issues.apache.org/jira/browse/BEAM-19">Hadoop&lt;/a>, and &lt;a href="https://issues.apache.org/jira/browse/BEAM-79">Gearpump&lt;/a> (amongst others), we wanted to start addressing a big question in the Apache Beam (incubating) community: what capabilities will each runner be able to support?&lt;/p>
&lt;p>While we’d love to have a world where all runners support the full suite of semantics included in the Beam Model (formerly referred to as the &lt;a href="https://www.vldb.org/pvldb/vol8/p1792-Akidau.pdf">Dataflow Model&lt;/a>), practically speaking, there will always be certain features that some runners can’t provide. For example, a Hadoop-based runner would be inherently batch-based and may be unable to (easily) implement support for unbounded collections. However, that doesn’t prevent it from being extremely useful for a large set of uses. In other cases, the implementations provided by one runner may have slightly different semantics that those provided by another (e.g. even though the current suite of runners all support exactly-once delivery guarantees, an &lt;a href="https://samza.apache.org/">Apache Samza&lt;/a> runner, which would be a welcome addition, would currently only support at-least-once).&lt;/p>
&lt;p>To help clarify things, we’ve been working on enumerating the key features of the Beam model in a &lt;a href="/documentation/runners/capability-matrix/">capability matrix&lt;/a> for all existing runners, categorized around the four key questions addressed by the model: &lt;span class="wwwh-what-dark">What&lt;/span> / &lt;span class="wwwh-where-dark">Where&lt;/span> / &lt;span class="wwwh-when-dark">When&lt;/span> / &lt;span class="wwwh-how-dark">How&lt;/span> (if you’re not familiar with those questions, you might want to read through &lt;a href="https://oreilly.com/ideas/the-world-beyond-batch-streaming-102">Streaming 102&lt;/a> for an overview). This table will be maintained over time as the model evolves, our understanding grows, and runners are created or features added.&lt;/p>
&lt;p>Included below is a summary snapshot of our current understanding of the capabilities of the existing runners (see the &lt;a href="/documentation/runners/capability-matrix/">live version&lt;/a> for full details, descriptions, and Jira links); since integration is still under way, the system as whole isn’t yet in a completely stable, usable state. But that should be changing in the near future, and we’ll be updating loud and clear on this blog when the first supported Beam 1.0 release happens.&lt;/p>
&lt;p>In the meantime, these tables should help clarify where we expect to be in the very near term, and help guide expectations about what existing runners are capable of, and what features runner implementers will be tackling next.&lt;/p>
&lt;p>
&lt;script type="text/javascript">
function ToggleTables(showDetails, anchor) {
document.getElementById("cap-summary").style.display = showDetails ? "none" : "block";
document.getElementById("cap-full").style.display = showDetails ? "block" : "none";
location.hash = anchor;
}
&lt;/script>
&lt;div id='cap-blog' style='display:block'>
&lt;table class='cap-summary'>
&lt;tr class='cap-summary' id='cap-blog-what'>
&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#'>
What is being computed?
&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability'>&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Beam Model&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Google Cloud Dataflow&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Flink&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Spark&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>ParDo&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>GroupByKey&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Flatten&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Combine&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Composite Transforms&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Side Inputs&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Source API&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Aggregators&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Keyed State&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary' id='cap-blog-where'>
&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#'>
Where in event time?
&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability'>&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Beam Model&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Google Cloud Dataflow&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Flink&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Spark&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Global windows&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Fixed windows&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#f9f9f9;border-color:#'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Sliding windows&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Session windows&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Custom windows&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Custom merging windows&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Timestamp control&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary' id='cap-blog-when'>
&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#'>
When in processing time?
&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability'>&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Beam Model&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Google Cloud Dataflow&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Flink&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Spark&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Configurable triggering&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Event-time triggers&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Processing-time triggers&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Count triggers&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>[Meta]data driven triggers&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Composite triggers&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Allowed lateness&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Timers&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary' id='cap-blog-how'>
&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#'>
How do refinements relate?
&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability'>&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Beam Model&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Google Cloud Dataflow&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Flink&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#fff'>Apache Spark&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Discarding&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Accumulating&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fff;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#fff'>&lt;b>Accumulating &amp;amp; Retracting&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#e1e0e0;border-color:#'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary' id='cap-blog-what'>
&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#ca1'>
Bounded Splittable DoFn Support Status
&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability'>&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Beam Model&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Google Cloud Dataflow&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Apache Flink&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Apache Spark&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Base&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Side Inputs&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Splittable DoFn Initiated Checkpointing&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Dynamic Splitting&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Bundle Finalization&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary' id='cap-blog-what'>
&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#ca1'>
Unbounded Splittable DoFn Support Status
&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability'>&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Beam Model&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Google Cloud Dataflow&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Apache Flink&lt;/th>
&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Apache Spark&lt;/th>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Base&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Side Inputs&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Splittable DoFn Initiated Checkpointing&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Dynamic Splitting&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>&lt;b>Bundle Finalization&lt;/b>
&lt;/th>
&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2713;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
&lt;center>
&lt;b>
~
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
&lt;center>
&lt;b>
&amp;#x2715;
&lt;/b>
&lt;b>
&lt;/b>
&lt;/center>
&lt;/td>
&lt;/tr>
&lt;tr class='cap-summary'>
&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
&lt;/tr>
&lt;/table>
&lt;/div>
&lt;/p></description></item><item><title>Blog: Dataflow Python SDK is now public!</title><link>/blog/python-sdk-now-public/</link><pubDate>Thu, 25 Feb 2016 13:00:00 -0800</pubDate><guid>/blog/python-sdk-now-public/</guid><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>When the Apache Beam project proposed entry into the &lt;a href="https://wiki.apache.org/incubator/BeamProposal">Apache Incubator&lt;/a> the proposal
included the &lt;a href="https://github.com/GoogleCloudPlatform/DataflowJavaSDK">Dataflow Java SDK&lt;/a>. In the long term, however, Apache Beam aims to support SDKs implemented in multiple languages, such as Python.&lt;/p>
&lt;p>Today, Google submitted the &lt;a href="https://github.com/GoogleCloudPlatform/DataflowPythonSDK">Dataflow Python (2.x) SDK&lt;/a> on GitHub. Google is committed to including the in progress python SDK in Apache Beam and, in that spirit, we&amp;rsquo;ve moved development of the Python SDK to a public repository. While this SDK will not be included with the initial (incubating) releases of Apache Beam, our we plan on incorporating the Python SDK into beam during incubation. We want to take the time to implement changes from the &lt;a href="https://goo.gl/nk5OM0">technical vision&lt;/a> into the Java SDK before we introduce a Python SDK for Apache Beam. We believe this will allow us to work on the model and SDKs in an ordered fashion.&lt;/p>
&lt;p>You can look for the Apache Beam Python SDK in the coming months once we finish forking and refactoring the Java SDK.&lt;/p>
&lt;p>Best,&lt;/p>
&lt;p>Apache Beam Team&lt;/p></description></item><item><title>Blog: Apache Beam has a logo!</title><link>/blog/beam-has-a-logo/</link><pubDate>Mon, 22 Feb 2016 10:21:48 -0800</pubDate><guid>/blog/beam-has-a-logo/</guid><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>One of the major benefits of Apache Beam is the fact that it unifies both
both batch and stream processing into one powerful model. In fact, this unification
is so important, the name Beam itself comes from the union of &lt;strong>B&lt;/strong>atch + str&lt;strong>EAM&lt;/strong> = Beam&lt;/p>
&lt;p>When the project started, we wanted a logo which was both appealing and visually
represented this unification.&lt;/p>
&lt;p>Thanks to the &lt;strong>amazing&lt;/strong> work of Stephanie Smythies, the Apache Beam project
now has a logo.&lt;/p>
&lt;p>&lt;em>drum roll&lt;/em> - &lt;strong>Presenting, the Apache Beam Logo!&lt;/strong>&lt;/p>
&lt;img src="/images/beam_logo_s.png" alt="Apache Beam Logo">
&lt;p>We are excited about this logo because it is &lt;strong>simple&lt;/strong>, &lt;strong>bright&lt;/strong>, and shows the
unification of bath and streaming, as beams of light, within the &amp;lsquo;B&amp;rsquo;. We will base
our future website and documentation design around this logo and its coloring. We
will also make various permutations and resolutions of this logo available in the
coming weeks. For any questions or comments, send an email to the &lt;code>dev@&lt;/code> email list
for Apache Beam.&lt;/p></description></item></channel></rss>