blob: e01c568ddc87e93c7cd08081d90288ebc2e2ad77 [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/05/06/improvements-to-flink-operations-snapshots-ownership-and-savepoint-formats/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Flink has become a well established data streaming engine and a mature project requires some shifting of priorities from thinking purely about new features towards improving stability and operational simplicity. In the last couple of releases, the Flink community has tried to address some known friction points, which includes improvements to the snapshotting process. Snapshotting takes a global, consistent image of the state of a Flink job and is integral to fault-tolerance and exacty-once processing.">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Improvements to Flink operations: Snapshots Ownership and Savepoint Formats" />
<meta property="og:description" content="Flink has become a well established data streaming engine and a mature project requires some shifting of priorities from thinking purely about new features towards improving stability and operational simplicity. In the last couple of releases, the Flink community has tried to address some known friction points, which includes improvements to the snapshotting process. Snapshotting takes a global, consistent image of the state of a Flink job and is integral to fault-tolerance and exacty-once processing." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://flink.apache.org/2022/05/06/improvements-to-flink-operations-snapshots-ownership-and-savepoint-formats/" /><meta property="article:section" content="posts" />
<meta property="article:published_time" content="2022-05-06T00:00:00+00:00" />
<meta property="article:modified_time" content="2022-05-06T00:00:00+00:00" />
<title>Improvements to Flink operations: Snapshots Ownership and Savepoint Formats | 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/05/06/improvements-to-flink-operations-snapshots-ownership-and-savepoint-formats/">Improvements to Flink operations: Snapshots Ownership and Savepoint Formats</a>
</h1>
May 6, 2022 -
Dawid Wysakowicz
<a href="https://twitter.com/dwysakowicz">(@dwysakowicz)</a>
Daisy Tsang
<p><p>Flink has become a well established data streaming engine and a
mature project requires some shifting of priorities from thinking purely about new features
towards improving stability and operational simplicity. In the last couple of releases, the Flink community has tried to address
some known friction points, which includes improvements to the
snapshotting process. Snapshotting takes a global, consistent image of the state of a Flink job and is integral to fault-tolerance and exacty-once processing. Snapshots include savepoints and checkpoints.</p>
<p>This post will outline the journey of improving snapshotting in past releases and the upcoming improvements in Flink 1.15, which includes making it possible to take savepoints in the native state backend specific format as well as clarifying snapshots ownership.</p>
<h1 id="past-improvements-to-the-snapshotting-process">
Past improvements to the snapshotting process
<a class="anchor" href="#past-improvements-to-the-snapshotting-process">#</a>
</h1>
<p>Flink 1.13 was the first release where we announced <a href="//nightlies.apache.org/flink/flink-docs-release-1.15/docs/concepts/stateful-stream-processing/#unaligned-checkpointing">unaligned checkpoints</a> to be production-ready. We
encouraged people to use them if their jobs are backpressured to a point where it causes issues for
checkpoints. We also <a href="/news/2021/05/03/release-1.13.0.html#switching-state-backend-with-savepoints">unified the binary format of savepoints</a> across all
different state backends, which enables stateful switching of savepoints.</p>
<p>Flink 1.14 also brought additional improvements. As an alternative and as a complement
to unaligned checkpoints, we introduced a feature called <a href="/news/2021/09/29/release-1.14.0.html#buffer-debloating">&ldquo;buffer debloating&rdquo;</a>. This is built
around the concept of automatically adjusting the amount of in-flight data that needs to be aligned
while snapshotting. We also fixed another long-standing problem and made it
possible to <a href="/news/2021/09/29/release-1.14.0.html#checkpointing-and-bounded-streams">continue checkpointing even if there are finished tasks</a> in a JobGraph.</p>
<h1 id="new-improvements-to-the-snapshotting-process">
New improvements to the snapshotting process
<a class="anchor" href="#new-improvements-to-the-snapshotting-process">#</a>
</h1>
<p>You can expect more improvements in Flink 1.15! We continue to be invested in making it easy
to operate Flink clusters and have tackled the following problems. :)</p>
<p>Savepoints can be expensive
to take and restore from if taken for a very large state stored in the RocksDB state backend. In
order to circumvent this issue, we have seen users leveraging the externalized incremental checkpoints
instead of savepoints in order to benefit from the native RocksDB format. However, checkpoints and savepoints
serve different operational purposes. Thus, we now made it possible to take savepoints in the
native state backend specific format, while still maintaining some characteristics of savepoints (i.e. making them relocatable).</p>
<p>Another issue reported with externalized checkpoints is that it is not clear who owns the
checkpoint files (Flink or the user?). This is especially problematic when it comes to incremental RocksDB checkpoints
where you can easily end up in a situation where you do not know which checkpoints depend on which files
which makes it tough to clean those files up. To solve this issue, we added explicit restore
modes (CLAIM, NO_CLAIM, and LEGACY) which clearly define whether Flink should take
care of cleaning up the snapshots or whether it should remain the user&rsquo;s responsibility.
.</p>
<h2 id="the-new-restore-modes">
The new restore modes
<a class="anchor" href="#the-new-restore-modes">#</a>
</h2>
<p>The <code>Restore Mode</code> determines who takes ownership of the files that make up savepoints or
externalized checkpoints after they are restored. Snapshots, which are either checkpoints or savepoints
in this context, can be owned either by a user or Flink itself. If a snapshot is owned by a user,
Flink will not delete its files and will not depend on the existence
of such files since it might be deleted outside of Flink&rsquo;s control.</p>
<p>The restore modes are <code>CLAIM</code>, <code>NO_CLAIM</code>, and <code>LEGACY</code> (for backwards compatibility). You can pass the restore mode like this:</p>
<pre tabindex="0"><code>$ bin/flink run -s :savepointPath -restoreMode :mode -n [:runArgs]
</code></pre><p>While each restore mode serves a specific purpose, we believe the default <em>NO_CLAIM</em> mode is a good
tradeoff in most situations, as it provides clear ownership with a small price for the first
checkpoint after the restore.</p>
<p>Let&rsquo;s dig further into each of the modes.</p>
<h3 id="legacy-mode">
LEGACY mode
<a class="anchor" href="#legacy-mode">#</a>
</h3>
<p>The legacy mode is how Flink dealt with snapshots until version 1.15. In this mode, Flink will never delete the initial
checkpoint. Unfortunately, at the same time, it is not clear if a user can ever delete it as well.
The problem here is that Flink might immediately build an incremental checkpoint on top of the
restored one. Therefore, subsequent checkpoints depend on the restored checkpoint. Overall, the
ownership is not well defined in this mode.</p>
<div style="text-align: center">
<img src="/img/blog/2022-05-06-restore-modes/restore-mode-legacy.svg" alt="LEGACY restore mode" width="70%">
</div>
<h3 id="no_claim-default-mode">
NO_CLAIM (default) mode
<a class="anchor" href="#no_claim-default-mode">#</a>
</h3>
<p>To fix the issue of files that no one can reliably claim ownership of, we introduced the <code>NO_CLAIM</code>
mode as the new default. In this mode, Flink will not assume ownership of the snapshot and will leave the files in
the user&rsquo;s control and never delete any of the files. You can start multiple jobs from the
same snapshot in this mode.</p>
<p>In order to make sure Flink does not depend on any of the files from that snapshot, it will force
the first (successful) checkpoint to be a full checkpoint as opposed to an incremental one. This
only makes a difference for <code>state.backend: rocksdb</code>, because all other state backends always take
full checkpoints.</p>
<p>Once the first full checkpoint completes, all subsequent checkpoints will be taken as
usual/configured. Consequently, once a checkpoint succeeds, you can manually delete the original
snapshot. You can not do this earlier, because without any completed checkpoints, Flink will - upon
failure - try to recover from the initial snapshot.</p>
<div style="text-align: center">
<img src="/img/blog/2022-05-06-restore-modes/restore-mode-no_claim.svg" alt="NO_CLAIM restore mode" width="70%" >
</div>
<h3 id="claim-mode">
CLAIM mode
<a class="anchor" href="#claim-mode">#</a>
</h3>
<p>If you do not want to sacrifice any performance while taking the first checkpoint, we suggest
looking into the <code>CLAIM</code> mode. In this mode, Flink claims ownership of the snapshot
and essentially treats it like a checkpoint: it controls the lifecycle and might delete it if it is
not needed for recovery anymore. Hence, it is not safe to manually delete the snapshot or to start
two jobs from the same snapshot. Flink keeps around a configured number of checkpoints.</p>
<div style="text-align: center">
<img src="/img/blog/2022-05-06-restore-modes/restore-mode-claim.svg" alt="CLAIM restore mode" width="70%">
</div>
<h2 id="savepoint-format">
Savepoint format
<a class="anchor" href="#savepoint-format">#</a>
</h2>
<p>You can now trigger savepoints in the native format of state backends.
This has been introduced to match two characteristics, one of both savepoints and
checkpoints:</p>
<ul>
<li>self-contained, relocatable, and owned by users</li>
<li>lightweight (and thus fast to take and recover from)</li>
</ul>
<p>In order to provide the two features in a single concept, we provided a way for Flink to create a
savepoint in a (native) binary format of the used state backend. This brings a significant difference
especially in combination with the <code>state.backend: rocksdb</code> setting and incremental snapshots.</p>
<p>That state backend can leverage RocksDB native on-disk data structures which are usually referred to
as SST files. Incremental checkpoints leveraged those files and are
collections of those SST files with some additional metadata, which can be quickly reloaded
into the working directory of RocksDB upon restore.</p>
<p>Native savepoints can use the same mechanism of uploading the SST files instead of dumping the
entire state into a canonical Flink format. There is one additional benefit over simply using the
externalized incremental checkpoints: native savepoints are still relocatable and self-contained
in a single directory. In case of checkpoints that do not hold, because a single SST file can be
used by multiple checkpoints, and thus is put into a common shared directory. That is why they are
called incremental.</p>
<p>You can choose the savepoint format when triggering the savepoint like this:</p>
<pre tabindex="0"><code># take an intermediate savepoint
$ bin/flink savepoint --type [native/canonical] :jobId [:targetDirectory]
# stop the job with a savepoint
$ bin/flink stop --type [native/canonical] --savepointPath [:targetDirectory] :jobId
</code></pre><h3 id="capabilities-and-limitations">
Capabilities and limitations
<a class="anchor" href="#capabilities-and-limitations">#</a>
</h3>
<p>Unfortunately it is not possible to provide the same guarantees for all types of snapshots
(canonical or native savepoints and aligned or unaligned checkpoints). The main difference between
checkpoints and savepoints is that savepoints are still triggered and owned by users. Flink does not
create them automatically nor ever depends on their existence. Their main purpose is still for planned,
manual backups, whereas checkpoints are used for recovery. In database terms, savepoints are similar
to backups, whereas checkpoints are like recovery logs.</p>
<p>Having additional dimensions of properties in each of the two main snapshots category does not make
it easier, therefore we try to list what you can achieve with every type of snapshot.</p>
<p>The following table gives an overview of capabilities and limitations for the various types of
savepoints and checkpoints.</p>
<ul>
<li>✓ - Flink fully supports this type of snapshot</li>
<li>x - Flink doesn&rsquo;t support this type of snapshot</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align:left">Operation</th>
<th style="text-align:left">Canonical Savepoint</th>
<th style="text-align:left">Native Savepoint</th>
<th style="text-align:left">Aligned Checkpoint</th>
<th style="text-align:left">Unaligned Checkpoint</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">State backend change</td>
<td style="text-align:left"></td>
<td style="text-align:left">x</td>
<td style="text-align:left">x</td>
<td style="text-align:left">x</td>
</tr>
<tr>
<td style="text-align:left">State Processor API(writing)</td>
<td style="text-align:left"></td>
<td style="text-align:left">x</td>
<td style="text-align:left">x</td>
<td style="text-align:left">x</td>
</tr>
<tr>
<td style="text-align:left">State Processor API(reading)</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left">x</td>
</tr>
<tr>
<td style="text-align:left">Self-contained and relocatable</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left">x</td>
<td style="text-align:left">x</td>
</tr>
<tr>
<td style="text-align:left">Schema evolution</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Arbitrary job upgrade</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left">x</td>
</tr>
<tr>
<td style="text-align:left">Non-arbitrary job upgrade</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left">x</td>
</tr>
<tr>
<td style="text-align:left">Flink minor version upgrade</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left">x</td>
</tr>
<tr>
<td style="text-align:left">Flink bug/patch version upgrade</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">Rescaling</td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
<td style="text-align:left"></td>
</tr>
</tbody>
</table>
<ul>
<li>State backend change - you can restore from the snapshot with a different state.backend than the
one for which the snapshot was taken</li>
<li>State Processor API (writing) - The ability to create new snapshot via State Processor API.</li>
<li>State Processor API (reading) - The ability to read state from the existing snapshot via State
Processor API.</li>
<li>Self-contained and relocatable - One snapshot directory contains everything it needs for recovery.
You can move the directory around.</li>
<li>Schema evolution - Changing the data type of the <em>state</em> in your UDFs.</li>
<li>Arbitrary job upgrade - Restoring the snapshot with the different partitioning type(rescale,
rebalance, map, etc.)
or with a different record type for the existing operator. In other words you can add arbitrary
operators anywhere in your job graph.</li>
<li>Non-arbitrary job upgrade - In contrary to the above, you still should be able to add new
operators, but certain limitations apply. You can not change partitioning for existing operators
or the data type of records being exchanged.</li>
<li>Flink minor version upgrade - Restoring a snapshot which was taken for an older minor version of
Flink (1.x → 1.y).</li>
<li>Flink bug/patch version upgrade - Restoring a snapshot which was taken for an older patch version
of Flink (1.14.x → 1.14.y).</li>
<li>Rescaling - Restoring the snapshot with a different parallelism than was used during the snapshot
creation.</li>
</ul>
<h1 id="summary">
Summary
<a class="anchor" href="#summary">#</a>
</h1>
<p>We hope the changes we introduced over the last releases make it easier to operate Flink in respect
to snapshotting. We are eager to hear from you if any of the new features have helped you solve problems you&rsquo;ve faced in the past.
At the same time, if you still struggle with an issue or you had to work around some obstacles, please let
us know! Maybe we will be able to incorporate your approach or find a different solution together.</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-05-06-restore-modes.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="#past-improvements-to-the-snapshotting-process">Past improvements to the snapshotting process</a></li>
<li><a href="#new-improvements-to-the-snapshotting-process">New improvements to the snapshotting process</a>
<ul>
<li><a href="#the-new-restore-modes">The new restore modes</a>
<ul>
<li><a href="#legacy-mode">LEGACY mode</a></li>
<li><a href="#no_claim-default-mode">NO_CLAIM (default) mode</a></li>
<li><a href="#claim-mode">CLAIM mode</a></li>
</ul>
</li>
<li><a href="#savepoint-format">Savepoint format</a>
<ul>
<li><a href="#capabilities-and-limitations">Capabilities and limitations</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#summary">Summary</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>