blob: 597ef200eb2dfdbc3785d3d777eb8d18083ef78c [file] [log] [blame]
<!DOCTYPE html>
<html lang="en" dir=ZgotmplZ>
<head>
<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css">
<script src="/bootstrap/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" type="text/css" href="/font-awesome/css/font-awesome.min.css">
<script src="/js/anchor.min.js"></script>
<script src="/js/flink.js"></script>
<link rel="canonical" href="https://flink.apache.org/2022/01/07/apache-flink-ml-2.0.0-release-announcement/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="The Apache Flink community is excited to announce the release of Flink ML 2.0.0! Flink ML is a library that provides APIs and infrastructure for building stream-batch unified machine learning algorithms, that can be easy-to-use and performant with (near-) real-time latency.
This release involves a major refactor of the earlier Flink ML library and introduces major features that extend the Flink ML API and the iteration runtime, such as supporting stages with multi-input multi-output, graph-based stage composition, and a new stream-batch unified iteration library.">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Apache Flink ML 2.0.0 Release Announcement" />
<meta property="og:description" content="The Apache Flink community is excited to announce the release of Flink ML 2.0.0! Flink ML is a library that provides APIs and infrastructure for building stream-batch unified machine learning algorithms, that can be easy-to-use and performant with (near-) real-time latency.
This release involves a major refactor of the earlier Flink ML library and introduces major features that extend the Flink ML API and the iteration runtime, such as supporting stages with multi-input multi-output, graph-based stage composition, and a new stream-batch unified iteration library." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://flink.apache.org/2022/01/07/apache-flink-ml-2.0.0-release-announcement/" /><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2022-01-07T08:00:00+00:00" />
<meta property="article:modified_time" content="2022-01-07T08:00:00+00:00" />
<title>Apache Flink ML 2.0.0 Release Announcement | Apache Flink</title>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="stylesheet" href="/book.min.22eceb4d17baa9cdc0f57345edd6f215a40474022dfee39b63befb5fb3c596b5.css" integrity="sha256-IuzrTRe6qc3A9XNF7dbyFaQEdAIt/uObY777X7PFlrU=">
<script defer src="/en.search.min.2698f0d1b683dae4d6cb071668b310a55ebcf1c48d11410a015a51d90105b53e.js" integrity="sha256-Jpjw0baD2uTWywcWaLMQpV688cSNEUEKAVpR2QEFtT4="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
<meta name="generator" content="Hugo 0.124.1">
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['disableCookies']);
_paq.push(["setDomains", ["*.flink.apache.org","*.nightlies.apache.org/flink"]]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
</head>
<body dir=ZgotmplZ>
<header>
<nav class="navbar navbar-expand-xl">
<div class="container-fluid">
<a class="navbar-brand" href="/">
<img src="/img/logo/png/100/flink_squirrel_100_color.png" alt="Apache Flink" height="47" width="47" class="d-inline-block align-text-middle">
<span>Apache Flink</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<i class="fa fa-bars navbar-toggler-icon"></i>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">About</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/what-is-flink/flink-architecture/">Architecture</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/flink-applications/">Applications</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/flink-operations/">Operations</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/use-cases/">Use Cases</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/powered-by/">Powered By</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/roadmap/">Roadmap</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/community/">Community & Project Info</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/security/">Security</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/special-thanks/">Special Thanks</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Getting Started</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/try-flink/local_installation/">With Flink<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/docs/try-flink-kubernetes-operator/quick-start/">With Flink Kubernetes Operator<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable/docs/get-started/introduction/">With Flink CDC<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/docs/try-flink-ml/quick-start/">With Flink ML<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/getting-started/project-setup.html">With Flink Stateful Functions<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/learn-flink/overview/">Training Course<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Documentation</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/">Flink 1.19 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-master/">Flink Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/">Kubernetes Operator 1.8 (latest)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main">Kubernetes Operator Main (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable">CDC 3.0 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-master">CDC Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/">ML 2.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-master">ML Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/">Stateful Functions 3.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-master">Stateful Functions Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">How to Contribute</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/how-to-contribute/overview/">Overview</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/contribute-code/">Contribute Code</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/reviewing-prs/">Review Pull Requests</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/code-style-and-quality-preamble/">Code Style and Quality Guide</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/contribute-documentation/">Contribute Documentation</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/documentation-style-guide/">Documentation Style Guide</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/improve-website/">Contribute to the Website</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/getting-help/">Getting Help</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="/posts/">Flink Blog</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/downloads/">Downloads</a>
</li>
</ul>
<div class="book-search">
<div class="book-search-spinner hidden">
<i class="fa fa-refresh fa-spin"></i>
</div>
<form class="search-bar d-flex" onsubmit="return false;"su>
<input type="text" id="book-search-input" placeholder="Search" aria-label="Search" maxlength="64" data-hotkeys="s/">
<i class="fa fa-search search"></i>
<i class="fa fa-circle-o-notch fa-spin spinner"></i>
</form>
<div class="book-search-spinner hidden"></div>
<ul id="book-search-results"></ul>
</div>
</div>
</div>
</nav>
<div class="navbar-clearfix"></div>
</header>
<main class="flex">
<section class="container book-page">
<article class="markdown">
<h1>
<a href="/2022/01/07/apache-flink-ml-2.0.0-release-announcement/">Apache Flink ML 2.0.0 Release Announcement</a>
</h1>
January 7, 2022 -
Dong Lin
Yun Gao
<p><p>The Apache Flink community is excited to announce the release of Flink ML
2.0.0! Flink ML is a library that provides APIs and infrastructure for building
stream-batch unified machine learning algorithms, that can be easy-to-use and
performant with (near-) real-time latency.</p>
<p>This release involves a major refactor of the earlier Flink ML library and
introduces major features that extend the Flink ML API and the iteration
runtime, such as supporting stages with multi-input multi-output, graph-based
stage composition, and a new stream-batch unified iteration library. Moreover,
we added five algorithm implementations in this release, which is the start of
a long-term initiative to provide a large number of off-the-shelf algorithms in
Flink ML with state-of-the-art performance.</p>
<p>We believe this release is an important step towards extending Apache Flink to
a wide range of machine learning use cases, especially the real-time machine
learning scenarios.</p>
<p>We encourage you to <a href="https://flink.apache.org/downloads.html">download the release</a> and share your feedback with
the community through the Flink <a href="https://flink.apache.org/community.html#mailing-lists">mailing lists</a> or
<a href="https://issues.apache.org/jira/browse/flink">JIRA</a>! We hope you like the new
release and we’d be eager to learn about your experience with it.</p>
<h1 id="notable-features">
Notable Features
<a class="anchor" href="#notable-features">#</a>
</h1>
<h2 id="api-and-infrastructure">
API and Infrastructure
<a class="anchor" href="#api-and-infrastructure">#</a>
</h2>
<h3 id="supporting-stages-requiring-multi-input-multi-output">
Supporting stages requiring multi-input multi-output
<a class="anchor" href="#supporting-stages-requiring-multi-input-multi-output">#</a>
</h3>
<p>Stages in a machine learning workflow might take multiple inputs and return
multiple outputs. For example, a graph embedding algorithm might need to read
two tables, which represent the edge and node of the graph respectively. And a
workflow might need a stage that splits the input dataset into two output
datasets, for training and testing respectively.</p>
<p>With this capability, algorithm developers can assemble a machine learning
workflow as a directed acyclic graph (DAG) of pre-defined stages. And this
workflow can be configured and deployed without users knowing the
implementation details of this graph. This improvement could considerably
expand the applicability and usability of Flink ML.</p>
<h3 id="supporting-online-learning-with-apis-exposing-model-data">
Supporting online learning with APIs exposing model data
<a class="anchor" href="#supporting-online-learning-with-apis-exposing-model-data">#</a>
</h3>
<p>In a native online learning scenario, we have a long-running job that keeps
processing training data and updating a machine learning model. And we could
have multiple jobs deployed in web servers which do online inference. It is
necessary to transmit the latest model data from the training job to those
inference jobs in (near-) real-time latency.</p>
<p>The traditional Estimator/Transformer paradigm does not provide APIs to expose
this model data in a streaming manner. Users have to repeatedly call fit() to
update model data. Although users might be able to update model data once every
few minutes, it is likely very inefficient, if not impossible, to update model
data once every few seconds with this approach.</p>
<p>With
<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=184615783">FLIP-173</a>,
model data can be exposed as an unbounded stream via the getModelData() API.
Then algorithm users can transfer the model data to web servers in real-time
and use the up-to-date model data to do online inference. This feature could
significantly strengthen Flink ML’s capability to support online learning
applications.</p>
<h3 id="improved-usability-for-managing-parameters">
Improved usability for managing parameters
<a class="anchor" href="#improved-usability-for-managing-parameters">#</a>
</h3>
<p>We care a lot about usability and developer velocity in Flink ML. In this
release, we refactored and significantly simplified the experience of defining,
getting and setting parameters for algorithms.</p>
<p>With
<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=181311361">FLIP-174</a>,
parameters can be defined as static variables of an interface, and any
algorithm that implements the interface could inherit these variable
definitions without additional work. Commonly used parameter validators are
provided as part of the infrastructure.</p>
<h3 id="tools-for-composing-dag-of-stages-into-a-new-stage">
Tools for composing DAG of stages into a new stage
<a class="anchor" href="#tools-for-composing-dag-of-stages-into-a-new-stage">#</a>
</h3>
<p>One of the most useful tool in the existing ML libraries (e.g. Scikit-learn,
Flink, Spark) is
<a href="https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html">Pipeline</a>,
which allows users to compose an estimator from an ordered list of estimators
and transformers, without having to explicitly implement the fit/transform for
the estimator/transformer.</p>
<p><a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=181311363">FLIP-175</a>
extended this capability from pipeline to DAG. Users can now compose an
estimator from a DAG of estimator and transformers. This capability of
composition allows developers to slice a complex workflow into simpler modules
and re-use the modules across multiple workflows. We believe this capability
could significantly improve the experience of building and deploying complex
workflows using Flink ML.</p>
<h2 id="stream-batch-unified-iteration-library">
Stream-batch Unified Iteration Library
<a class="anchor" href="#stream-batch-unified-iteration-library">#</a>
</h2>
<p>To support training machine learning algorithms and adjust the model parameters
dynamically based on the prediction result, it is necessary to have native
support for processing data iteratively. It is known that Flink uses DAG to
describe the process logic, thus we need to provide the iteration library on
top of Flink separately. Besides, since we need to support both offline
training and online training / adjustment, the iteration library should support
both streaming and batch cases.</p>
<p><a href="https://cwiki.apache.org/confluence/x/hAEBCw">FLIP-176</a> implements a
stream-batch unified iteration library. It provides the function of
transmitting records back to the precedent operators and the ability to track
the progress of rounds inside the iteration. Users could directly use
DataStream API and Table API to express the execution logic inside the
iteration. Besides, the new iteration library also extends Flink’s
checkpointing mechanism to also support exactly-once failover for jobs using
iterations.</p>
<h2 id="python-sdk">
Python SDK
<a class="anchor" href="#python-sdk">#</a>
</h2>
<p>Nowadays many machine learning practitioners are used to developing machine
learning workflows in Python due to its ease-of-use and excellent ecosystem. To
meet the needs of these users, a Python package dedicated for Flink ML is
created starting from this release. The Python package currently provides APIs
similar to their Java counterparts for developing machine learning algorithms.</p>
<p>Users can install Flink ML Python package through pip using the following
command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pip install apache-flink-ml
</span></span></code></pre></div><p>In the future we will enhance the Python SDK to enable its interoperability
with Flink ML’s Java library, for example, allowing users to express machine
learning workflows in Python, where workflows consist of a mixture of stages
from the Flink ML Java library as well as stages implemented in Python (e.g. a
TensorFlow program).</p>
<h2 id="algorithm-library">
Algorithm Library
<a class="anchor" href="#algorithm-library">#</a>
</h2>
<p>Now that the Flink ML API re-design is done, we started the initiative to add
off-the-shelf algorithms in Flink ML. The release of Flink-ML 2.0.0 is closely
related to project Alink - an Apache Flink ecosystem project open sourced by
Alibaba. The connection between the Flink community and developers of the Alink
project dates back to 2017. The project Alink developers have a significant
contribution in designing the new Flink ML APIs, refactoring, optimizing and
migrating algorithms from Alink to Flink. Our long-term goal is to provide a
library of performant algorithms that are easy to use, debug and customize for
your needs.</p>
<p>We have implemented five algorithms in this release, i.e. logistic regression,
k-means, k-nearest neighbors, naive bayes and one-hot encoder. For now these
algorithms focus on validating the APIs and iteration runtime. In addition to
adding more and more algorithms, we will also stress test and optimize their
performance to make sure these algorithms have state-of-the-art performance.
Stay tuned!</p>
<h1 id="related-work">
Related Work
<a class="anchor" href="#related-work">#</a>
</h1>
<h2 id="flink-ml-project-moved-to-a-separate-repository">
Flink ML project moved to a separate repository
<a class="anchor" href="#flink-ml-project-moved-to-a-separate-repository">#</a>
</h2>
<p>To accelerate the development of Flink ML, the effort has moved to the new
repository <a href="https://github.com/apache/flink-ml">flink-ml</a> under the Flink
project. We here follow a similar approach like the Stateful Functions effort,
where a separate repository has helped to speed up the development by allowing
for more light-weight contribution workflows and separate release cycles.</p>
<h2 id="github-organization-created-for-flink-ecosystem-projects">
Github organization created for Flink ecosystem projects
<a class="anchor" href="#github-organization-created-for-flink-ecosystem-projects">#</a>
</h2>
<p>To facilitate the community collaboration on ecosystem projects that extend the
capability of the Apache Flink, Apache Flink PMC has granted the permission to
use flink-extended as the name of this <a href="https://github.com/flink-extended">GitHub
organization</a>, which provides a neutral
place to host the code of ecosystem projects.</p>
<p>Two Flink ML related projects have been moved to this organization.
<a href="https://github.com/flink-extended/dl-on-flink">dl-on-flink</a> provides the
capability to implement Flink ML stages using TensorFlow. And
<a href="https://github.com/flink-extended/clink">clink</a> is a library that facilitates
the implementation of Flink ML stages using C++ in order to support e.g.
real-time feature engineering.</p>
<p>We hope you can join this effort and share your Flink ecosystem projects in
this Github organization. And stay tuned for more updates on ecosystem
projects.</p>
<h1 id="upgrade-notes">
Upgrade Notes
<a class="anchor" href="#upgrade-notes">#</a>
</h1>
<p>Please review this note for a list of adjustments to make and issues to check
if you plan to upgrade to Flink ML 2.0.0.</p>
<p>This note discusses any critical information about incompatibilities and
breaking changes, performance changes, and any other changes that might impact
your production deployment of Flink ML.</p>
<ul>
<li>
<p><strong>Module names are changed</strong>.</p>
<p>We have replaced the <code>flink-ml-api</code> module with the <code>flink-ml-core_2.12</code>
module.</p>
<p>For users who have a dependency on <code>flink-ml-api</code>, please replace it with
<code>flink-ml-core_2.12</code></p>
</li>
<li>
<p><strong>PipelineStage and its subclasses are changed</strong>.</p>
<p><a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=184615783">FLIP-173</a>
made major changes to PipelineStage and its subclasses. Changes include class
rename, method signature change, method removal etc.</p>
<p>Users who use PipelineStage and its subclasses should use the new APIs
introduced in FLIP-173.</p>
</li>
<li>
<p><strong>Param-related classes are changed</strong>.</p>
<p><a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=181311361">FLIP-174</a>
made major changes to the param-related classes. Changes include class rename,
method signature change, method removal etc.</p>
<p>Users who use classes such as Params and WithParams should use the new APIs
introduced in FLIP-174.</p>
</li>
<li>
<p><strong>Flink dependency is changed from 1.12 to 1.14</strong>.</p>
<p>This change introduces all the breaking changes listed in the Flink 1.14
<a href="https://nightlies.apache.org/flink/flink-docs-release-1.14/release-notes/flink-1.14">release notes</a>.
One major change is that the DataSet API is not supported anymore.</p>
<p>Users who use DataSet::iterate should switch to using the datastream-based
iteration API introduced in <a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=184615300">FLIP-176</a>.</p>
</li>
</ul>
<h1 id="release-notes-and-resources">
Release Notes and Resources
<a class="anchor" href="#release-notes-and-resources">#</a>
</h1>
<p>Please take a look at the <a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315522&amp;version=12351079">release notes</a>
for a detailed list of changes and new features.</p>
<p>The binary distribution and source artifacts are now available on the updated
<a href="https://flink.apache.org/downloads.html">Downloads page</a> of the Flink website,
and the most recent distribution of Flink ML Python package is available on
<a href="https://pypi.org/project/apache-flink-ml">PyPI</a>.</p>
<h1 id="list-of-contributors">
List of Contributors
<a class="anchor" href="#list-of-contributors">#</a>
</h1>
<p>The Apache Flink community would like to thank each one of the contributors
that have made this release possible:</p>
<p>Yun Gao, Dong Lin, Zhipeng Zhang, huangxingbo, Yunfeng Zhou, Jiangjie (Becket)
Qin, weibo, abdelrahman-ik.</p>
</p>
</article>
<div class="edit-this-page">
<p>
<a href="https://cwiki.apache.org/confluence/display/FLINK/Flink+Translation+Specifications">Want to contribute translation?</a>
</p>
<p>
<a href="//github.com/apache/flink-web/edit/asf-site/docs/content/posts/2022-01-07-release-ml-2.0.0.md">
Edit This Page<i class="fa fa-edit fa-fw"></i>
</a>
</p>
</div>
</section>
<aside class="book-toc">
<nav id="TableOfContents"><h3>On This Page <a href="javascript:void(0)" class="toc" onclick="collapseToc()"><i class="fa fa-times" aria-hidden="true"></i></a></h3>
<ul>
<li><a href="#notable-features">Notable Features</a>
<ul>
<li><a href="#api-and-infrastructure">API and Infrastructure</a>
<ul>
<li><a href="#supporting-stages-requiring-multi-input-multi-output">Supporting stages requiring multi-input multi-output</a></li>
<li><a href="#supporting-online-learning-with-apis-exposing-model-data">Supporting online learning with APIs exposing model data</a></li>
<li><a href="#improved-usability-for-managing-parameters">Improved usability for managing parameters</a></li>
<li><a href="#tools-for-composing-dag-of-stages-into-a-new-stage">Tools for composing DAG of stages into a new stage</a></li>
</ul>
</li>
<li><a href="#stream-batch-unified-iteration-library">Stream-batch Unified Iteration Library</a></li>
<li><a href="#python-sdk">Python SDK</a></li>
<li><a href="#algorithm-library">Algorithm Library</a></li>
</ul>
</li>
<li><a href="#related-work">Related Work</a>
<ul>
<li><a href="#flink-ml-project-moved-to-a-separate-repository">Flink ML project moved to a separate repository</a></li>
<li><a href="#github-organization-created-for-flink-ecosystem-projects">Github organization created for Flink ecosystem projects</a></li>
</ul>
</li>
<li><a href="#upgrade-notes">Upgrade Notes</a></li>
<li><a href="#release-notes-and-resources">Release Notes and Resources</a></li>
<li><a href="#list-of-contributors">List of Contributors</a></li>
</ul>
</nav>
</aside>
<aside class="expand-toc hidden">
<a class="toc" onclick="expandToc()" href="javascript:void(0)">
<i class="fa fa-bars" aria-hidden="true"></i>
</a>
</aside>
</main>
<footer>
<div class="separator"></div>
<div class="panels">
<div class="wrapper">
<div class="panel">
<ul>
<li>
<a href="https://flink-packages.org/">flink-packages.org</a>
</li>
<li>
<a href="https://www.apache.org/">Apache Software Foundation</a>
</li>
<li>
<a href="https://www.apache.org/licenses/">License</a>
</li>
<li>
<a href="/zh/">
<i class="fa fa-globe" aria-hidden="true"></i>&nbsp;中文版
</a>
</li>
</ul>
</div>
<div class="panel">
<ul>
<li>
<a href="/what-is-flink/security">Security</a-->
</li>
<li>
<a href="https://www.apache.org/foundation/sponsorship.html">Donate</a>
</li>
<li>
<a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
</ul>
</div>
<div class="panel icons">
<div>
<a href="/posts">
<div class="icon flink-blog-icon"></div>
<span>Flink blog</span>
</a>
</div>
<div>
<a href="https://github.com/apache/flink">
<div class="icon flink-github-icon"></div>
<span>Github</span>
</a>
</div>
<div>
<a href="https://twitter.com/apacheflink">
<div class="icon flink-twitter-icon"></div>
<span>Twitter</span>
</a>
</div>
</div>
</div>
</div>
<hr/>
<div class="container disclaimer">
<p>The contents of this website are © 2024 Apache Software Foundation under the terms of the Apache License v2. Apache Flink, Flink, and the Flink logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.</p>
</div>
</footer>
</body>
</html>