This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 4f65e67  Publishing website 2018/11/02 14:19:55 at commit e2f2c8b
4f65e67 is described below

commit 4f65e67b2091e4b50adef5c02ddeaedcc9587948
Author: jenkins <[email protected]>
AuthorDate: Fri Nov 2 14:19:55 2018 +0000

    Publishing website 2018/11/02 14:19:55 at commit e2f2c8b
---
 .../blog/2018/10/31/beam-summit-aftermath.html     | 337 ++++++++++
 website/generated-content/blog/index.html          |  31 +
 website/generated-content/feed.xml                 | 691 ++++-----------------
 website/generated-content/index.html               |  10 +-
 4 files changed, 493 insertions(+), 576 deletions(-)

diff --git 
a/website/generated-content/blog/2018/10/31/beam-summit-aftermath.html 
b/website/generated-content/blog/2018/10/31/beam-summit-aftermath.html
new file mode 100644
index 0000000..e8d0182
--- /dev/null
+++ b/website/generated-content/blog/2018/10/31/beam-summit-aftermath.html
@@ -0,0 +1,337 @@
+<!DOCTYPE html>
+<!--
+ 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. See accompanying LICENSE file.
+-->
+
+<html lang="en">
+  <!--
+ 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. See accompanying LICENSE file.
+-->
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <title>Inaugural edition of the Beam Summit Europe 2018 - aftermath</title>
+  <meta name="description" content="Almost 1 month ago, we had the pleasure to 
welcome the Beam community at Level39 in London for the inaugural edition of 
the Beam Summit London Summit.">
+  <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400"; 
rel="stylesheet">
+  <link rel="stylesheet" href="/css/site.css">
+  <script 
src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js";></script>
+  <script src="/js/bootstrap.min.js"></script>
+  <script src="/js/language-switch.js"></script>
+  <script src="/js/fix-menu.js"></script>
+  <script src="/js/section-nav.js"></script>
+  <script src="/js/page-nav.js"></script>
+  <link rel="canonical" 
href="https://beam.apache.org/blog/2018/10/31/beam-summit-aftermath.html"; 
data-proofer-ignore>
+  <link rel="shortcut icon" type="image/x-icon" href="/images/favicon.ico">
+  <link rel="alternate" type="application/rss+xml" title="Apache Beam" 
href="https://beam.apache.org/feed.xml";>
+  <link rel="stylesheet" 
href="https://use.fontawesome.com/releases/v5.4.1/css/all.css"; 
integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz"
 crossorigin="anonymous">
+  <script>
+    
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new 
Date();a=s.createElement(o),
+    
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+    
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+    ga('create', 'UA-73650088-1', 'auto');
+    ga('send', 'pageview');
+  </script>
+</head>
+
+  <body class="body ">
+    <!--
+ 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. See accompanying LICENSE file.
+-->
+
+<nav class="header navbar navbar-fixed-top">
+    <div class="navbar-header">
+      <button type="button" class="navbar-toggle" aria-expanded="false" 
aria-controls="navbar">
+        <span class="sr-only">Toggle navigation</span>
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+      </button>
+
+      <a href="/" class="navbar-brand" >
+        <img alt="Brand" style="height: 25px" 
src="/images/beam_logo_navbar.png">
+      </a>
+    </div>
+
+    <div class="navbar-mask closed"></div>
+
+    <div id="navbar" class="navbar-container closed">
+      <ul class="nav navbar-nav">
+        <li>
+          <a href="/get-started/beam-overview/">Get Started</a>
+        </li>
+        <li>
+          <a href="/documentation/">Documentation</a>
+        </li>
+        <li>
+          <a href="/documentation/sdks/java/">Languages</a>
+        </li>
+        <li>
+          <a href="/documentation/runners/capability-matrix/">RUNNERS</a>
+        </li>
+        <li>
+          <a href="/roadmap/">Roadmap</a>
+        </li>
+        <li>
+          <a href="/contribute/">Contribute</a>
+        </li>
+        <li>
+          <a href="/community/contact-us/">Community</a>
+        </li>
+        <li><a href="/blog">Blog</a></li>
+      </ul>
+      <ul class="nav navbar-nav navbar-right">
+        <li class="dropdown">
+          <a href="#" class="dropdown-toggle" data-toggle="dropdown" 
role="button" aria-haspopup="true" aria-expanded="false"><img 
src="https://www.apache.org/foundation/press/kit/feather_small.png"; alt="Apache 
Logo" style="height:20px;"><span class="caret"></span></a>
+          <ul class="dropdown-menu dropdown-menu-right">
+            <li><a href="http://www.apache.org/";>ASF Homepage</a></li>
+            <li><a href="http://www.apache.org/licenses/";>License</a></li>
+            <li><a href="http://www.apache.org/security/";>Security</a></li>
+            <li><a 
href="http://www.apache.org/foundation/thanks.html";>Thanks</a></li>
+            <li><a 
href="http://www.apache.org/foundation/sponsorship.html";>Sponsorship</a></li>
+            <li><a 
href="https://www.apache.org/foundation/policies/conduct";>Code of 
Conduct</a></li>
+          </ul>
+        </li>
+        <li>
+          <a 
href="https://github.com/apache/beam/edit/master/website/src/_posts/2018-10-30-beam-summit-aftermath.md";>
+            <i class="far fa-edit fa-lg" alt="Edit on GitHub" title="Edit on 
GitHub"></i>
+          </a>
+        </li>
+      </ul>
+    </div>
+</nav>
+
+    <div class="body__contained">
+      <!--
+ 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. See accompanying LICENSE file.
+-->
+
+
+
+<article class="post" itemscope itemtype="http://schema.org/BlogPosting";>
+
+  <header class="post-header">
+    <h1 class="post-title" itemprop="name headline">Inaugural edition of the 
Beam Summit Europe 2018 - aftermath</h1>
+    <p class="post-meta"><time datetime="2018-10-31T01:00:01-07:00" 
itemprop="datePublished">Oct 31, 2018</time> •
+       Matthias Baetens [<a 
href="https://twitter.com/matthiasbaetens";>@matthiasbaetens</a>]
+      
+    </p>
+  </header>
+
+  <div class="post-content" itemprop="articleBody">
+    <!--
+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>Almost 1 month ago, we had the pleasure to welcome the Beam community at 
Level39 in London for the inaugural edition of the Beam Summit London Summit. 
<!--more--></p>
+
+<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Day 1 
of the first Beam Summit London going full speed ahead! Sessions by <a 
href="https://twitter.com/SkyUK?ref_src=twsrc%5Etfw";>@SkyUK</a> <a 
href="https://twitter.com/GCPcloud?ref_src=twsrc%5Etfw";>@GCPcloud</a> <a 
href="https://twitter.com/Talend?ref_src=twsrc%5Etfw";>@Talend</a> <a 
href="https://twitter.com/PlantixApp?ref_src=twsrc%5Etfw";>@PlantixApp</a> and 
more! <a href="https://twitter.com/hashtag/ApacheBeam?sr [...]
+<script async="" src="https://platform.twitter.com/widgets.js"; 
charset="utf-8"></script>
+
+<h2 id="first-edition">First edition!</h2>
+
+<p>This first edition of the summit was a free event, with over 125 RSVPs. We 
had two days of content; day one was focused on the roadmap of the project, the 
ASF and use cases from companies that use Beam. The second day was divided into 
tracks (a beginner and an advanced track). Those presentations &amp; workshops 
were organised for the more than <strong>80 attendees</strong> - and next to 
that there were several other activities like discussions, a brainstorm 
session, a UX booth and a  [...]
+Google, Spotify, Talend, Sky, Amazon, Data Artisans, Datatonic, Vente 
Exclusive, ML6, Flumaion, Plantix, Polidea, Seznam and more!</p>
+
+<p><br /></p>
+<h4 id="topics-included-using-python-to-run-beam-on-flink">Topics included 
using Python to run Beam on Flink:</h4>
+<blockquote class="twitter-tweet" data-lang="nl"><p lang="en" 
dir="ltr">Don&#39;t miss <a 
href="https://twitter.com/snntrable?ref_src=twsrc%5Etfw";>@snntrable</a>&#39;s 
session at Beam Sumit London, Oct. 2, 2018, about <a 
href="https://twitter.com/hashtag/Python?src=hash&amp;ref_src=twsrc%5Etfw";>#Python</a>
 Streaming Pipelines with <a 
href="https://twitter.com/ApacheBeam?ref_src=twsrc%5Etfw";>@ApacheBeam</a> and 
<a href="https://twitter.com/ApacheFlink?ref_src=twsrc%5Etfw";>@ApacheFlink</a> 
[...]
+<script async="" src="https://platform.twitter.com/widgets.js"; 
charset="utf-8"></script>
+
+<p><br /></p>
+<h4 id="ml-with-beam-with-the-tensorflow-transform-integration">ML with Beam 
with the TensorFlow transform integration:</h4>
+<blockquote class="twitter-tweet" data-lang="nl"><p lang="en" dir="ltr">Such a 
great pleasure to listen to the talk by <a 
href="https://twitter.com/FsMatt?ref_src=twsrc%5Etfw";>@FsMatt</a> on TensorFlow 
transform at the <a 
href="https://twitter.com/hashtag/BeamSummit?src=hash&amp;ref_src=twsrc%5Etfw";>#BeamSummit</a>!
  <a href="https://twitter.com/ApacheBeam?ref_src=twsrc%5Etfw";>@ApacheBeam</a> 
<a href="https://twitter.com/TensorFlow?ref_src=twsrc%5Etfw";>@TensorFlow</a> <a 
href="https://tw [...]
+<script async="" src="https://platform.twitter.com/widgets.js"; 
charset="utf-8"></script>
+
+<p><br /></p>
+<h4 id="the-portability-layer-was-a-big-topic">The portability layer was a big 
topic:</h4>
+<blockquote class="twitter-tweet" data-lang="nl"><p lang="en" 
dir="ltr">Excellent talk by <a 
href="https://twitter.com/stadtlegende?ref_src=twsrc%5Etfw";>@stadtlegende</a> 
on adding portability to <a 
href="https://twitter.com/hashtag/ApacheBeam?src=hash&amp;ref_src=twsrc%5Etfw";>#ApacheBeam</a>,
 awesome milestone and next step to make the Apache Beam vision become a 
reality! <a 
href="https://t.co/M9jERlTeAE";>pic.twitter.com/M9jERlTeAE</a></p>&mdash; 
Matthias Feys (@FsMatt) <a href="https:/ [...]
+<script async="" src="https://platform.twitter.com/widgets.js"; 
charset="utf-8"></script>
+
+<p><br /></p>
+<h4 id="as-well-as-a-session-on-how-to-build-your-own-sdk">As well as a 
session on how to build your own SDK:</h4>
+<blockquote class="twitter-tweet" data-lang="nl"><p lang="en" dir="ltr">Robert 
Bredshaw explains how to build a new <a 
href="https://twitter.com/ApacheBeam?ref_src=twsrc%5Etfw";>@ApacheBeam</a> 
SDK.<a 
href="https://twitter.com/hashtag/BeamSummit?src=hash&amp;ref_src=twsrc%5Etfw";>#BeamSummit</a>
 <a href="https://t.co/Bj84GJimdo";>pic.twitter.com/Bj84GJimdo</a></p>&mdash; 
Maximilian Michels 🧗 (@stadtlegende) <a 
href="https://twitter.com/stadtlegende/status/1047139320195366912?ref_src=twsrc%5
 [...]
+<script async="" src="https://platform.twitter.com/widgets.js"; 
charset="utf-8"></script>
+
+<h2 id="presentations">Presentations</h2>
+<p>In the aftermath of the Summit, you can check the presentations of all the 
sessions.</p>
+
+<h3 id="day-1-use-cases">Day 1: Use cases</h3>
+<ul>
+  <li><a 
href="https://drive.google.com/open?id=1hyHw7RVpFrFpli3vLt6JGBHrEm4BcgF-5nRdH1ZE8qo";>Day
 1 - Session 1 - Large scale stream analytics with Apache Beam at Sky</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1MxYrFDVoVFsrzbTtmr18zcbPFUU4nSdi";>Day 1 
- Session 2 - Running Quantitative Analytics with Apache Beam</a></li>
+  <li><a 
href="https://drive.google.com/open?id=0B4bFLXEWuluSdVBJSnZrbTZjSGFHbnd4cExYOGZQU2hmY3lF";>Day
 1 - Session 3 - Talend Data Streams: Building Big Data pipelines with Apache 
Beam</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1-GIUVn9QBtg6t-O8uINDkMO4PyZSU_HAEjMWuUHiYY4";>Day
 1 - Session 4 - Lesson Learned from Migrating to Apache Beam for Geo-Data 
Visualisation</a></li>
+</ul>
+
+<h3 id="day-2-beginners-track">Day 2: Beginners track</h3>
+<ul>
+  <li><a 
href="https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI";>Day
 2 - Beginner - Session 1 - Development Environment with Apache Beam</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI";>Day
 2 - Beginner - Session 2 - Towards Portability and Beyond</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI";>Day
 2 - Beginner - Session 3 - Python Streaming Pipelines with Beam on 
Flink</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI";>Day
 2 - Beginner - Session 4 - How runners execute a Beam pipeline</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI";>Day
 2 - Beginner - Session 5 - IO Integration Testing framework in Apache 
Beam</a></li>
+</ul>
+
+<h3 id="day-2-advanced-track">Day 2: Advanced track</h3>
+<ul>
+  <li><a 
href="https://drive.google.com/open?id=1Kr1skutObtDil2CExSQUb5rCVwZQm1m2lpmuAXFCE5I";>Day
 2 - Advanced - Session 1 -  Pre-processing for TensorFlow pipelines with 
Apache Beam &amp;  tf.Transform</a></li>
+  <li><a 
href="https://drive.google.com/open?id=11x7gtuAxg76nOQKaB0YOwcvzS4TUeWONTU1ZQK0LsX8";>Day
 2 - Advanced - Session 2 - Streaming data into BigQuery: schema generation 
with Protobuf</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1cgQGBIXaACSwbYu_w3AkvvTdsCfeXAS1tBvQ77eVn74";>Day
 2 - Advanced - Session 3 - Implementing a SplittableParDo</a></li>
+  <li><a 
href="https://docs.google.com/presentation/d/1F02Lwnqm9H3cGqDQhIZ3gbftyLQSnVMRxX69H_d04OE/edit?usp=sharing";>Day
 2 - Advanced - Session 4 - Big Data on Google Cloud with Scala and 
Scio</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1D1ajcKoOR5OzehPwONdHLSzpO4PZOsLk";>Day 2 
- Advanced - Session 5 - Landuse Classification of Satellite Imagery</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI";>Day
 2 - Advanced - Session 6 - Java 8 DSL for Beam SDK</a></li>
+  <li><a 
href="https://drive.google.com/open?id=1AkU-QXSflau-RSeolB4TSLy0_mg0xwb398Czw7aqVGw";>Day
 2  - Advanced - Session 7 - So, You Want to Write a Beam SDK?</a></li>
+</ul>
+
+<h2 id="recordings">Recordings</h2>
+<p>In case you prefer rewatching the recorded talks together with those 
slides, we are also happy to share the recordings of the majority of the 
sessions:</p>
+
+<iframe width="560" height="315" 
src="https://www.youtube.com/embed/videoseries?list=PL4dEBWmGSIU_9JTGnkGVg6-BwaV0FMxyJ";
 frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; 
picture-in-picture" allowfullscreen=""></iframe>
+
+<h3 id="day-1-use-cases-1">Day 1: Use cases</h3>
+<ul>
+  <li><a href="https://youtu.be/En0FrjvNr3M";>Day 1 - Session 1 - Large scale 
stream analytics with Apache Beam at Sky</a></li>
+  <li><a href="https://youtu.be/6yDEOUophuw";>Day 1 - Session 2 - Running 
Quantitative Analytics with Apache Beam</a></li>
+  <li><a href="https://youtu.be/1AlEGUtiQek";>Day 1 - Session 3 - Talend Data 
Streams: Building Big Data pipelines with Apache Beam</a></li>
+  <li><a href="https://youtu.be/GBKqw03doHE";>Day 1 - Session 4 - Lesson 
Learned from Migrating to Apache Beam for Geo-Data Visualisation</a></li>
+</ul>
+
+<h3 id="day-2-advanced-track-1">Day 2: Advanced track</h3>
+<ul>
+  <li><a href="https://youtu.be/L-k6-3ApXR4";>Day 2 - Advanced - Session 1 -  
Pre-processing for TensorFlow pipelines with Apache Beam &amp;  
tf.Transform</a></li>
+  <li><a href="https://youtu.be/ctN5U_Ke8uk";>Day 2 - Advanced - Session 2 - 
Streaming data into BigQuery: schema generation with Protobuf</a></li>
+  <li><a href="https://youtu.be/jU6EmPyKefg";>Day 2 - Advanced - Session 3 - 
Implementing a SplittableParDo</a></li>
+  <li><a href="https://youtu.be/F0n9sqj1_NQ";>Day 2 - Advanced - Session 4 - 
Big Data on Google Cloud with Scala and Scio</a></li>
+  <li><a href="https://youtu.be/s-IR2eFe4B4";>Day 2 - Advanced - Session 5 - 
Landuse Classification of Satellite Imagery</a></li>
+  <li><a href="https://youtu.be/ott1e_CnZ04";>Day 2 - Advanced - Session 6 - 
Java 8 DSL for Beam SDK</a></li>
+  <li><a href="https://youtu.be/VsGQ2LFeTHY";>Day 2  - Advanced - Session 7 - 
So, You Want to Write a Beam SDK?</a></li>
+</ul>
+
+<h2 id="wrapping-up">Wrapping up</h2>
+
+<p>We are also gathering feedback and thoughts on the Summit - please add your 
thoughts and discussions to the <a 
href="https://lists.apache.org/thread.html/aa1306da25029dff12a49ba3ce63f2caf6a5f8ba73eda879c8403f3f@%3Cdev.beam.apache.org%3E";>topic
 on the mailing list</a>.</p>
+
+<p>Overall, we hope our attendees enjoyed this first edition of our summit and 
want to thank <strong>our sponsors Google, Datatonic, Vente-Exclusive</strong> 
to make this possible.</p>
+
+<blockquote class="twitter-tweet" data-lang="nl"><p lang="en" 
dir="ltr">Wrapping up the first day of the <a 
href="https://twitter.com/hashtag/BeamSummit?src=hash&amp;ref_src=twsrc%5Etfw";>#BeamSummit</a>.
 Excellent view from the <a 
href="https://twitter.com/hashtag/level39?src=hash&amp;ref_src=twsrc%5Etfw";>#level39</a>
 venue. Very happy with the line up. <a 
href="https://t.co/7FhokKbQY5";>pic.twitter.com/7FhokKbQY5</a></p>&mdash; Alex 
Van Boxel (@alexvb) <a href="https://twitter.com/alexvb [...]
+<script async="" src="https://platform.twitter.com/widgets.js"; 
charset="utf-8"></script>
+
+
+  </div>
+
+</article>
+
+    </div>
+    <!--
+ 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. See accompanying LICENSE file.
+-->
+
+<footer class="footer">
+  <div class="footer__contained">
+    <div class="footer__cols">
+      <div class="footer__cols__col">
+        <div class="footer__cols__col__logo">
+          <img src="/images/beam_logo_circle.svg" class="footer__logo" 
alt="Beam logo">
+        </div>
+        <div class="footer__cols__col__logo">
+          <img src="/images/apache_logo_circle.svg" class="footer__logo" 
alt="Apache logo">
+        </div>
+      </div>
+      <div class="footer__cols__col footer__cols__col--md">
+        <div class="footer__cols__col__title">Start</div>
+        <div class="footer__cols__col__link"><a 
href="/get-started/beam-overview/">Overview</a></div>
+        <div class="footer__cols__col__link"><a 
href="/get-started/quickstart-java/">Quickstart (Java)</a></div>
+        <div class="footer__cols__col__link"><a 
href="/get-started/quickstart-py/">Quickstart (Python)</a></div>
+        <div class="footer__cols__col__link"><a 
href="/get-started/quickstart-go/">Quickstart (Go)</a></div>
+        <div class="footer__cols__col__link"><a 
href="/get-started/downloads/">Downloads</a></div>
+      </div>
+      <div class="footer__cols__col footer__cols__col--md">
+        <div class="footer__cols__col__title">Docs</div>
+        <div class="footer__cols__col__link"><a 
href="/documentation/programming-guide/">Concepts</a></div>
+        <div class="footer__cols__col__link"><a 
href="/documentation/pipelines/design-your-pipeline/">Pipelines</a></div>
+        <div class="footer__cols__col__link"><a 
href="/documentation/runners/capability-matrix/">Runners</a></div>
+      </div>
+      <div class="footer__cols__col footer__cols__col--md">
+        <div class="footer__cols__col__title">Community</div>
+        <div class="footer__cols__col__link"><a 
href="/contribute/">Contribute</a></div>
+        <div class="footer__cols__col__link"><a 
href="https://projects.apache.org/committee.html?beam"; target="_blank">Team<img 
src="/images/external-link-icon.png"
+                                                                               
                                                 width="14" height="14"
+                                                                               
                                                 alt="External link."></a></div>
+        <div class="footer__cols__col__link"><a 
href="/contribute/presentation-materials/">Media</a></div>
+      </div>
+      <div class="footer__cols__col footer__cols__col--md">
+        <div class="footer__cols__col__title">Resources</div>
+        <div class="footer__cols__col__link"><a href="/blog/">Blog</a></div>
+        <div class="footer__cols__col__link"><a 
href="/get-started/support/">Support</a></div>
+        <div class="footer__cols__col__link"><a 
href="https://github.com/apache/beam";>GitHub</a></div>
+      </div>
+    </div>
+  </div>
+  <div class="footer__bottom">
+    &copy;
+    <a href="http://www.apache.org";>The Apache Software Foundation</a>
+    | <a href="/privacy_policy">Privacy Policy</a>
+    | <a href="/feed.xml">RSS Feed</a>
+    <br><br>
+    Apache Beam, Apache, Beam, the Beam logo, and the Apache feather logo are
+    either registered trademarks or trademarks of The Apache Software
+    Foundation. All other products or name brands are trademarks of their
+    respective holders, including The Apache Software Foundation.
+  </div>
+</footer>
+
+  </body>
+</html>
diff --git a/website/generated-content/blog/index.html 
b/website/generated-content/blog/index.html
index 118e791..8c5cdb2 100644
--- a/website/generated-content/blog/index.html
+++ b/website/generated-content/blog/index.html
@@ -148,6 +148,37 @@ limitations under the License.
 <p>This is the blog for the Apache Beam project. This blog contains news and 
updates
 for the project.</p>
 
+<h3 id="inaugural-edition-of-the-beam-summit-europe-2018---aftermath"><a 
class="post-link" href="/blog/2018/10/31/beam-summit-aftermath.html">Inaugural 
edition of the Beam Summit Europe 2018 - aftermath</a></h3>
+<p><i>Oct 31, 2018 •
+ Matthias Baetens [<a 
href="https://twitter.com/matthiasbaetens";>@matthiasbaetens</a>]
+</i></p>
+
+<!--
+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>Almost 1 month ago, we had the pleasure to welcome the Beam community at 
Level39 in London for the inaugural edition of the Beam Summit London 
Summit.</p>
+
+<!-- Render a "read more" button if the post is longer than the excerpt -->
+
+<p>
+<a class="btn btn-default btn-sm" 
href="/blog/2018/10/31/beam-summit-aftermath.html" role="button">
+Read more&nbsp;<span class="glyphicon glyphicon-menu-right" 
aria-hidden="true"></span>
+</a>
+</p>
+
+<hr />
+
 <h3 id="apache-beam-280"><a class="post-link" 
href="/blog/2018/10/29/beam-2.8.0.html">Apache Beam 2.8.0</a></h3>
 <p><i>Oct 29, 2018 •
  Ahmet Altay 
diff --git a/website/generated-content/feed.xml 
b/website/generated-content/feed.xml
index 823cd6a..bac7abd 100644
--- a/website/generated-content/feed.xml
+++ b/website/generated-content/feed.xml
@@ -20,6 +20,126 @@
     <generator>Jekyll v3.2.0</generator>
     
       <item>
+        <title>Inaugural edition of the Beam Summit Europe 2018 - 
aftermath</title>
+        <description>&lt;!--
+Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+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 &quot;AS IS&quot; 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.
+--&gt;
+
+&lt;p&gt;Almost 1 month ago, we had the pleasure to welcome the Beam community 
at Level39 in London for the inaugural edition of the Beam Summit London 
Summit. &lt;!--more--&gt;&lt;/p&gt;
+
+&lt;blockquote class=&quot;twitter-tweet&quot; 
data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; 
dir=&quot;ltr&quot;&gt;Day 1 of the first Beam Summit London going full speed 
ahead! Sessions by &lt;a 
href=&quot;https://twitter.com/SkyUK?ref_src=twsrc%5Etfw&quot;&gt;@SkyUK&lt;/a&gt;
 &lt;a 
href=&quot;https://twitter.com/GCPcloud?ref_src=twsrc%5Etfw&quot;&gt;@GCPcloud&lt;/a&gt;
 &lt;a 
href=&quot;https://twitter.com/Talend?ref_src=twsrc%5Etfw&quot;&gt;@Talend&lt;/a&gt;
 &lt;a href=&quot;ht [...]
+&lt;script async=&quot;&quot; 
src=&quot;https://platform.twitter.com/widgets.js&quot; 
charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+&lt;h2 id=&quot;first-edition&quot;&gt;First edition!&lt;/h2&gt;
+
+&lt;p&gt;This first edition of the summit was a free event, with over 125 
RSVPs. We had two days of content; day one was focused on the roadmap of the 
project, the ASF and use cases from companies that use Beam. The second day was 
divided into tracks (a beginner and an advanced track). Those presentations 
&amp;amp; workshops were organised for the more than &lt;strong&gt;80 
attendees&lt;/strong&gt; - and next to that there were several other activities 
like discussions, a brainstorm sess [...]
+Google, Spotify, Talend, Sky, Amazon, Data Artisans, Datatonic, Vente 
Exclusive, ML6, Flumaion, Plantix, Polidea, Seznam and more!&lt;/p&gt;
+
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;h4 
id=&quot;topics-included-using-python-to-run-beam-on-flink&quot;&gt;Topics 
included using Python to run Beam on Flink:&lt;/h4&gt;
+&lt;blockquote class=&quot;twitter-tweet&quot; 
data-lang=&quot;nl&quot;&gt;&lt;p lang=&quot;en&quot; 
dir=&quot;ltr&quot;&gt;Don&amp;#39;t miss &lt;a 
href=&quot;https://twitter.com/snntrable?ref_src=twsrc%5Etfw&quot;&gt;@snntrable&lt;/a&gt;&amp;#39;s
 session at Beam Sumit London, Oct. 2, 2018, about &lt;a 
href=&quot;https://twitter.com/hashtag/Python?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Python&lt;/a&gt;
 Streaming Pipelines with &lt;a href=&quot;https://twitter.com/ApacheBeam?ref 
[...]
+&lt;script async=&quot;&quot; 
src=&quot;https://platform.twitter.com/widgets.js&quot; 
charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;h4 
id=&quot;ml-with-beam-with-the-tensorflow-transform-integration&quot;&gt;ML 
with Beam with the TensorFlow transform integration:&lt;/h4&gt;
+&lt;blockquote class=&quot;twitter-tweet&quot; 
data-lang=&quot;nl&quot;&gt;&lt;p lang=&quot;en&quot; 
dir=&quot;ltr&quot;&gt;Such a great pleasure to listen to the talk by &lt;a 
href=&quot;https://twitter.com/FsMatt?ref_src=twsrc%5Etfw&quot;&gt;@FsMatt&lt;/a&gt;
 on TensorFlow transform at the &lt;a 
href=&quot;https://twitter.com/hashtag/BeamSummit?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#BeamSummit&lt;/a&gt;!
  &lt;a href=&quot;https://twitter.com/ApacheBeam?ref_src=twsrc%5Etfw&quot; 
[...]
+&lt;script async=&quot;&quot; 
src=&quot;https://platform.twitter.com/widgets.js&quot; 
charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;h4 id=&quot;the-portability-layer-was-a-big-topic&quot;&gt;The portability 
layer was a big topic:&lt;/h4&gt;
+&lt;blockquote class=&quot;twitter-tweet&quot; 
data-lang=&quot;nl&quot;&gt;&lt;p lang=&quot;en&quot; 
dir=&quot;ltr&quot;&gt;Excellent talk by &lt;a 
href=&quot;https://twitter.com/stadtlegende?ref_src=twsrc%5Etfw&quot;&gt;@stadtlegende&lt;/a&gt;
 on adding portability to &lt;a 
href=&quot;https://twitter.com/hashtag/ApacheBeam?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#ApacheBeam&lt;/a&gt;,
 awesome milestone and next step to make the Apache Beam vision become a 
reality! &lt;a href=&quot [...]
+&lt;script async=&quot;&quot; 
src=&quot;https://platform.twitter.com/widgets.js&quot; 
charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;h4 id=&quot;as-well-as-a-session-on-how-to-build-your-own-sdk&quot;&gt;As 
well as a session on how to build your own SDK:&lt;/h4&gt;
+&lt;blockquote class=&quot;twitter-tweet&quot; 
data-lang=&quot;nl&quot;&gt;&lt;p lang=&quot;en&quot; 
dir=&quot;ltr&quot;&gt;Robert Bredshaw explains how to build a new &lt;a 
href=&quot;https://twitter.com/ApacheBeam?ref_src=twsrc%5Etfw&quot;&gt;@ApacheBeam&lt;/a&gt;
 SDK.&lt;a 
href=&quot;https://twitter.com/hashtag/BeamSummit?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#BeamSummit&lt;/a&gt;
 &lt;a 
href=&quot;https://t.co/Bj84GJimdo&quot;&gt;pic.twitter.com/Bj84GJimdo&lt;/a&gt;&lt;/p&gt;&;
 [...]
+&lt;script async=&quot;&quot; 
src=&quot;https://platform.twitter.com/widgets.js&quot; 
charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+&lt;h2 id=&quot;presentations&quot;&gt;Presentations&lt;/h2&gt;
+&lt;p&gt;In the aftermath of the Summit, you can check the presentations of 
all the sessions.&lt;/p&gt;
+
+&lt;h3 id=&quot;day-1-use-cases&quot;&gt;Day 1: Use cases&lt;/h3&gt;
+&lt;ul&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1hyHw7RVpFrFpli3vLt6JGBHrEm4BcgF-5nRdH1ZE8qo&quot;&gt;Day
 1 - Session 1 - Large scale stream analytics with Apache Beam at 
Sky&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1MxYrFDVoVFsrzbTtmr18zcbPFUU4nSdi&quot;&gt;Day
 1 - Session 2 - Running Quantitative Analytics with Apache 
Beam&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=0B4bFLXEWuluSdVBJSnZrbTZjSGFHbnd4cExYOGZQU2hmY3lF&quot;&gt;Day
 1 - Session 3 - Talend Data Streams: Building Big Data pipelines with Apache 
Beam&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1-GIUVn9QBtg6t-O8uINDkMO4PyZSU_HAEjMWuUHiYY4&quot;&gt;Day
 1 - Session 4 - Lesson Learned from Migrating to Apache Beam for Geo-Data 
Visualisation&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3 id=&quot;day-2-beginners-track&quot;&gt;Day 2: Beginners 
track&lt;/h3&gt;
+&lt;ul&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI&quot;&gt;Day
 2 - Beginner - Session 1 - Development Environment with Apache 
Beam&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI&quot;&gt;Day
 2 - Beginner - Session 2 - Towards Portability and Beyond&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI&quot;&gt;Day
 2 - Beginner - Session 3 - Python Streaming Pipelines with Beam on 
Flink&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI&quot;&gt;Day
 2 - Beginner - Session 4 - How runners execute a Beam 
pipeline&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI&quot;&gt;Day
 2 - Beginner - Session 5 - IO Integration Testing framework in Apache 
Beam&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3 id=&quot;day-2-advanced-track&quot;&gt;Day 2: Advanced track&lt;/h3&gt;
+&lt;ul&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1Kr1skutObtDil2CExSQUb5rCVwZQm1m2lpmuAXFCE5I&quot;&gt;Day
 2 - Advanced - Session 1 -  Pre-processing for TensorFlow pipelines with 
Apache Beam &amp;amp;  tf.Transform&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=11x7gtuAxg76nOQKaB0YOwcvzS4TUeWONTU1ZQK0LsX8&quot;&gt;Day
 2 - Advanced - Session 2 - Streaming data into BigQuery: schema generation 
with Protobuf&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1cgQGBIXaACSwbYu_w3AkvvTdsCfeXAS1tBvQ77eVn74&quot;&gt;Day
 2 - Advanced - Session 3 - Implementing a SplittableParDo&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://docs.google.com/presentation/d/1F02Lwnqm9H3cGqDQhIZ3gbftyLQSnVMRxX69H_d04OE/edit?usp=sharing&quot;&gt;Day
 2 - Advanced - Session 4 - Big Data on Google Cloud with Scala and 
Scio&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1D1ajcKoOR5OzehPwONdHLSzpO4PZOsLk&quot;&gt;Day
 2 - Advanced - Session 5 - Landuse Classification of Satellite 
Imagery&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1aFH6lhnVIq4Alu-_HItQ0QOddEPJQRqI5jV_t0o3CYI&quot;&gt;Day
 2 - Advanced - Session 6 - Java 8 DSL for Beam SDK&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a 
href=&quot;https://drive.google.com/open?id=1AkU-QXSflau-RSeolB4TSLy0_mg0xwb398Czw7aqVGw&quot;&gt;Day
 2  - Advanced - Session 7 - So, You Want to Write a Beam 
SDK?&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2 id=&quot;recordings&quot;&gt;Recordings&lt;/h2&gt;
+&lt;p&gt;In case you prefer rewatching the recorded talks together with those 
slides, we are also happy to share the recordings of the majority of the 
sessions:&lt;/p&gt;
+
+&lt;iframe width=&quot;560&quot; height=&quot;315&quot; 
src=&quot;https://www.youtube.com/embed/videoseries?list=PL4dEBWmGSIU_9JTGnkGVg6-BwaV0FMxyJ&quot;
 frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; 
encrypted-media; gyroscope; picture-in-picture&quot; 
allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
+
+&lt;h3 id=&quot;day-1-use-cases-1&quot;&gt;Day 1: Use cases&lt;/h3&gt;
+&lt;ul&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/En0FrjvNr3M&quot;&gt;Day 1 - 
Session 1 - Large scale stream analytics with Apache Beam at 
Sky&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/6yDEOUophuw&quot;&gt;Day 1 - 
Session 2 - Running Quantitative Analytics with Apache Beam&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/1AlEGUtiQek&quot;&gt;Day 1 - 
Session 3 - Talend Data Streams: Building Big Data pipelines with Apache 
Beam&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/GBKqw03doHE&quot;&gt;Day 1 - 
Session 4 - Lesson Learned from Migrating to Apache Beam for Geo-Data 
Visualisation&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h3 id=&quot;day-2-advanced-track-1&quot;&gt;Day 2: Advanced 
track&lt;/h3&gt;
+&lt;ul&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/L-k6-3ApXR4&quot;&gt;Day 2 - 
Advanced - Session 1 -  Pre-processing for TensorFlow pipelines with Apache 
Beam &amp;amp;  tf.Transform&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/ctN5U_Ke8uk&quot;&gt;Day 2 - 
Advanced - Session 2 - Streaming data into BigQuery: schema generation with 
Protobuf&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/jU6EmPyKefg&quot;&gt;Day 2 - 
Advanced - Session 3 - Implementing a SplittableParDo&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/F0n9sqj1_NQ&quot;&gt;Day 2 - 
Advanced - Session 4 - Big Data on Google Cloud with Scala and 
Scio&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/s-IR2eFe4B4&quot;&gt;Day 2 - 
Advanced - Session 5 - Landuse Classification of Satellite 
Imagery&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/ott1e_CnZ04&quot;&gt;Day 2 - 
Advanced - Session 6 - Java 8 DSL for Beam SDK&lt;/a&gt;&lt;/li&gt;
+  &lt;li&gt;&lt;a href=&quot;https://youtu.be/VsGQ2LFeTHY&quot;&gt;Day 2  - 
Advanced - Session 7 - So, You Want to Write a Beam SDK?&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h2&gt;
+
+&lt;p&gt;We are also gathering feedback and thoughts on the Summit - please 
add your thoughts and discussions to the &lt;a 
href=&quot;https://lists.apache.org/thread.html/aa1306da25029dff12a49ba3ce63f2caf6a5f8ba73eda879c8403f3f@%3Cdev.beam.apache.org%3E&quot;&gt;topic
 on the mailing list&lt;/a&gt;.&lt;/p&gt;
+
+&lt;p&gt;Overall, we hope our attendees enjoyed this first edition of our 
summit and want to thank &lt;strong&gt;our sponsors Google, Datatonic, 
Vente-Exclusive&lt;/strong&gt; to make this possible.&lt;/p&gt;
+
+&lt;blockquote class=&quot;twitter-tweet&quot; 
data-lang=&quot;nl&quot;&gt;&lt;p lang=&quot;en&quot; 
dir=&quot;ltr&quot;&gt;Wrapping up the first day of the &lt;a 
href=&quot;https://twitter.com/hashtag/BeamSummit?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#BeamSummit&lt;/a&gt;.
 Excellent view from the &lt;a 
href=&quot;https://twitter.com/hashtag/level39?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#level39&lt;/a&gt;
 venue. Very happy with the line up. &lt;a href=&quot;https://t.co/7F [...]
+&lt;script async=&quot;&quot; 
src=&quot;https://platform.twitter.com/widgets.js&quot; 
charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
+
+</description>
+        <pubDate>Wed, 31 Oct 2018 01:00:01 -0700</pubDate>
+        
<link>https://beam.apache.org/blog/2018/10/31/beam-summit-aftermath.html</link>
+        <guid 
isPermaLink="true">https://beam.apache.org/blog/2018/10/31/beam-summit-aftermath.html</guid>
+        
+        
+        <category>blog</category>
+        
+      </item>
+    
+      <item>
         <title>Apache Beam 2.8.0</title>
         <description>&lt;!--
 Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
@@ -1516,576 +1636,5 @@ your preferred Beam backend(s).&lt;/p&gt;
         
       </item>
     
-      <item>
-        <title>Powerful and modular IO connectors with Splittable DoFn in 
Apache Beam</title>
-        <description>&lt;!--
-Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-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 &quot;AS IS&quot; 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.
---&gt;
-
-&lt;p&gt;One of the most important parts of the Apache Beam ecosystem is its 
quickly
-growing set of connectors that allow Beam pipelines to read and write data to
-various data storage systems (“IOs”). Currently, Beam ships &lt;a 
href=&quot;/documentation/io/built-in/&quot;&gt;over 20 IO
-connectors&lt;/a&gt; with many more in
-active development. As user demands for IO connectors grew, our work on
-improving the related Beam APIs (in particular, the Source API) produced an
-unexpected result: a generalization of Beam’s most basic primitive, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;.&lt;/p&gt;
-
-&lt;!--more--&gt;
-
-&lt;h2 id=&quot;connectors-as-mini-pipelines&quot;&gt;Connectors as 
mini-pipelines&lt;/h2&gt;
-
-&lt;p&gt;One of the main reasons for this vibrant IO connector ecosystem is 
that
-developing a basic IO is relatively straightforward: many connector
-implementations are simply mini-pipelines (composite &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PTransform&lt;/code&gt;s) made of the
-basic Beam &lt;code class=&quot;highlighter-rouge&quot;&gt;ParDo&lt;/code&gt; 
and &lt;code class=&quot;highlighter-rouge&quot;&gt;GroupByKey&lt;/code&gt; 
primitives. For example,
-&lt;code 
class=&quot;highlighter-rouge&quot;&gt;ElasticsearchIO.write()&lt;/code&gt;
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/f7e8f886c91ea9d0b51e00331eeb4484e2f6e000/sdks/java/io/elasticsearch/src/main/java/org/apache/beam/sdk/io/elasticsearch/ElasticsearchIO.java#L783&quot;&gt;expands&lt;/a&gt;
-into a single &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ParDo&lt;/code&gt; with some batching 
for performance; &lt;code 
class=&quot;highlighter-rouge&quot;&gt;JdcbIO.read()&lt;/code&gt;
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/f7e8f886c91ea9d0b51e00331eeb4484e2f6e000/sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/JdbcIO.java#L329&quot;&gt;expands&lt;/a&gt;
-into &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Create.of(query)&lt;/code&gt;, a 
reshuffle to &lt;a 
href=&quot;https://cloud.google.com/dataflow/service/dataflow-service-desc#preventing-fusion&quot;&gt;prevent
-fusion&lt;/a&gt;,
-and &lt;code class=&quot;highlighter-rouge&quot;&gt;ParDo(execute 
sub-query)&lt;/code&gt;.  Some IOs
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/8503adbbc3a590cd0dc2939f6a45d335682a9442/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.java#L1139&quot;&gt;construct&lt;/a&gt;
-considerably more complicated pipelines.&lt;/p&gt;
-
-&lt;p&gt;&lt;img class=&quot;center-block&quot; 
src=&quot;/images/blog/splittable-do-fn/jdbcio-expansion.png&quot; 
alt=&quot;Expansion of the JdbcIO.read() composite transform&quot; 
width=&quot;600&quot; /&gt;&lt;/p&gt;
-
-&lt;p&gt;This “mini-pipeline” approach is flexible, modular, and generalizes 
to data
-sources that read from a dynamically computed &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PCollection&lt;/code&gt; of locations, 
such
-as
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/f7e8f886c91ea9d0b51e00331eeb4484e2f6e000/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/spanner/SpannerIO.java#L222&quot;&gt;&lt;code
 
class=&quot;highlighter-rouge&quot;&gt;SpannerIO.readAll()&lt;/code&gt;&lt;/a&gt;
-which reads the results of a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PCollection&lt;/code&gt; of queries from 
Cloud Spanner,
-compared to
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/f7e8f886c91ea9d0b51e00331eeb4484e2f6e000/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/spanner/SpannerIO.java#L318&quot;&gt;&lt;code
 class=&quot;highlighter-rouge&quot;&gt;SpannerIO.read()&lt;/code&gt;&lt;/a&gt;
-which executes a single query. We believe such dynamic data sources are a very
-useful capability, often overlooked by other data processing 
frameworks.&lt;/p&gt;
-
-&lt;h2 id=&quot;when-pardo-and-groupbykey-are-not-enough&quot;&gt;When ParDo 
and GroupByKey are not enough&lt;/h2&gt;
-
-&lt;p&gt;Despite the flexibility of &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ParDo&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;GroupByKey&lt;/code&gt; and their 
derivatives, in some
-cases building an efficient IO connector requires extra capabilities.&lt;/p&gt;
-
-&lt;p&gt;For example, imagine reading files using the sequence &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ParDo(filepattern →
-expand into files)&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ParDo(filename → read 
records)&lt;/code&gt;, or reading a Kafka topic
-using &lt;code class=&quot;highlighter-rouge&quot;&gt;ParDo(topic → list 
partitions)&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ParDo(topic, partition → read
-records)&lt;/code&gt;. This approach has two big issues:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;In the file example, some files might be much larger than others, 
so the
-second &lt;code class=&quot;highlighter-rouge&quot;&gt;ParDo&lt;/code&gt; may 
have very long individual &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; calls. As a
-result, the pipeline can suffer from poor performance due to 
stragglers.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;In the Kafka example, implementing the second &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ParDo&lt;/code&gt; is &lt;em&gt;simply 
impossible&lt;/em&gt;
-with a regular &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;, because it would need 
to output an infinite number of
-records per each input element &lt;code 
class=&quot;highlighter-rouge&quot;&gt;topic, partition&lt;/code&gt; 
&lt;em&gt;(&lt;a 
href=&quot;/blog/2017/02/13/stateful-processing.html&quot;&gt;stateful 
processing&lt;/a&gt; comes close, but it
-has other limitations that make it insufficient for this 
task&lt;/em&gt;).&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;h2 id=&quot;beam-source-api&quot;&gt;Beam Source API&lt;/h2&gt;
-
-&lt;p&gt;Apache Beam historically provides a Source API
-(&lt;a 
href=&quot;https://beam.apache.org/releases/javadoc/2.8.0/org/apache/beam/sdk/io/BoundedSource.html&quot;&gt;BoundedSource&lt;/a&gt;
-and
-&lt;a 
href=&quot;https://beam.apache.org/releases/javadoc/2.8.0/org/apache/beam/sdk/io/UnboundedSource.html&quot;&gt;UnboundedSource&lt;/a&gt;)
 which does
-not have these limitations and allows development of efficient data sources for
-batch and streaming systems. Pipelines use this API via the
-&lt;a 
href=&quot;https://beam.apache.org/releases/javadoc/2.8.0/org/apache/beam/sdk/io/Read.html&quot;&gt;&lt;code
 
class=&quot;highlighter-rouge&quot;&gt;Read.from(Source)&lt;/code&gt;&lt;/a&gt; 
built-in &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PTransform&lt;/code&gt;.&lt;/p&gt;
-
-&lt;p&gt;The Source API is largely similar to that of most other data 
processing
-frameworks, and allows the system to read data in parallel using multiple
-workers, as well as checkpoint and resume reading from an unbounded data 
source.
-Additionally, the Beam
-&lt;a 
href=&quot;https://beam.apache.org/releases/javadoc/2.8.0/org/apache/beam/sdk/io/BoundedSource.html&quot;&gt;&lt;code
 class=&quot;highlighter-rouge&quot;&gt;BoundedSource&lt;/code&gt;&lt;/a&gt;
-API provides advanced features such as progress reporting and &lt;a 
href=&quot;/blog/2016/05/18/splitAtFraction-method.html&quot;&gt;dynamic
-rebalancing&lt;/a&gt;
-(which together enable autoscaling), and
-&lt;a 
href=&quot;https://beam.apache.org/releases/javadoc/2.8.0/org/apache/beam/sdk/io/UnboundedSource.html&quot;&gt;&lt;code
 class=&quot;highlighter-rouge&quot;&gt;UnboundedSource&lt;/code&gt;&lt;/a&gt; 
supports
-reporting the source’s watermark and backlog &lt;em&gt;(until SDF, we believed 
that
-“batch” and “streaming” data sources are fundamentally different and thus
-require fundamentally different APIs)&lt;/em&gt;.&lt;/p&gt;
-
-&lt;p&gt;Unfortunately, these features come at a price. Coding against the 
Source API
-involves a lot of boilerplate and is error-prone, and it does not compose well
-with the rest of the Beam model because a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; can appear only at 
the root
-of a pipeline. For example:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;Using the Source API, it is not possible to read a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PCollection&lt;/code&gt; of
-filepatterns.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;A &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; can not read a side 
input, or wait on another pipeline step to
-produce the data.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;A &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; can not emit an 
additional output (for example, records that failed to
-parse) and so on.&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;The Source API is not composable even with itself. For example, 
suppose Alice
-implements an unbounded &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; that watches a 
directory for new matching
-files, and Bob implements an unbounded &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; that tails a file. 
The Source
-API does not let them simply chain the sources together and obtain a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt;
-that returns new records in new log files in a directory (a very common user
-request). Instead, such a source would have to be developed mostly from
-scratch, and our experience shows that a full-featured monolithic
-implementation of such a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; is incredibly 
difficult and error-prone.&lt;/p&gt;
-
-&lt;p&gt;Another class of issues with the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; API comes from its 
strict
-bounded/unbounded dichotomy:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;It is difficult or impossible to reuse code between seemingly 
very similar
-bounded and unbounded sources, for example, the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;BoundedSource&lt;/code&gt; that generates
-a sequence &lt;code class=&quot;highlighter-rouge&quot;&gt;[a, b)&lt;/code&gt; 
and the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;UnboundedSource&lt;/code&gt; that 
generates a sequence &lt;code class=&quot;highlighter-rouge&quot;&gt;[a,
-inf)&lt;/code&gt; &lt;a 
href=&quot;https://github.com/apache/beam/blob/master/sdks/java/core/src/main/java/org/apache/beam/sdk/io/CountingSource.java&quot;&gt;don’t
 share any
-code&lt;/a&gt;
-in the Beam Java SDK.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;It is not clear how to classify the ingestion of a very large and
-continuously growing dataset. Ingesting its “already available” part seems to
-require a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;BoundedSource&lt;/code&gt;: the runner 
could benefit from knowing its size, and
-could perform dynamic rebalancing. However, ingesting the continuously arriving
-new data seems to require an &lt;code 
class=&quot;highlighter-rouge&quot;&gt;UnboundedSource&lt;/code&gt; for 
providing watermarks. From
-this angle, the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; API has &lt;a 
href=&quot;https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101&quot;&gt;the
 same issues as Lambda
-Architecture&lt;/a&gt;.&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;About two years ago we began thinking about how to address the 
limitations of
-the Source API, and ended up, surprisingly, addressing the limitations of
-&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; 
instead.&lt;/p&gt;
-
-&lt;h2 id=&quot;enter-splittable-dofn&quot;&gt;Enter Splittable DoFn&lt;/h2&gt;
-
-&lt;p&gt;&lt;a 
href=&quot;http://s.apache.org/splittable-do-fn&quot;&gt;Splittable 
DoFn&lt;/a&gt; (SDF) is a
-generalization of &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; that gives it the core 
capabilities of &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; while
-retaining &lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;’s 
syntax, flexibility, modularity, and ease of coding.  As a
-result, it becomes possible to develop more powerful IO connectors than before,
-with shorter, simpler, more reusable code.&lt;/p&gt;
-
-&lt;p&gt;Note that, unlike &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt;, SDF &lt;em&gt;does 
not&lt;/em&gt; have distinct bounded/unbounded APIs,
-just as regular &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;s don’t: there is only 
one API, which covers both of these
-use cases and anything in between. Thus, SDF closes the final gap in the 
unified
-batch/streaming programming model of Apache Beam.&lt;/p&gt;
-
-&lt;p&gt;When reading the explanation of SDF below, keep in mind the running 
example of a
-&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; that takes a 
filename as input and outputs the records in that file.
-People familiar with the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; API may find it 
useful to think of SDF as a
-way to read a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PCollection&lt;/code&gt; of sources, 
treating the source itself as just
-another piece of data in the pipeline &lt;em&gt;(this, in fact, was one of the 
early
-design iterations among the work that led to creation of 
SDF)&lt;/em&gt;.&lt;/p&gt;
-
-&lt;p&gt;The two aspects where &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; has an advantage 
over a regular &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; are:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;&lt;strong&gt;Splittability:&lt;/strong&gt; applying a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; to a single element is 
&lt;em&gt;monolithic&lt;/em&gt;, but
-reading from a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; is 
&lt;em&gt;non-monolithic&lt;/em&gt;. The whole &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; doesn’t have to
-be read at once; rather, it is read in parts, called 
&lt;em&gt;bundles&lt;/em&gt;. For example, a
-large file is usually read in several bundles, each reading some sub-range of
-offsets within the file. Likewise, a Kafka topic (which, of course, can never
-be read “fully”) is read over an infinite number of bundles, each reading some
-finite number of elements.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;&lt;strong&gt;Interaction with the runner:&lt;/strong&gt; runners 
apply a &lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; to a 
single element as
-a “black box”, but interact quite richly with &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt;. &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; provides the
-runner with information such as its estimated size (or its generalization,
-“backlog”), progress through reading the bundle, watermarks etc. The runner
-uses this information to tune the execution and control the breakdown of the
-&lt;code class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; into 
bundles. For example, a slowly progressing large bundle of a file
-may be &lt;a 
href=&quot;https://cloud.google.com/blog/big-data/2016/05/no-shard-left-behind-dynamic-work-rebalancing-in-google-cloud-dataflow&quot;&gt;dynamically
-split&lt;/a&gt;
-by a batch-focused runner before it becomes a straggler, and a latency-focused
-streaming runner may control how many elements it reads from a source in each
-bundle to optimize for latency vs. per-bundle overhead.&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;h3 
id=&quot;non-monolithic-element-processing-with-restrictions&quot;&gt;Non-monolithic
 element processing with restrictions&lt;/h3&gt;
-
-&lt;p&gt;Splittable &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; supports &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt;-like features by 
allowing the processing of
-a single element to be non-monolithic.&lt;/p&gt;
-
-&lt;p&gt;The processing of one element by an SDF is decomposed into a 
(potentially
-infinite) number of &lt;em&gt;restrictions&lt;/em&gt;, each describing some 
part of the work to be
-done for the whole element. The input to an SDF’s &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; call is a
-pair of an element and a restriction (compared to a regular &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;, which takes
-just the element).&lt;/p&gt;
-
-&lt;p&gt;Processing of every element starts by creating an &lt;em&gt;initial 
restriction&lt;/em&gt; that
-describes the entire work, and the initial restriction is then split further
-into sub-restrictions which must logically add up to the original. For example,
-for a splittable &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; called &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ReadFn&lt;/code&gt; that takes a 
filename and outputs
-records in the file, the restriction may be a pair of starting and ending byte
-offset, and &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ReadFn&lt;/code&gt; may interpret it as 
&lt;em&gt;read records whose starting offsets
-are in the given range&lt;/em&gt;.&lt;/p&gt;
-
-&lt;p&gt;&lt;img class=&quot;center-block&quot; 
src=&quot;/images/blog/splittable-do-fn/restrictions.png&quot; 
alt=&quot;Specifying parts of work for an element using restrictions&quot; 
width=&quot;600&quot; /&gt;&lt;/p&gt;
-
-&lt;p&gt;The idea of restrictions provides non-monolithic execution - the first
-ingredient for parity with &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt;. The other 
ingredient is &lt;em&gt;interaction with
-the runner&lt;/em&gt;: the runner has access to the restriction of each active
-&lt;code class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; 
call of an SDF, can inquire about the progress of the call,
-and most importantly, can &lt;em&gt;split&lt;/em&gt; the restriction while it 
is being processed
-(hence the name &lt;em&gt;Splittable DoFn&lt;/em&gt;).&lt;/p&gt;
-
-&lt;p&gt;Splitting produces a &lt;em&gt;primary&lt;/em&gt; and 
&lt;em&gt;residual&lt;/em&gt; restriction that add up to the
-original restriction being split: the current &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; call keeps
-processing the primary, and the residual will be processed by another
-&lt;code class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; 
call. For example, a runner may schedule the residual to be
-processed in parallel on another worker.&lt;/p&gt;
-
-&lt;p&gt;Splitting of a running &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; call has 
two critically important uses:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;strong&gt;Supporting infinite work per element.&lt;/strong&gt; 
A restriction is, in general, not
-required to describe a finite amount of work. For example, reading from a Kafka
-topic starting from offset &lt;em&gt;100&lt;/em&gt; can be represented by the
-restriction &lt;em&gt;[100, inf)&lt;/em&gt;. A &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; call 
processing this
-entire restriction would, of course, never complete. However, while such a call
-runs, a runner can split the restriction into a &lt;em&gt;finite&lt;/em&gt; 
primary &lt;em&gt;[100, 150)&lt;/em&gt;
-(letting the current call complete this part) and an 
&lt;em&gt;infinite&lt;/em&gt; residual &lt;em&gt;[150,
-inf)&lt;/em&gt; to be processed later, effectively checkpointing and resuming 
the call;
-this can be repeated forever.&lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;&lt;img class=&quot;center-block&quot; 
src=&quot;/images/blog/splittable-do-fn/kafka-splitting.png&quot; 
alt=&quot;Splitting an infinite restriction into a finite primary and infinite 
residual&quot; width=&quot;400&quot; /&gt;&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;&lt;strong&gt;Dynamic rebalancing.&lt;/strong&gt; When a 
(typically batch-focused) runner detects that
-a &lt;code class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; 
call is going to take too long and become a straggler, it
-can split the restriction in some proportion so that the primary is short 
enough
-to not be a straggler, and can schedule the residual in parallel on another
-worker. For details, see &lt;a 
href=&quot;https://cloud.google.com/blog/big-data/2016/05/no-shard-left-behind-dynamic-work-rebalancing-in-google-cloud-dataflow&quot;&gt;No
 Shard Left
-Behind&lt;/a&gt;.&lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;Logically, the execution of an SDF on an element works according to 
the
-following diagram, where “magic” stands for the runner-specific ability to 
split
-the restrictions and schedule processing of residuals.&lt;/p&gt;
-
-&lt;p&gt;&lt;img class=&quot;center-block&quot; 
src=&quot;/images/blog/splittable-do-fn/transform-expansion.png&quot; 
alt=&quot;Execution of an SDF - pairing with a restriction, splitting     
restrictions, processing element/restriction pairs&quot; width=&quot;600&quot; 
/&gt;&lt;/p&gt;
-
-&lt;p&gt;This diagram emphasizes that splittability is an implementation 
detail of the
-particular &lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;: 
a splittable &lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; 
still looks like a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&amp;lt;A, B&amp;gt;&lt;/code&gt; to 
its
-user, and can be applied via a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ParDo&lt;/code&gt; to a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PCollection&amp;lt;A&amp;gt;&lt;/code&gt;
 producing a
-&lt;code 
class=&quot;highlighter-rouge&quot;&gt;PCollection&amp;lt;B&amp;gt;&lt;/code&gt;.&lt;/p&gt;
-
-&lt;h3 id=&quot;which-dofns-need-to-be-splittable&quot;&gt;Which DoFns need to 
be splittable&lt;/h3&gt;
-
-&lt;p&gt;Note that decomposition of an element into element/restriction pairs 
is not
-automatic or “magical”: SDF is a new API for &lt;em&gt;authoring&lt;/em&gt; a 
&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;, rather than a
-new way to &lt;em&gt;execute&lt;/em&gt; an existing &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;. When making a 
&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; splittable, 
the
-author needs to:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;Consider the structure of the work it does for every 
element.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;Come up with a scheme for describing parts of this work using 
restrictions.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;Write code for creating the initial restriction, splitting it, 
and executing
-an element/restriction pair.&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;An overwhelming majority of &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;s found in user 
pipelines do not need to be
-made splittable: SDF is an advanced, powerful API, primarily targeting authors
-of new IO connectors &lt;em&gt;(though it has interesting non-IO applications 
as well:
-see &lt;a 
href=&quot;http://s.apache.org/splittable-do-fn#heading=h.5cep9s8k4fxv&quot;&gt;Non-IO
 examples&lt;/a&gt;)&lt;/em&gt;.&lt;/p&gt;
-
-&lt;h3 
id=&quot;execution-of-a-restriction-and-data-consistency&quot;&gt;Execution of 
a restriction and data consistency&lt;/h3&gt;
-
-&lt;p&gt;One of the most important parts of the Splittable &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; design is related to
-how it achieves data consistency while splitting. For example, while the runner
-is preparing to split the restriction of an active &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; call, how
-can it be sure that the call has not concurrently progressed past the point of
-splitting?&lt;/p&gt;
-
-&lt;p&gt;This is achieved by requiring the processing of a restriction to 
follow a
-certain pattern. We think of a restriction as a sequence of 
&lt;em&gt;blocks&lt;/em&gt; -
-elementary indivisible units of work, identified by a 
&lt;em&gt;position&lt;/em&gt;. A
-&lt;code class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; 
call processes the blocks one by one, first &lt;em&gt;claiming&lt;/em&gt; the
-block’s position to atomically check if it’s still within the range of the
-restriction, until the whole restriction is processed.&lt;/p&gt;
-
-&lt;p&gt;The diagram below illustrates this for &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ReadFn&lt;/code&gt; (a splittable 
&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; that reads
-Avro files) processing the element &lt;code 
class=&quot;highlighter-rouge&quot;&gt;foo.avro&lt;/code&gt; with restriction 
&lt;code class=&quot;highlighter-rouge&quot;&gt;[30, 70)&lt;/code&gt;. This
-&lt;code class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; 
call scans the Avro file for &lt;a 
href=&quot;https://avro.apache.org/docs/current/spec.html#Object+Container+Files&quot;&gt;data
-blocks&lt;/a&gt;
-starting from offset &lt;code 
class=&quot;highlighter-rouge&quot;&gt;30&lt;/code&gt; and claims the position 
of each block in this range.
-If a block is claimed successfully, then the call outputs all records in this
-data block, otherwise, it terminates.&lt;/p&gt;
-
-&lt;p&gt;&lt;img class=&quot;center-block&quot; 
src=&quot;/images/blog/splittable-do-fn/blocks.png&quot; alt=&quot;Processing a 
restriction by claiming blocks inside it&quot; width=&quot;400&quot; 
/&gt;&lt;/p&gt;
-
-&lt;p&gt;For more details, see &lt;a 
href=&quot;http://s.apache.org/splittable-do-fn#heading=h.vjs7pzbb7kw&quot;&gt;Restrictions,
 blocks and
-positions&lt;/a&gt; in the
-design proposal document.&lt;/p&gt;
-
-&lt;h3 id=&quot;code-example&quot;&gt;Code example&lt;/h3&gt;
-
-&lt;p&gt;Let us look at some examples of SDF code. The examples use the Beam 
Java SDK,
-which &lt;a 
href=&quot;https://github.com/apache/beam/blob/f7e8f886c91ea9d0b51e00331eeb4484e2f6e000/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/DoFn.java#L527&quot;&gt;represents
 splittable
-&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;s&lt;/a&gt;
-as part of the flexible &lt;a 
href=&quot;http://s.apache.org/a-new-dofn&quot;&gt;annotation-based
-&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;&lt;/a&gt; 
machinery, and the &lt;a 
href=&quot;https://s.apache.org/splittable-do-fn-python&quot;&gt;proposed SDF 
syntax
-for Python&lt;/a&gt;.&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;A splittable &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; is a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; - no new base class 
needed. Any SDF derives
-from the &lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; 
class and has a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; 
method.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;The &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@ProcessElement&lt;/code&gt; method 
takes an additional
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/f7e8f886c91ea9d0b51e00331eeb4484e2f6e000/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/splittabledofn/RestrictionTracker.java&quot;&gt;&lt;code
 
class=&quot;highlighter-rouge&quot;&gt;RestrictionTracker&lt;/code&gt;&lt;/a&gt;
-parameter that gives access to the current restriction in addition to the
-current element.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;An SDF needs to define a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;@GetInitialRestriction&lt;/code&gt; 
method that can create a
-restriction describing the complete work for a given element.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;There are several less important optional methods, such as
-&lt;code class=&quot;highlighter-rouge&quot;&gt;@SplitRestriction&lt;/code&gt; 
for pre-splitting the initial restriction into several
-smaller restrictions, and a few others.&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;The “Hello World” of SDF is a counter, which takes pairs 
&lt;em&gt;(x, N)&lt;/em&gt; as input and
-produces pairs &lt;em&gt;(x, 0), (x, 1), …, (x, N-1)&lt;/em&gt; as 
output.&lt;/p&gt;
-
-&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;CountFn&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;DoFn&lt;/span&gt;&lt;span class=&quo [...]
-  &lt;span class=&quot;nd&quot;&gt;@ProcessElement&lt;/span&gt;
-  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span 
class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;ProcessContext&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;OffsetRangeTracker&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span class=&qu [...]
-    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;currentRestriction&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getFr 
[...]
-      &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;output&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;KV&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;of&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&q [...]
-    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-
-  &lt;span class=&quot;nd&quot;&gt;@GetInitialRestriction&lt;/span&gt;
-  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;OffsetRange&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;getInitialRange&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;KV&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;Long&lt;/span&gt;&lt;span class=&quot;o&quot;&gt [...]
-    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;OffsetRange&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;mi&quot;&gt;0L&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;getValue&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;());& [...]
-  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-
-&lt;span class=&quot;n&quot;&gt;PCollection&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;KV&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;Long&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;o& [...]
-&lt;span class=&quot;n&quot;&gt;PCollection&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;KV&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;Long&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o [...]
-    &lt;span class=&quot;n&quot;&gt;ParDo&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;of&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;CountFn&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;gt;());&lt;/span&gt;
-&lt;/code&gt;&lt;/pre&gt;
-&lt;/div&gt;
-
-&lt;div class=&quot;language-py highlighter-rouge&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;CountFn&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;DoFn&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;):&lt;/span&gt;
-  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;DoFn&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;RestrictionTracker [...]
-    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span 
class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span 
class=&quot;nb&quot;&gt;xrange&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;current_restriction&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;()):& [...]
-      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span 
class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;try_claim&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;):&lt;/span&gt;
-        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
-      &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span 
class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt;
-        
-  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;get_initial_restriction&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;):&lt;/span&gt;
-    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;element&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span 
class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;])&lt;/span&gt;
-&lt;/code&gt;&lt;/pre&gt;
-&lt;/div&gt;
-
-&lt;p&gt;This short &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; subsumes the 
functionality of
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/master/sdks/java/core/src/main/java/org/apache/beam/sdk/io/CountingSource.java&quot;&gt;CountingSource&lt;/a&gt;,
-but is more flexible: &lt;code 
class=&quot;highlighter-rouge&quot;&gt;CountingSource&lt;/code&gt; generates 
only one sequence specified at
-pipeline construction time, while this &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; can generate a dynamic 
family of
-sequences, one per element in the input collection (it does not matter whether
-the input collection is bounded or unbounded).&lt;/p&gt;
-
-&lt;p&gt;However, the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt;-specific 
capabilities of &lt;code 
class=&quot;highlighter-rouge&quot;&gt;CountingSource&lt;/code&gt; are still
-available in &lt;code 
class=&quot;highlighter-rouge&quot;&gt;CountFn&lt;/code&gt;. For example, if a 
sequence has a lot of elements, a
-batch-focused runner can still apply dynamic rebalancing to it and generate
-different subranges of the sequence in parallel by splitting the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;OffsetRange&lt;/code&gt;.
-Likewise, a streaming-focused runner can use the same splitting logic to
-checkpoint and resume the generation of the sequence even if it is, for
-practical purposes, infinite (for example, when applied to a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;KV(...,
-Long.MAX_VALUE)&lt;/code&gt;).&lt;/p&gt;
-
-&lt;p&gt;A slightly more complex example is the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ReadFn&lt;/code&gt; considered above, 
which reads
-data from Avro files and illustrates the idea of &lt;em&gt;blocks&lt;/em&gt;: 
we provide pseudocode
-to illustrate the approach.&lt;/p&gt;
-
-&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;ReadFn&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;DoFn&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot; [...]
-  &lt;span class=&quot;nd&quot;&gt;@ProcessElement&lt;/span&gt;
-  &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;ProcessContext&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;OffsetRangeTracker&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&q [...]
-    &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;AvroReader&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;reader&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;Avro&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;open&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;filename&lt;/sp [...]
-      &lt;span class=&quot;c1&quot;&gt;// Seek to the first block starting at 
or after the start offset.&lt;/span&gt;
-      &lt;span class=&quot;n&quot;&gt;reader&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;seek&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;currentRestriction&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;getFrom&lt;/span&gt;&lt;span class=&quot;o&quot;&g [...]
-      &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;reader&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;readNextBlock&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;())&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
-        &lt;span class=&quot;c1&quot;&gt;// Claim the position of the current 
Avro block&lt;/span&gt;
-        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(!&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;tryClaim&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;reader&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;currentBlockOffset&lt;/span&gt;&lt;span 
class=&quot;o&quot;&g [...]
-          &lt;span class=&quot;c1&quot;&gt;// Out of range of the current 
restriction - we're done.&lt;/span&gt;
-          &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt;
-        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-        &lt;span class=&quot;c1&quot;&gt;// Emit all records in this 
block&lt;/span&gt;
-        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;AvroRecord&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;record&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;reader&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;currentBlock&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;o&quot;&g [...]
-          &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;output&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;record&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt;
-        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-
-  &lt;span class=&quot;nd&quot;&gt;@GetInitialRestriction&lt;/span&gt;
-  &lt;span class=&quot;n&quot;&gt;OffsetRange&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;getInitialRestriction&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
-    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;OffsetRange&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;File&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;filename&lt;/s [...]
-  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
-&lt;/code&gt;&lt;/pre&gt;
-&lt;/div&gt;
-
-&lt;div class=&quot;language-py highlighter-rouge&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;AvroReader&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;DoFn&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;):&lt;/span&gt;
-  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;DoFn&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;RestrictionTracke [...]
-    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;fileio&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;ChannelFactory&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/s 
[...]
-      &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;stop&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;current_restriction&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;()&lt;/span&gt;
-      &lt;span class=&quot;c&quot;&gt;# Seek to the first block starting at or 
after the start offset.&lt;/span&gt;
-      &lt;span class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;seek&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;)&lt;/span&gt;
-      &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;AvroUtils&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;get_next_block&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;)&lt;/span&gt;
-      &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;:&lt;/span&gt;
-        &lt;span class=&quot;c&quot;&gt;# Claim the position of the current 
Avro block&lt;/span&gt;
-        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span 
class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;tracker&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;try_claim&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;()):&lt;/span&gt;
-          &lt;span class=&quot;c&quot;&gt;# Out of range of the current 
restriction - we're done.&lt;/span&gt;
-          &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;
-        &lt;span class=&quot;c&quot;&gt;# Emit all records in this 
block&lt;/span&gt;
-        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;record&lt;/span&gt; &lt;span 
class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;records&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;():&lt;/span&gt;
-          &lt;span class=&quot;k&quot;&gt;yield&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;record&lt;/span&gt;
-        &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;AvroUtils&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;get_next_block&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;)&lt;/span&gt;
-        
-  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;get_initial_restriction&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;):&lt;/span&gt;
-    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span 
class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;fileio&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;ChannelFactory&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;size_in_bytes&lt;/span&gt;&lt;span 
class=&quot;p&quot;&gt;(&lt [...]
-&lt;/code&gt;&lt;/pre&gt;
-&lt;/div&gt;
-
-&lt;p&gt;This hypothetical &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; reads records from a 
single Avro file. Notably missing
-is the code for expanding a filepattern: it no longer needs to be part of this
-&lt;code class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;! Instead, 
the SDK includes a
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/master/sdks/java/core/src/main/java/org/apache/beam/sdk/io/FileIO.java&quot;&gt;FileIO.matchAll()&lt;/a&gt;
-transform for expanding a filepattern into a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;PCollection&lt;/code&gt; of filenames, 
and
-different file format IOs can reuse the same transform, reading the files with
-different &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt;s.&lt;/p&gt;
-
-&lt;p&gt;This example demonstrates the benefits of increased modularity 
allowed by SDF:
-&lt;code class=&quot;highlighter-rouge&quot;&gt;FileIO.matchAll()&lt;/code&gt; 
supports continuous ingestion of new files in streaming
-pipelines using &lt;code 
class=&quot;highlighter-rouge&quot;&gt;.continuously()&lt;/code&gt;, and this 
functionality becomes automatically
-available to various file format IOs. For example,
-&lt;code 
class=&quot;highlighter-rouge&quot;&gt;TextIO.read().watchForNewFiles()&lt;/code&gt;
 &lt;a 
href=&quot;https://github.com/apache/beam/blob/3bd68ecfd7d576d78e02deb0476e549f11e1b5ef/sdks/java/core/src/main/java/org/apache/beam/sdk/io/TextIO.java#L486&quot;&gt;uses
 &lt;code class=&quot;highlighter-rouge&quot;&gt;FileIO.matchAll()&lt;/code&gt; 
under the
-hood)&lt;/a&gt;.&lt;/p&gt;
-
-&lt;h2 id=&quot;current-status&quot;&gt;Current status&lt;/h2&gt;
-
-&lt;p&gt;Splittable &lt;code 
class=&quot;highlighter-rouge&quot;&gt;DoFn&lt;/code&gt; is a major new API, 
and its delivery and widespread adoption
-involves a lot of work in different parts of the Apache Beam ecosystem.  Some
-of that work is already complete and provides direct benefit to users via new
-IO connectors. However, a large amount of work is in progress or 
planned.&lt;/p&gt;
-
-&lt;p&gt;As of August 2017, SDF is available for use in the Beam Java Direct 
runner and
-Dataflow Streaming runner, and implementation is in progress in the Flink and
-Apex runners; see &lt;a 
href=&quot;/documentation/runners/capability-matrix/&quot;&gt;capability 
matrix&lt;/a&gt; for the current status. Support
-for SDF in the Python SDK is &lt;a 
href=&quot;https://s.apache.org/splittable-do-fn-python&quot;&gt;in active
-development&lt;/a&gt;.&lt;/p&gt;
-
-&lt;p&gt;Several SDF-based transforms and IO connectors are available for Beam 
users at
-HEAD and will be included in Beam 2.2.0. &lt;code 
class=&quot;highlighter-rouge&quot;&gt;TextIO&lt;/code&gt; and &lt;code 
class=&quot;highlighter-rouge&quot;&gt;AvroIO&lt;/code&gt; finally provide
-continuous ingestion of files (one of the most frequently requested features)
-via &lt;code 
class=&quot;highlighter-rouge&quot;&gt;.watchForNewFiles()&lt;/code&gt; which 
is backed by the utility transforms
-&lt;code 
class=&quot;highlighter-rouge&quot;&gt;FileIO.matchAll().continuously()&lt;/code&gt;
 and the more general
-&lt;a 
href=&quot;https://github.com/apache/beam/blob/f7e8f886c91ea9d0b51e00331eeb4484e2f6e000/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/Watch.java&quot;&gt;&lt;code
 class=&quot;highlighter-rouge&quot;&gt;Watch.growthOf()&lt;/code&gt;&lt;/a&gt;.
-These utility transforms are also independently useful for “power user” use
-cases.&lt;/p&gt;
-
-&lt;p&gt;To enable more flexible use cases for IOs currently based on the 
Source API, we
-will change them to use SDF. This transition is &lt;a 
href=&quot;http://s.apache.org/textio-sdf&quot;&gt;pioneered by
-TextIO&lt;/a&gt; and involves temporarily &lt;a 
href=&quot;http://s.apache.org/sdf-via-source&quot;&gt;executing SDF
-via the Source API&lt;/a&gt; to support runners
-lacking the ability to run SDF directly.&lt;/p&gt;
-
-&lt;p&gt;In addition to enabling new IOs, work on SDF has influenced our 
thinking about
-other parts of the Beam programming model:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;SDF unified the final remaining part of the Beam programming 
model that was
-not batch/streaming agnostic (the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;Source&lt;/code&gt; API). This led us to 
consider use
-cases that cannot be described as purely batch or streaming (for example,
-ingesting a large amount of historical data and carrying on with more data
-arriving in real time) and to develop a &lt;a 
href=&quot;http://s.apache.org/beam-fn-api-progress-reporting&quot;&gt;unified 
notion of “progress” and
-“backlog”&lt;/a&gt;.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;The &lt;a href=&quot;http://s.apache.org/beam-fn-api&quot;&gt;Fn 
API&lt;/a&gt; - the foundation of Beam’s
-future support for cross-language pipelines - uses SDF as &lt;em&gt;the 
only&lt;/em&gt; concept
-representing data ingestion.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;Implementation of SDF has lead to &lt;a 
href=&quot;https://lists.apache.org/thread.html/86831496a08fe148e3b982cdb904f828f262c0b571543a9fed7b915d@%3Cdev.beam.apache.org%3E&quot;&gt;formalizing
 pipeline termination
-semantics&lt;/a&gt;
-and making it consistent between runners.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;SDF set a new standard for how modular IO connectors can be, 
inspiring
-creation of similar APIs for some non-SDF-based connectors (for example,
-&lt;code 
class=&quot;highlighter-rouge&quot;&gt;SpannerIO.readAll()&lt;/code&gt; and the
-&lt;a 
href=&quot;https://issues.apache.org/jira/browse/BEAM-2706&quot;&gt;planned&lt;/a&gt;
 &lt;code 
class=&quot;highlighter-rouge&quot;&gt;JdbcIO.readAll()&lt;/code&gt;).&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;h2 id=&quot;call-to-action&quot;&gt;Call to action&lt;/h2&gt;
-
-&lt;p&gt;Apache Beam thrives on having a large community of contributors. Here 
are some
-ways you can get involved in the SDF effort and help make the Beam IO connector
-ecosystem more modular:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;Use the currently available SDF-based IO connectors, provide 
feedback, file
-bugs, and suggest or implement improvements.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;Propose or develop a new IO connector based on SDF.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;Implement or improve support for SDF in your favorite 
runner.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;Subscribe and contribute to the occasional SDF-related 
discussions on
-&lt;a 
href=&quot;mailto:[email protected]&quot;&gt;[email protected]&lt;/a&gt; 
(mailing list for Beam
-users) and &lt;a 
href=&quot;mailto:[email protected]&quot;&gt;[email protected]&lt;/a&gt; 
(mailing list for
-Beam developers)!&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-</description>
-        <pubDate>Wed, 16 Aug 2017 01:00:01 -0700</pubDate>
-        
<link>https://beam.apache.org/blog/2017/08/16/splittable-do-fn.html</link>
-        <guid 
isPermaLink="true">https://beam.apache.org/blog/2017/08/16/splittable-do-fn.html</guid>
-        
-        
-        <category>blog</category>
-        
-      </item>
-    
   </channel>
 </rss>
diff --git a/website/generated-content/index.html 
b/website/generated-content/index.html
index 9bc7c26..15ebd0e 100644
--- a/website/generated-content/index.html
+++ b/website/generated-content/index.html
@@ -171,6 +171,11 @@ limitations under the License.
           </div>
           <div class="hero__blog__cards">
             
+            <a class="hero__blog__cards__card" 
href="/blog/2018/10/31/beam-summit-aftermath.html">
+              <div class="hero__blog__cards__card__title">Inaugural edition of 
the Beam Summit Europe 2018 - aftermath</div>
+              <div class="hero__blog__cards__card__date">Oct 31, 2018</div>
+            </a>
+            
             <a class="hero__blog__cards__card" 
href="/blog/2018/10/29/beam-2.8.0.html">
               <div class="hero__blog__cards__card__title">Apache Beam 
2.8.0</div>
               <div class="hero__blog__cards__card__date">Oct 29, 2018</div>
@@ -181,11 +186,6 @@ limitations under the License.
               <div class="hero__blog__cards__card__date">Oct 3, 2018</div>
             </a>
             
-            <a class="hero__blog__cards__card" 
href="/blog/2018/08/21/beam-summit-europe.html">
-              <div class="hero__blog__cards__card__title">Beam Summit Europe 
2018</div>
-              <div class="hero__blog__cards__card__date">Aug 21, 2018</div>
-            </a>
-            
           </div>
         </div>
       </div>

Reply via email to