blob: 8e6ba5793979009054e6b7b3c6915fb101427086 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<title>Apache Flink: Apache Flink 1.11.0 Release Announcement</title>
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<!-- Bootstrap -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/flink.css">
<link rel="stylesheet" href="/css/syntax.css">
<!-- Blog RSS feed -->
<link href="/blog/feed.xml" rel="alternate" type="application/rss+xml" title="Apache Flink Blog: RSS feed" />
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<!-- We need to load Jquery in the header for custom google analytics event tracking-->
<script src="/js/jquery.min.js"></script>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- Main content. -->
<div class="container">
<div class="row">
<div id="sidebar" class="col-sm-3">
<!-- Top navbar. -->
<nav class="navbar navbar-default">
<!-- The logo. -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-logo">
<a href="/">
<img alt="Apache Flink" src="/img/flink-header-logo.svg" width="147px" height="73px">
</a>
</div>
</div><!-- /.navbar-header -->
<!-- The navigation links. -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav navbar-main">
<!-- First menu section explains visitors what Flink is -->
<!-- What is Stream Processing? -->
<!--
<li><a href="/streamprocessing1.html">What is Stream Processing?</a></li>
-->
<!-- What is Flink? -->
<li><a href="/flink-architecture.html">What is Apache Flink?</a></li>
<!-- What is Stateful Functions? -->
<li><a href="/stateful-functions.html">What is Stateful Functions?</a></li>
<!-- Use cases -->
<li><a href="/usecases.html">Use Cases</a></li>
<!-- Powered by -->
<li><a href="/poweredby.html">Powered By</a></li>
&nbsp;
<!-- Second menu section aims to support Flink users -->
<!-- Downloads -->
<li><a href="/downloads.html">Downloads</a></li>
<!-- Getting Started -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Getting Started<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/getting-started/index.html" target="_blank">With Flink <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-release-2.1/getting-started/project-setup.html" target="_blank">With Flink Stateful Functions <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<li><a href="/training.html">Training Course</a></li>
</ul>
</li>
<!-- Documentation -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Documentation<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11" target="_blank">Flink 1.11 (Latest stable release) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<li><a href="https://ci.apache.org/projects/flink/flink-docs-master" target="_blank">Flink Master (Latest Snapshot) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-release-2.1" target="_blank">Flink Stateful Functions 2.1 (Latest stable release) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-master" target="_blank">Flink Stateful Functions Master (Latest Snapshot) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
</ul>
</li>
<!-- getting help -->
<li><a href="/gettinghelp.html">Getting Help</a></li>
<!-- Blog -->
<li class="active"><a href="/blog/"><b>Flink Blog</b></a></li>
<!-- Flink-packages -->
<li>
<a href="https://flink-packages.org" target="_blank">flink-packages.org <small><span class="glyphicon glyphicon-new-window"></span></small></a>
</li>
&nbsp;
<!-- Third menu section aim to support community and contributors -->
<!-- Community -->
<li><a href="/community.html">Community &amp; Project Info</a></li>
<!-- Roadmap -->
<li><a href="/roadmap.html">Roadmap</a></li>
<!-- Contribute -->
<li><a href="/contributing/how-to-contribute.html">How to Contribute</a></li>
<!-- GitHub -->
<li>
<a href="https://github.com/apache/flink" target="_blank">Flink on GitHub <small><span class="glyphicon glyphicon-new-window"></span></small></a>
</li>
&nbsp;
<!-- Language Switcher -->
<li>
<!-- link to the Chinese home page when current is blog page -->
<a href="/zh">中文版</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-bottom">
<hr />
<!-- Twitter -->
<li><a href="https://twitter.com/apacheflink" target="_blank">@ApacheFlink <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<!-- Visualizer -->
<li class=" hidden-md hidden-sm"><a href="/visualizer/" target="_blank">Plan Visualizer <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<hr />
<li><a href="https://apache.org" target="_blank">Apache Software Foundation <small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
<li>
<style>
.smalllinks:link {
display: inline-block !important; background: none; padding-top: 0px; padding-bottom: 0px; padding-right: 0px; min-width: 75px;
}
</style>
<a class="smalllinks" href="https://www.apache.org/licenses/" target="_blank">License</a> <small><span class="glyphicon glyphicon-new-window"></span></small>
<a class="smalllinks" href="https://www.apache.org/security/" target="_blank">Security</a> <small><span class="glyphicon glyphicon-new-window"></span></small>
<a class="smalllinks" href="https://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a> <small><span class="glyphicon glyphicon-new-window"></span></small>
<a class="smalllinks" href="https://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a> <small><span class="glyphicon glyphicon-new-window"></span></small>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
</div>
<div class="col-sm-9">
<div class="row-fluid">
<div class="col-sm-12">
<div class="row">
<h1>Apache Flink 1.11.0 Release Announcement</h1>
<p><i></i></p>
<article>
<p>06 Jul 2020 Marta Paes (<a href="https://twitter.com/morsapaes">@morsapaes</a>)</p>
<p>The Apache Flink community is proud to announce the release of Flink 1.11.0! More than 200 contributors worked on over 1.3k issues to bring significant improvements to usability as well as new features to Flink users across the whole API stack. Some highlights that we’re particularly excited about are:</p>
<ul>
<li>
<p>The core engine is introducing <strong>unaligned checkpoints</strong>, a major change to Flink’s fault tolerance mechanism that improves checkpointing performance under heavy backpressure.</p>
</li>
<li>
<p>A <strong>new Source API</strong> that simplifies the implementation of (custom) sources by unifying batch and streaming execution, as well as offloading internals such as event-time handling, watermark generation or idleness detection to Flink.</p>
</li>
<li>
<p>Flink SQL is introducing <strong>Support for Change Data Capture (CDC)</strong> to easily consume and interpret database changelogs from tools like Debezium. The renewed <strong>FileSystem Connector</strong> also expands the set of use cases and formats supported in the Table API/SQL, enabling scenarios like streaming data directly from Kafka to Hive.</p>
</li>
<li>
<p>Multiple performance optimizations to PyFlink, including support for <strong>vectorized User-defined Functions (Pandas UDFs)</strong>. This improves interoperability with libraries like Pandas and NumPy, making Flink more powerful for data science and ML workloads.</p>
</li>
</ul>
<p>Read on for all major new features and improvements, important changes to be aware of and what to expect moving forward!</p>
<div class="page-toc">
<ul id="markdown-toc">
<li><a href="#new-features-and-improvements" id="markdown-toc-new-features-and-improvements">New Features and Improvements</a> <ul>
<li><a href="#unaligned-checkpoints-beta" id="markdown-toc-unaligned-checkpoints-beta">Unaligned Checkpoints (Beta)</a></li>
<li><a href="#unified-watermark-generators" id="markdown-toc-unified-watermark-generators">Unified Watermark Generators</a></li>
<li><a href="#new-data-source-api-beta" id="markdown-toc-new-data-source-api-beta">New Data Source API (Beta)</a></li>
<li><a href="#application-mode-deployments" id="markdown-toc-application-mode-deployments">Application Mode Deployments</a></li>
<li><a href="#other-improvements" id="markdown-toc-other-improvements">Other Improvements</a></li>
<li><a href="#table-apisql-support-for-change-data-capture-cdc" id="markdown-toc-table-apisql-support-for-change-data-capture-cdc">Table API/SQL: Support for Change Data Capture (CDC)</a></li>
<li><a href="#table-apisql-jdbc-catalog-interface-and-postgres-catalog" id="markdown-toc-table-apisql-jdbc-catalog-interface-and-postgres-catalog">Table API/SQL: JDBC Catalog Interface and Postgres Catalog</a></li>
<li><a href="#table-apisql-filesystem-connector-with-support-for-avro-orc-and-parquet" id="markdown-toc-table-apisql-filesystem-connector-with-support-for-avro-orc-and-parquet">Table API/SQL: FileSystem Connector with Support for Avro, ORC and Parquet</a></li>
<li><a href="#table-apisql-support-for-python-udfs" id="markdown-toc-table-apisql-support-for-python-udfs">Table API/SQL: Support for Python UDFs</a></li>
<li><a href="#other-improvements-to-the-table-apisql" id="markdown-toc-other-improvements-to-the-table-apisql">Other Improvements to the Table API/SQL</a></li>
<li><a href="#pyflink-support-for-pandas-udfs" id="markdown-toc-pyflink-support-for-pandas-udfs">PyFlink: Support for Pandas UDFs</a></li>
<li><a href="#other-improvements-to-pyflink" id="markdown-toc-other-improvements-to-pyflink">Other Improvements to PyFlink</a></li>
</ul>
</li>
<li><a href="#important-changes" id="markdown-toc-important-changes">Important Changes</a></li>
<li><a href="#release-notes" id="markdown-toc-release-notes">Release Notes</a></li>
<li><a href="#list-of-contributors" id="markdown-toc-list-of-contributors">List of Contributors</a></li>
</ul>
</div>
<p>The binary distribution and source artifacts are now available on the updated <a href="/downloads.html">Downloads page</a> of the Flink website, and the most recent distribution of PyFlink is available on <a href="https://pypi.org/project/apache-flink/">PyPI</a>. Please review the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/release-notes/flink-1.11.html">release notes</a> carefully, and check the complete <a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?version=12346364&amp;styleName=Html&amp;projectId=12315522">release changelog</a> and <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/flink-docs-release-1.11/">updated documentation</a> for more details.</p>
<p>We encourage you to download the release and share your feedback with the community through the <a href="https://flink.apache.org/community.html#mailing-lists">Flink mailing lists</a> or <a href="https://issues.apache.org/jira/projects/FLINK/summary">JIRA</a>.</p>
<h2 id="new-features-and-improvements">New Features and Improvements</h2>
<h3 id="unaligned-checkpoints-beta">Unaligned Checkpoints (Beta)</h3>
<p>Triggering a checkpoint in Flink will cause a <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/internals/stream_checkpointing.html#barriers">checkpoint barrier</a> to flow from the sources of your topology all the way towards the sinks. For operators that receive more than one input stream, the barriers flowing through each channel need to be aligned before the operator can snapshot its state and forward the checkpoint barrier — typically, this alignment will take just a few milliseconds to complete, but it can become a bottleneck in backpressured pipelines as:</p>
<ul>
<li>
<p>Checkpoint barriers will flow much slower through backpressured channels, effectively blocking the remaining channels and their upstream operators during checkpointing;</p>
</li>
<li>
<p>Slow checkpoint barrier propagation leads to longer checkpointing times and can, worst case, result in little to no progress in the application.</p>
</li>
</ul>
<p>To improve the performance of checkpointing under backpressure scenarios, the community is rolling out the first iteration of unaligned checkpoints (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-76%3A+Unaligned+Checkpoints">FLIP-76</a>) with Flink 1.11. Compared to the original checkpointing mechanism (Fig. 1), this approach doesn’t wait for barrier alignment across input channels, instead allowing barriers to overtake in-flight records (i.e., data stored in buffers) and forwarding them downstream before the synchronous part of the checkpoint takes place (Fig. 2).</p>
<div style="line-height:60%;">
<br />
</div>
<div class="row">
<div class="col-lg-6">
<div class="text-center">
<figure>
<img src="/img/blog/2020-07-06-release-1.11.0/image1.gif" width="600px" alt="Aligned Checkpoints" />
<br /><br />
<figcaption><i><b>Fig.1:</b> Aligned Checkpoints</i></figcaption>
</figure>
</div>
</div>
<div class="col-lg-6">
<div class="text-center">
<figure>
<img src="/img/blog/2020-07-06-release-1.11.0/image2.png" width="600px" alt="Unaligned Checkpoints" />
<br /><br />
<figcaption><i><b>Fig.2:</b> Unaligned Checkpoints</i></figcaption>
</figure>
</div>
</div>
</div>
<div style="line-height:150%;">
<br />
</div>
<p>Because in-flight records have to be persisted as part of the snapshot, unaligned checkpoints will lead to increased checkpoints sizes. On the upside, <strong>checkpointing times are heavily reduced</strong>, so users will see more progress (even in unstable environments) as more up-to-date checkpoints will lighten the recovery process. You can learn more about the current limitations of unaligned checkpoints in the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/state/checkpoints.html#unaligned-checkpoints">documentation</a>, and track the improvement work planned for this feature in <a href="https://issues.apache.org/jira/browse/FLINK-14551">FLINK-14551</a>.</p>
<p>As with any beta feature, we appreciate early feedback that you might want to share with the community after giving unaligned checkpoints a try!</p>
<p><span class="label label-info">Info</span> To enable this feature, you need to configure the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/streaming/api/environment/CheckpointConfig.html"><code>enableUnalignedCheckpoints</code></a> option in your <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/stream/state/checkpointing.html#enabling-and-configuring-checkpointing">checkpoint config</a>. Please note that unaligned checkpoints can only be enabled if <code>checkpointingMode</code> is set to <code>CheckpointingMode.EXACTLY_ONCE</code>.</p>
<h3 id="unified-watermark-generators">Unified Watermark Generators</h3>
<p>So far, watermark generation (prev. also called <em>assignment</em>) relied on two different interfaces: <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/streaming/api/functions/AssignerWithPunctuatedWatermarks.html"><code>AssignerWithPunctuatedWatermarks</code></a> and <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/streaming/api/functions/AssignerWithPeriodicWatermarks.html"><code>AssignerWithPeriodicWatermarks</code></a>; that were closely intertwined with timestamp extraction. This made it difficult to implement long-requested features like support for idleness detection, besides leading to code duplication and maintenance burden. With <a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-126%3A+Unify+%28and+separate%29+Watermark+Assigners">FLIP-126</a>, the legacy watermark assigners are unified into a single interface: the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/api/common/eventtime/WatermarkGenerator.html"><code>WatermarkGenerator</code></a>; and detached from the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/api/common/eventtime/TimestampAssigner.html"><code>TimestampAssigner</code></a>.</p>
<p>This gives users more control over watermark emission and simplifies the implementation of new connectors that need to support watermark assignment and timestamp extraction at the source (see <em><a href="#new-data-source-api-beta">New Data Source API</a></em>). Multiple <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11//dev/event_timestamps_watermarks.html#introduction-to-watermark-strategies">strategies for watermarking</a> are available out-of-the-box as convenience methods in Flink 1.11 (e.g. <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/api/common/eventtime/WatermarkStrategy.html#forBoundedOutOfOrderness-java.time.Duration-"><code>forBoundedOutOfOrderness</code></a>, <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/api/common/eventtime/WatermarkStrategy.html#forMonotonousTimestamps--"><code>forMonotonousTimestamps</code></a>), though you can also choose to customize your own.</p>
<p><strong>Support for Watermark Idleness Detection</strong></p>
<p>The <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/api/common/eventtime/WatermarkStrategy.html#withIdleness-java.time.Duration-"><code>WatermarkStrategy.withIdleness()</code></a> method allows you to mark a stream as idle if no events arrive within a configured time (i.e. a timeout duration), which in turn allows handling event time skew properly and preventing idle partitions from holding back the event time progress of the entire application. Users can already benefit from <strong>per-partition idleness detection</strong> in the Kafka connector, which has been adapted to use the new interfaces (<a href="https://issues.apache.org/jira/browse/FLINK-17669">FLINK-17669</a>).</p>
<p><span class="label label-info">Note</span> <a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-126%3A+Unify+%28and+separate%29+Watermark+Assigners">FLIP-126</a> introduces no breaking changes, but we recommend that users give preference to the new <code>WatermarkGenerator</code> interface moving forward, in preparation for the deprecation of the legacy watermark assigners in future releases.</p>
<h3 id="new-data-source-api-beta">New Data Source API (Beta)</h3>
<p>Up to this point, writing a production-grade source connector for Flink was a non-trivial task that required users to be somewhat familiar with Flink internals and account for implementation details like event time assignment, watermark generation or idleness detection in their code. Flink 1.11 introduces a new Data Source API (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-27%3A+Refactor+Source+Interface">FLIP-27</a>) to overcome these limitations, as well as the need to rewrite separate code for batch and streaming execution.</p>
<center>
<figure>
<img src="/img/blog/2020-07-06-release-1.11.0/image3.png" width="600px" alt="Data Source API" />
</figure>
</center>
<div style="line-height:150%;">
<br />
</div>
<p>Separating the work of split discovery and the actual reading of the consumed data (i.e. the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/stream/sources.html#data-source-concepts"><em>splits</em></a>) in different components — resp. the <code>SplitEnumerator</code> and <code>SourceReader</code> — allows mixing and matching different enumeration strategies and split readers.</p>
<p>As an example, the existing Kafka connector has multiple strategies for partition discovery that are intermingled with the rest of the code. With the new interfaces in place, it would only need a single reader implementation and there could be several split enumerators for the different partition discovery strategies.</p>
<p><strong>Batch and Streaming Unification</strong></p>
<p>Source connectors implemented using the Data Source API will be able to work both as a bounded (<em>batch</em>) and unbounded (<em>streaming</em>) source. The difference between both cases is minimal: for bounded input, the <code>SplitEnumerator</code> will generate a fixed set of splits and each split is finite; for unbounded input, either the splits are not finite or the <code>SplitEnumerator</code> keeps generating new splits.</p>
<p><strong>Implicit Watermark and Event Time Handling</strong></p>
<p>The <code>TimestampAssigner</code> and <code>WatermarkGenerator</code> run transparently as part of the <code>SourceReader</code> component, so users also don’t have to implement any timestamp extraction or watermark generation code.</p>
<p><span class="label label-info">Note</span> The existing source connectors have not yet been reimplemented using the Data Source API — this is planned for upcoming releases. If you’re looking to implement a new source, please refer to the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/stream/sources.html#data-sources">Data Source documentation</a> and <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/stream/sources.html#the-data-source-api">the tips on source development</a>.</p>
<h3 id="application-mode-deployments">Application Mode Deployments</h3>
<p>Prior to Flink 1.11, jobs in a Flink application could either be submitted to a long-running <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/concepts/flink-architecture.html#flink-session-cluster">Flink Session Cluster</a> (<em>session mode</em>) or a dedicated <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/concepts/flink-architecture.html#flink-job-cluster">Flink Job Cluster</a> (<em>job mode</em>). For both these modes, the <code>main()</code> method of user programs runs on the <em>client</em> side. This presents some challenges: on one hand, if the client is part of a large installation, it can easily become a bottleneck for <code>JobGraph</code> generation; and on the other, it’s not a good fit for containerized environments like Docker or Kubernetes.</p>
<p>From this release on, Flink gets an additional deployment mode: <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/deployment/#application-mode">Application Mode</a> (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-85+Flink+Application+Mode">FLIP-85</a>); where the <code>main()</code> method runs on the cluster, rather than the client. The job submission becomes a one-step process: you package your application logic and dependencies into an executable job JAR and the cluster entrypoint (<a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/client/deployment/application/ApplicationClusterEntryPoint.html"><code>ApplicationClusterEntryPoint</code></a>) is responsible for calling the <code>main()</code> method to extract the <code>JobGraph</code>.</p>
<p>In Flink 1.11, the community worked to already support <em>application mode</em> in Kubernetes (<a href="https://issues.apache.org/jira/browse/FLINK-10934">FLINK-10934</a>).</p>
<h3 id="other-improvements">Other Improvements</h3>
<p><strong>Unified Memory Configuration for JobManagers (<a href="https://jira.apache.org/jira/browse/FLINK-16614">FLIP-116</a>)</strong></p>
<p>Following the work started in Flink 1.10 to improve memory management and configuration, this release introduces a new memory model that aligns the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/memory/mem_setup_master.html">JobManagers’ configuration options</a> and terminology with that introduced in <a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-49%3A+Unified+Memory+Configuration+for+TaskExecutors">FLIP-49</a> for TaskManagers. This affects all deployment types: standalone, YARN, Mesos and the new active Kubernetes integration.</p>
<p><span class="label label-danger">Attention</span> Reusing a previous Flink configuration without any adjustments can result in differently computed memory parameters for the JVM and, as a result, performance changes or even failures. Make sure to check the <a href="https://ci.apache.org/projects/flink/flink-docs-master/ops/memory/mem_migration.html#migrate-job-manager-memory-configuration">migration guide</a> if you’re planning to update to the latest version.</p>
<p><strong>Improvements to the Flink WebUI (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-75%3A+Flink+Web+UI+Improvement+Proposal">FLIP-75</a>)</strong></p>
<p>In Flink 1.11, the community kicked off a series of improvements to the Flink WebUI. The first to roll out are better TaskManager and JobManager log display (<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=147427143">FLIP-103</a>), as well as a new thread dump utility (<a href="https://issues.apache.org/jira/browse/FLINK-14816">FLINK-14816</a>). Some additional work planned for upcoming releases includes better backpressure detection, more flexible and configurable exception display and support for displaying the history of subtask failure attempts.</p>
<p><strong>Docker Image Unification (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-111%3A+Docker+image+unification">FLIP-111</a>)</strong></p>
<p>With this release, all Docker-related resources have been consolidated into <a href="https://github.com/apache/flink-docker">apache/flink-docker</a> and the entry point script has been extended to allow users to run the default Docker image in different modes without the need to create a custom image. The <a href="https://ci.apache.org/projects/flink/flink-docs-master/ops/deployment/docker.html#customize-flink-image">updated documentation</a> describes in detail how to use and customize the official Flink Docker image for different environments and deployment modes.</p>
<hr />
<h3 id="table-apisql-support-for-change-data-capture-cdc">Table API/SQL: Support for Change Data Capture (CDC)</h3>
<p>Change Data Capture (CDC) has become a popular pattern to capture committed changes from a database and propagate those changes to downstream consumers, for example to keep multiple datastores in sync and avoid common pitfalls such as <a href="https://thorben-janssen.com/dual-writes/">dual writes</a>. Being able to easily ingest and interpret these changelogs into the Table API/SQL has been a highly demanded feature in the Flink community — and it’s now possible with Flink 1.11.</p>
<p>To extend the scope of the Table API/SQL to use cases like CDC, Flink 1.11 introduces new table source and sink interfaces with <strong>changelog mode</strong> (see <em><a href="#other-improvements-to-the-table-apisql">New TableSource and TableSink Interfaces</a></em>) and support for the <a href="https://debezium.io/">Debezium</a> and <a href="https://github.com/alibaba/canal">Canal</a> formats (<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=147427289">FLIP-105</a>). This means that dynamic tables sources are no longer limited to append-only operations and can ingest these external changelogs (<code>INSERT</code> events), interpret them into change operations (<code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code> events) and emit them downstream with the change type.</p>
<center>
<figure>
<img src="/img/blog/2020-07-06-release-1.11.0/image4.png" width="500px" alt="CDC" />
</figure>
</center>
<div style="line-height:150%;">
<br />
</div>
<p>Users have to specify either <code>“format=debezium-json”</code> or <code>“format=canal-json”</code> in their <code>CREATE TABLE</code> statement to consume changelogs using SQL DDL.</p>
<div class="highlight"><pre><code class="language-sql"><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">my_table</span> <span class="p">(</span>
<span class="p">...</span>
<span class="p">)</span> <span class="k">WITH</span> <span class="p">(</span>
<span class="s1">&#39;connector&#39;</span><span class="o">=</span><span class="s1">&#39;...&#39;</span><span class="p">,</span> <span class="c1">-- e.g. &#39;kafka&#39;</span>
<span class="s1">&#39;format&#39;</span><span class="o">=</span><span class="s1">&#39;debezium-json&#39;</span><span class="p">,</span>
<span class="s1">&#39;debezium-json.schema-include&#39;</span><span class="o">=</span><span class="s1">&#39;true&#39;</span> <span class="c1">-- default: false (Debezium can be configured to include or exclude the message schema)</span>
<span class="s1">&#39;debezium-json.ignore-parse-errors&#39;</span><span class="o">=</span><span class="s1">&#39;true&#39;</span> <span class="c1">-- default: false</span>
<span class="p">);</span></code></pre></div>
<p>Flink 1.11 only supports Kafka as a changelog source out-of-the-box and JSON-encoded changelogs, with Avro (Debezium) and Protobuf (Canal) planned for future releases. There are also plans to support MySQL binlogs and Kafka compacted topics as sources, as well as to extend changelog support to batch execution.</p>
<p><span class="label label-danger">Attention</span> There is a known issue (<a href="https://issues.apache.org/jira/browse/FLINK-18461">FLINK-18461</a>) that prevents changelog sources from being used to write to upsert sinks (e.g. MySQL, HBase, Elasticsearch). This will be fixed in the next patch release (1.11.1).</p>
<h3 id="table-apisql-jdbc-catalog-interface-and-postgres-catalog">Table API/SQL: JDBC Catalog Interface and Postgres Catalog</h3>
<p>Flink 1.11 introduces a generic JDBC catalog interface (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-93%3A+JDBC+catalog+and+Postgres+catalog">FLIP-93</a>) that enables users of the Table API/SQL to <strong>derive table schemas automatically</strong> from connections to relational databases over <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/connect.html#jdbc-connector">JDBC</a>. This eliminates the previous need for manual schema definition and type conversion, and also allows to check for schema errors at compile time instead of runtime.</p>
<p>The first implementation, rolling out with the new release, is the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/catalogs.html#postgrescatalog">Postgres catalog</a>.</p>
<h3 id="table-apisql-filesystem-connector-with-support-for-avro-orc-and-parquet">Table API/SQL: FileSystem Connector with Support for Avro, ORC and Parquet</h3>
<p>To improve the user experience for end-to-end streaming ETL use cases, the Flink community worked on a new FileSystem Connector for the Table API/SQL (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-115%3A+Filesystem+connector+in+Table">FLIP-115</a>). The implementation is based on Flink’s <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/ops/filesystems/index.html">FileSystem abstraction</a> and reuses <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/connectors/streamfile_sink.html">StreamingFileSink</a> to ensure the same set of capabilities and consistent behaviour with the DataStream API.</p>
<p>This also means that Table API/SQL users can now make use of all formats already supported by StreamingFileSink, like (Avro) Parquet, as well as the new formats introduced with this release, like Avro (<a href="https://issues.apache.org/jira/browse/FLINK-11395">FLINK-11395</a>) and Orc (<a href="https://issues.apache.org/jira/browse/FLINK-10114">FLINK-10114</a>).</p>
<div class="highlight"><pre><code class="language-sql"><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="n">my_table</span> <span class="p">(</span>
<span class="n">column_name1</span> <span class="nb">INT</span><span class="p">,</span>
<span class="n">column_name2</span> <span class="n">STRING</span><span class="p">,</span>
<span class="p">...</span>
<span class="n">part_name1</span> <span class="nb">INT</span><span class="p">,</span>
<span class="n">part_name2</span> <span class="n">STRING</span>
<span class="p">)</span> <span class="n">PARTITIONED</span> <span class="k">BY</span> <span class="p">(</span><span class="n">part_name1</span><span class="p">,</span> <span class="n">part_name2</span><span class="p">)</span> <span class="k">WITH</span> <span class="p">(</span>
<span class="s1">&#39;connector&#39;</span> <span class="o">=</span> <span class="s1">&#39;filesystem&#39;</span><span class="p">,</span>
<span class="s1">&#39;path&#39;</span> <span class="o">=</span> <span class="s1">&#39;file:///path/to/file,</span>
<span class="s1"> &#39;</span><span class="n">format</span><span class="s1">&#39; = &#39;</span><span class="p">...</span><span class="err">&#39;</span><span class="p">,</span> <span class="c1">-- supported formats: Avro, ORC, Parquet, CSV, JSON </span>
<span class="p">...</span>
<span class="p">);</span></code></pre></div>
<p>The new all-rounder FileSystem Connector transparently handles batch and streaming execution, provides exactly-once guarantees and has full partition support, greatly expanding the scope of usage of the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/connect.html#file-system-connector">legacy connector</a>. This allows users to easily implement common use cases like <strong>directly streaming data from Kafka to Hive</strong>.</p>
<p>You can track the upcoming improvements to the FileSystem Connector in <a href="https://issues.apache.org/jira/browse/FLINK-17778">FLINK-17778</a>.</p>
<h3 id="table-apisql-support-for-python-udfs">Table API/SQL: Support for Python UDFs</h3>
<p>Prior to this release, users of the Table API/SQL were limited to defining UDFs in either Java or Scala. In Flink 1.11, the community worked on expanding the usage scope of the Python language beyond PyFlink and providing support for Python UDFs in the SQL DDL syntax (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-106%3A+Support+Python+UDF+in+SQL+Function+DDL">FLIP-106</a>), as well as the SQL Client (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-114%3A+Support+Python+UDF+in+SQL+Client">FLIP-114</a>). Users can also register Python UDFs in the system catalog via SQL DDL or the Java Catalog API, so that functions can be shared between jobs.</p>
<h3 id="other-improvements-to-the-table-apisql">Other Improvements to the Table API/SQL</h3>
<p><strong>DDL and DML Compatibility for the Hive Connector (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-123%3A+DDL+and+DML+compatibility+for+Hive+connector">FLIP-123</a>)</strong></p>
<p>Starting from Flink 1.11, users can write SQL statements directly using Hive syntax (HiveQL) in the Table API/SQL and the SQL Client. For this purpose, an additional dialect was introduced and users can now dynamically switch between Flink (<code>default</code>) and Hive (<code>hive</code>) on a per-statement basis. For a complete list of supported DDL and DML statements, check the Hive dialect <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/hive/hive_dialect.html#hive-dialect">documentation</a>.</p>
<p><strong>Extensions and Improvements to the Flink SQL Syntax</strong></p>
<ul>
<li>
<p>Flink 1.11 introduces the concept of <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/sql/create.html#create-table">primary key constraints</a> to leverage runtime optimizations in Flink SQL DDL (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP+87%3A+Primary+key+constraints+in+Table+API">FLIP-87</a>);</p>
</li>
<li>
<p>View objects are now fully supported in SQL DDL using the <code>CREATE</code>/<code>ALTER</code>/<code>DROP VIEW</code> statements (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-71%3A+E2E+View+support+in+FLINK+SQL">FLIP-71</a>);</p>
</li>
<li>
<p>Users can now specify or override table options in their DQL/DML statements using <a href="https://ci.apache.org/projects/flink/flink-docs-master/dev/table/sql/hints.html#dynamic-table-options">dynamic table options</a> (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-113%3A+Supports+Dynamic+Table+Options+for+Flink+SQL">FLIP-113</a>).</p>
</li>
<li>
<p>To make connector properties less verbose and improve exception handling, some key properties have been refactored (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-122%3A+New+Connector+Property+Keys+for+New+Factory">FLIP-122</a>). This change does not break compatibility, so users can still use the old property keys.</p>
</li>
</ul>
<p><strong>New TableSource and TableSink Interfaces (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-95%3A+New+TableSource+and+TableSink+interfaces">FLIP-95</a>)</strong></p>
<p>Flink 1.11 introduces new table source and sink interfaces (resp. <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/table/connector/source/DynamicTableSource.html"><code>DynamicTableSource</code></a> and <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/table/connector/sink/DynamicTableSink.html"><code>DynamicTableSink</code></a>) that unify batch and streaming execution, provide more efficient data processing with the Blink planner and offer support for handling changelogs (see <em><a href="#table-apisql-support-for-change-data-capture-cdc">Support for Change Data Capture (CDC)</a></em>). The new interfaces also make it easier for users to <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/sourceSinks.html#full-stack-example">implement custom connectors</a> or modify existing ones. For an end-to-end example on how to implement a custom scan table source with a decoding format that supports changelog semantics, check out the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/sourceSinks.html#full-stack-example">documentation</a>.</p>
<p><span class="label label-info">Note</span> Although compatibility is not immediately affected, we recommend that Table API/SQL users update any sources and sinks to the new interface stack.</p>
<p><strong>Refactored TableEnvironment Interface (<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=134745878">FLIP-84</a>)</strong></p>
<p>The semantics to describe similar behaviours in the <code>TableEnvironment</code> and <code>Table</code> interfaces have diverged over time, leading to an inconsistent and sometimes unclear user experience. To improve this and make programming more fluent in the Table API/SQL, Flink 1.11 introduces new methods that unify behaviours like execution triggering (e.g. <code>executeSql()</code>) and result representation (e.g. <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/table/api/TableResult.html#print--"><code>print()</code></a>, <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/api/java/org/apache/flink/table/api/TableResult.html#collect--"><code>collect()</code></a>), and also lay the groundwork for important features like <a href="https://lists.apache.org/thread.html/r076e63bf6c8ed42d1b9ed2b406029696274a3a90cc360bc3a03e65d2%40%3Cdev.flink.apache.org%3E">multi-statement execution support</a> in future releases.</p>
<p><span class="label label-info">Note</span> The methods deprecated with FLIP-84 will not be immediately removed, but we recommend that users adopt the newly introduced methods. For a complete list of new and deprecated methods, check the “Summary” section of <a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=134745878">FLIP-84</a>.</p>
<p><strong>New Type Inference for Table API UDFs (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-65%3A+New+type+inference+for+Table+API+UDFs">FLIP-65</a>)</strong></p>
<p>In Flink 1.9, the community started working on a <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/types.html#data-types">new data type system</a> for the Table API to improve its compliance with the SQL standard (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-37%3A+Rework+of+the+Table+API+Type+System">FLIP-37</a>). This work is now close to being completed in Flink 1.11, with the exposure of Table API UDFs to the new type system (scalar and table functions, with aggregate functions planned for the next release).</p>
<hr />
<h3 id="pyflink-support-for-pandas-udfs">PyFlink: Support for Pandas UDFs</h3>
<p>Up to this release, Python UDFs in PyFlink only supported scalar values of standard Python types. This presented some limitations:</p>
<ul>
<li>
<p>High serialization/deserialization overhead in the process of transferring data between the JVM and the Python processes;</p>
</li>
<li>
<p>Hard to integrate with common Python libraries for high-performance numerical processing like pandas and NumPy.</p>
</li>
</ul>
<p>To overcome these limitations, the community introduced support for (scalar) <strong>vectorized Python UDFs</strong> based on <a href="https://pandas.pydata.org/pandas-docs/stable/getting_started/overview.html">pandas</a> in Flink 1.11 (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-97%3A+Support+Scalar+Vectorized+Python+UDF+in+PyFlink">FLIP-97</a>). The performance of vectorized UDFs is usually much higher, as the serialization/deserialization overhead is minimized by falling back to <a href="https://arrow.apache.org/">Apache Arrow</a>; and handling <code>pandas.Series</code> as input/output allows to take full advantage of the pandas and NumPy libraries. This makes Pandas UDFs a popular solution to parallelize Machine Learning and other large-scale, distributed data science workloads (e.g. feature engineering, distributed model application).</p>
<div class="highlight"><pre><code class="language-python"><span class="nd">@udf</span><span class="p">(</span><span class="n">input_types</span><span class="o">=</span><span class="p">[</span><span class="n">DataTypes</span><span class="o">.</span><span class="n">BIGINT</span><span class="p">(),</span> <span class="n">DataTypes</span><span class="o">.</span><span class="n">BIGINT</span><span class="p">()],</span> <span class="n">result_type</span><span class="o">=</span><span class="n">DataTypes</span><span class="o">.</span><span class="n">BIGINT</span><span class="p">(),</span> <span class="n">udf_type</span><span class="o">=</span><span class="s">&quot;pandas&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
<span class="k">return</span> <span class="n">i</span> <span class="o">+</span> <span class="n">j</span></code></pre></div>
<p>To mark a UDF as a Pandas UDF, you only need to add an extra parameter <code>udf_type=”pandas”</code> in the udf decorator, as described in the <a href="https://ci.apache.org/projects/flink/flink-docs-master/dev/table/python/vectorized_python_udfs.html#vectorized-user-defined-functions">documentation</a>.</p>
<h3 id="other-improvements-to-pyflink">Other Improvements to PyFlink</h3>
<p><strong>Conversion fromPandas/toPandas (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-120%3A+Support+conversion+between+PyFlink+Table+and+Pandas+DataFrame">FLIP-120</a>)</strong></p>
<p>Arrow is also supported as an optimization to convert between PyFlink tables and <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html"><code>pandas.DataFrames</code></a>, enabling users to switch processing engines seamlessly without the need for an intermediate connector. For examples on how to use the new <code>fromPandas()</code> and <code>toPandas()</code> methods in PyFlink, check out the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/python/conversion_of_pandas.html#conversions-between-pyflink-table-and-pandas-dataframe">documentation</a>.</p>
<p><strong>Support for User-defined Table Functions (UDTFs) (<a href="https://jira.apache.org/jira/browse/FLINK-14500">FLINK-14500</a>)</strong></p>
<p>From Flink 1.11, you can define and register custom <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/python/python_udfs.html#table-functions">UDTFs</a> in PyFlink. Similar to a Python UDF, a UDTF takes zero, one or multiple scalar values as input, but can return an arbitrary number of rows as output instead of a single value.</p>
<p><strong>Cython Performance Optimization for UDFs (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-121%3A+Support+Cython+Optimizing+Python+User+Defined+Function">FLIP-121</a>)</strong></p>
<p><a href="https://cython.readthedocs.io/en/latest/src/quickstart/cythonize.html">Cython</a> is a compiled superset of the Python language that is often used to improve the performance of large-scale numeric processing in Python, as it optimizes execution to machine code-level speed and pairs well with popular C-based libraries like NumPy. From Flink 1.11, you can build <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/flinkDev/building.html#build-pyflink">PyFlink with Cython support</a> and “Cythonize” your Python UDFs to substantially improve code execution speed (up to 30x faster, compared to Python UDFs in Flink 1.10).</p>
<p><strong>User-defined Metrics in Python UDFs (<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-112%3A+Support+User-Defined+Metrics+in++Python+UDF">FLIP-112</a>)</strong></p>
<p>To make it easier for users to monitor and debug the execution of Python UDFs, PyFlink now allows gathering and exposing metrics to external systems, as well as defining user scopes and variables. You can access the metrics system from a UDF by calling <code>function_context.get_metric_group()</code> in the open method, as described in the <a href="https://ci.apache.org/projects/flink/flink-docs-master/dev/table/python/metrics.html#registering-metrics">documentation</a>.</p>
<hr />
<h2 id="important-changes">Important Changes</h2>
<ul>
<li>
<p>[<a href="https://jira.apache.org/jira/browse/FLINK-17339">FLINK-17339</a>] The Blink planner is the <strong>default</strong> in the Table API/SQL starting from Flink 1.11. This was already the case for the SQL Client since Flink 1.10. The old Flink planner is still supported, but not actively developed.</p>
</li>
<li>
<p>[<a href="https://issues.apache.org/jira/browse/FLINK-5763">FLINK-5763</a>] Savepoints now contain all their state inside a single directory (both metadata and program state). This makes it straightforward to figure out which files make up the state of a savepoint and allows users to <strong>relocate savepoints</strong> by simply moving a directory.</p>
</li>
<li>
<p>[<a href="https://issues.apache.org/jira/browse/FLINK-16408">FLINK-16408</a>] To reduce pressure on the JVM metaspace, the user code class loader is being reused by a <code>TaskExecutor</code> as long as there is at least a single slot allocated for the respective job. This changes Flink’s recovery behaviour slightly, so that it will not reload static fields.</p>
</li>
<li>
<p>[<a href="https://issues.apache.org/jira/browse/FLINK-11086">FLINK-11086</a>] Flink now supports Hadoop versions above <strong>Hadoop 3.0.0</strong>. Note that the Flink project does not provide any updated “flink-shaded-hadoop-*” jars. Users need to provide Hadoop dependencies through the <code>HADOOP_CLASSPATH</code> environment variable (recommended) or the lib/ folder.</p>
</li>
<li>
<p>[<a href="https://issues.apache.org/jira/browse/FLINK-16963">FLINK-16963</a>] All <code>MetricReporters</code> that come with Flink have been converted to plugins. These should no longer be placed into <code>/lib</code> (which may result in dependency conflicts), but <code>/plugins/&lt;some_directory&gt;</code> instead.</p>
</li>
<li>
<p>[<a href="https://issues.apache.org/jira/browse/FLINK-12639">FLINK-12639</a>] The Flink <strong>documentation</strong> is undergoing some <strong>rework</strong>, so you might notice that the navigation and organization of content look slightly different starting from Flink 1.11.</p>
</li>
</ul>
<h2 id="release-notes">Release Notes</h2>
<p>Please review the <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.11/release-notes/flink-1.11.html">release notes</a> carefully for a detailed list of changes and new features if you plan to upgrade your setup to Flink 1.11. This version is API-compatible with previous 1.x releases for APIs annotated with the @Public annotation.</p>
<h2 id="list-of-contributors">List of Contributors</h2>
<p>The Apache Flink community would like to thank all the 200+ contributors that have made this release possible:</p>
<p>Aitozi, Alexander Fedulov, Alexey Trenikhin, Aljoscha Krettek, Andrey Zagrebin, Arvid Heise, Ayush Saxena, Bairos, Bartosz Krasinski, Benchao Li, Benoit Hanotte, Benoît Paris, Bhagavan Das, Canbin Zheng, Cedric Chen, Chesnay Schepler, Colm O hEigeartaigh, Congxian Qiu, CrazyTomatoOo, Danish Amjad, Danny Chan, David Anderson, Dawid Wysakowicz, Dian Fu, Dominik Wosiński, Echo Lee, Ethan Marsh, Etienne Chauchot, Fabian Hueske, Fabian Paul, Flavio Pompermaier, Gao Yun, Gary Yao, Ghildiyal, Grebennikov Roman, GuoWei Ma, Guru Prasad, Gyula Fora, Hequn Cheng, Hu Guang, HuFeiHu, HuangXingBo, Igal Shilman, Ismael Juma, Jacob Sevart, Jark Wu, Jaskaran Bindra, Jason K, Jeff Yang, Jeff Zhang, Jerry Wang, Jiangjie (Becket) Qin, Jiayi, Jiayi Liao, Jiayi-Liao, Jincheng Sun, Jing Zhang, Jingsong Lee, JingsongLi, Jun Qin, JunZhang, Jörn Kottmann, Kevin Bohinski, Konstantin Knauf, Kostas Kloudas, Kurt Young, Leonard Xu, Lining Jing, Liupengcheng, LululuAlu, Marta Paes Moreira, Matt Welke, Max Kuklinski, Maximilian Michels, Nico Kruber, Niels Basjes, Oleksandr Nitavskyi, Paul Lam, Paul Lin, PengFei Li, PengchengLiu, Piotr Nowojski, Prem Santosh, Qingsheng Ren, Rafi Aroch, Raymond Farrelly, Richard Deurwaarder, Robert Metzger, RocMarshal, Roey Shem Tov, Roman, Roman Khachatryan, Rong Rong, RoyRuan, Rui Li, Seth Wiesman, Shaobin.Ou, Shengkai, Shuiqiang Chen, Shuo Cheng, Sivaprasanna, Sivaprasanna S, SteNicholas, Stefan Richter, Stephan Ewen, Steve OU, Steve Whelan, Tartarus, Terry Wang, Thomas Weise, Till Rohrmann, Timo Walther, TsReaper, Tzu-Li (Gordon) Tai, Victor Wong, Wei Zhong, Weike DONG, Xiaogang Zhou, Xintong Song, Xu Bai, Xuannan, Yadong Xie, Yang Wang, Yangze Guo, Yichao Yang, Ying, Yu Li, Yuan Mei, Yun Gao, Yun Tang, Yuval Itzchakov, Zakelly, Zhao, Zhenghua Gao, Zhijiang, Zhu Zhu, acqua.csq, austin ce, azagrebin, bdine, bowen.li, caoyingjie, caozhen, caozhen1937, chaojianok, chen, chendonglin, comsir, cpugputpu, czhang2, dianfu, edu05, eduardowt, fangliang, felixzheng, fmyblack, gauss, gk0916, godfrey he, godfreyhe, guliziduo, guowei.mgw, hehuiyuan, hequn8128, hpeter, huangxingbo, huzheng, ifndef-SleePy, jingwen-ywb, jrthe42, kevin.cyj, klion26, lamber-ken, leesf, libenchao, lijiewang.wlj, liuyongvs, lsy, lumen, machinedoll, mans2singh, molsionmo, oliveryunchang, openinx, paul8263, ptmagic, qqibrow, sev7e0, shuai-xu, shuai.xu, shuiqiangchen, snuyanzin, spafka, sunhaibotb, sunjincheng121, testfixer, tison, vinoyang, vthinkxie, wangtong, wangxianghu, wangxiyuan, wangxlong, wangyang0918, wenlong.lwl, whlwanghailong, william, windWheel, wooplevip, wuxuyang, xushiwei, xuyang1706, yanghua, yangyichao-mango, yuzhao.cyz, zentol, zhanglibing, zhangmang, zhangzhanchun, zhengcanbin, zhengshuli, zhenxianyimeng, zhijiang, zhongyong jin, zhule, zhuxiaoshang, zjuwangg, zoudan, zoudaokoulife, zzchun, “lzh576177775”, 骚sir, 厉颖, 张军, 曹建华, 漫步云端</p>
</article>
</div>
<div class="row">
<div id="disqus_thread"></div>
<script type="text/javascript">
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'stratosphere-eu'; // required: replace example with your forum shortname
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
</div>
</div>
</div>
</div>
</div>
<hr />
<div class="row">
<div class="footer text-center col-sm-12">
<p>Copyright © 2014-2019 <a href="http://apache.org">The Apache Software Foundation</a>. All Rights Reserved.</p>
<p>Apache Flink, Flink®, Apache®, the squirrel logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation.</p>
<p><a href="/privacy-policy.html">Privacy Policy</a> &middot; <a href="/blog/feed.xml">RSS feed</a></p>
</div>
</div>
</div><!-- /.container -->
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.matchHeight/0.7.0/jquery.matchHeight-min.js"></script>
<script src="/js/codetabs.js"></script>
<script src="/js/stickysidebar.js"></script>
<!-- Google Analytics -->
<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-52545728-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>