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

roman pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/flink-web.git

commit 2dfbcdabe0725039648bf5589a8b292b54d9333e
Author: Roman Khachatryan <[email protected]>
AuthorDate: Mon May 30 20:16:58 2022 +0200

    Rebuild website
---
 content/2022/05/30/changelog-state-backend.html    | 642 ++++++++++++++++++
 content/blog/feed.xml                              | 748 ++++++++++-----------
 content/blog/index.html                            |  36 +-
 content/blog/page10/index.html                     |  41 +-
 content/blog/page11/index.html                     |  39 +-
 content/blog/page12/index.html                     |  38 +-
 content/blog/page13/index.html                     |  40 +-
 content/blog/page14/index.html                     |  40 +-
 content/blog/page15/index.html                     |  40 +-
 content/blog/page16/index.html                     |  40 +-
 content/blog/page17/index.html                     |  43 +-
 content/blog/page18/index.html                     |  43 +-
 content/blog/page19/index.html                     |  25 +
 content/blog/page2/index.html                      |  36 +-
 content/blog/page3/index.html                      |  38 +-
 content/blog/page4/index.html                      |  38 +-
 content/blog/page5/index.html                      |  36 +-
 content/blog/page6/index.html                      |  36 +-
 content/blog/page7/index.html                      |  36 +-
 content/blog/page8/index.html                      |  36 +-
 content/blog/page9/index.html                      |  38 +-
 .../changelog-simple.png                           | Bin 0 -> 91196 bytes
 .../checkpoint-timing.png                          | Bin 0 -> 14324 bytes
 .../failing-task.png                               | Bin 0 -> 52639 bytes
 .../log_checkpoints_1.png                          | Bin 0 -> 41532 bytes
 .../log_checkpoints_2.png                          | Bin 0 -> 31553 bytes
 .../log_checkpoints_3.png                          | Bin 0 -> 27329 bytes
 content/index.html                                 |   6 +-
 content/zh/index.html                              |   6 +-
 29 files changed, 1483 insertions(+), 638 deletions(-)

diff --git a/content/2022/05/30/changelog-state-backend.html 
b/content/2022/05/30/changelog-state-backend.html
new file mode 100644
index 000000000..3a226f9ce
--- /dev/null
+++ b/content/2022/05/30/changelog-state-backend.html
@@ -0,0 +1,642 @@
+<!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: Improving speed and stability of checkpointing with 
generic log-based incremental checkpoints</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="/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]-->
+    <!-- Matomo -->
+    <script>
+      var _paq = window._paq = window._paq || [];
+      /* tracker methods like "setCustomDimension" should be called before 
"trackPageView" */
+      /* We explicitly disable cookie tracking to avoid privacy issues */
+      _paq.push(['disableCookies']);
+      /* Measure a visit to flink.apache.org and nightlies.apache.org/flink as 
the same visit */
+      _paq.push(["setDomains", 
["*.flink.apache.org","*.nightlies.apache.org/flink"]]);
+      _paq.push(['trackPageView']);
+      _paq.push(['enableLinkTracking']);
+      (function() {
+        var u="//matomo.privacy.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>
+    <!-- End Matomo Code -->
+  </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>
+
+            
+
+            <!-- Stateful Functions? -->
+
+            <li><a 
href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/";>What is 
Stateful Functions?</a></li>
+
+            <!-- Flink ML? -->
+
+            <li><a 
href="https://nightlies.apache.org/flink/flink-ml-docs-stable/";>What is Flink 
ML?</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://nightlies.apache.org/flink/flink-docs-release-1.15//docs/try-flink/local_installation/";
 target="_blank">With Flink <small><span class="glyphicon 
glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-statefun-docs-release-3.2/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="https://nightlies.apache.org/flink/flink-ml-docs-release-2.0/try-flink-ml/quick-start.html";
 target="_blank">With Flink ML <small><span class="glyphicon 
glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-0.1/try-flink-kubernetes-operator/quick-start.html";
 target="_blank">With Flink Kubernetes Operator <small><span class="glyphicon 
glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-table-store-docs-release-0.1/try-table-store/quick-start.html";
 target="_blank">With Flink Table Store <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://nightlies.apache.org/flink/flink-docs-release-1.15"; 
target="_blank">Flink 1.15 (Latest stable release) <small><span 
class="glyphicon glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/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://nightlies.apache.org/flink/flink-statefun-docs-release-3.2"; 
target="_blank">Flink Stateful Functions 3.2 (Latest stable release) 
<small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-statefun-docs-master"; 
target="_blank">Flink Stateful Functions Master (Latest Snapshot) <small><span 
class="glyphicon glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-ml-docs-release-2.0"; 
target="_blank">Flink ML 2.0 (Latest stable release) <small><span 
class="glyphicon glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-ml-docs-master"; 
target="_blank">Flink ML Master (Latest Snapshot) <small><span class="glyphicon 
glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-0.1";
 target="_blank">Flink Kubernetes Operator 0.1 (Latest stable release) 
<small><span class="glyphicon glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main"; 
target="_blank">Flink Kubernetes Operator Main (Latest Snapshot) <small><span 
class="glyphicon glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-table-store-docs-release-0.1"; 
target="_blank">Flink Table Store 0.1 (Latest stable release) <small><span 
class="glyphicon glyphicon-new-window"></span></small></a></li>
+                <li><a 
href="https://nightlies.apache.org/flink/flink-table-store-docs-master"; 
target="_blank">Flink Table Store 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><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>
+              
+                
+                  <a href="/zh/2022/05/30/changelog-state-backend.html">中文版</a>
+                
+              
+            </li>
+
+          </ul>
+
+          <style>
+            .smalllinks:link {
+              display: inline-block !important; background: none; padding-top: 
0px; padding-bottom: 0px; padding-right: 0px; min-width: 75px;
+            }
+          </style>
+
+          <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>
+
+            <li >
+                  <a href="/security.html">Flink Security</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>
+
+              <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>Improving speed and stability of checkpointing with generic 
log-based incremental checkpoints</h1>
+      <p><i></i></p>
+
+      <article>
+        <p>30 May 2022 Roman Khachatryan  &amp; Yuan Mei </p>
+
+<h1 id="introduction">Introduction</h1>
+
+<p>One of the most important characteristics of stream processing systems is 
end-to-end latency, i.e. the time it takes for the results of processing an 
input record to reach the outputs. In the case of Flink, end-to-end latency 
mostly depends on the checkpointing mechanism, because processing results 
should only become visible after the state of the stream is persisted to 
non-volatile storage (this is assuming exactly-once mode; in other modes, 
results can be published immediately).</p>
+
+<p>Furthermore, сheckpoint duration also defines the reasonable interval with 
which checkpoints are made. A shorter interval provides the following 
advantages:</p>
+
+<ul>
+  <li>Lower latency for transactional sinks: Transactional sinks commit on 
checkpoints, so faster checkpoints mean more frequent commits.</li>
+  <li>More predictable checkpoint intervals: Currently, the duration of a 
checkpoint depends on the size of the artifacts that need to be persisted in 
the checkpoint storage.</li>
+  <li>Less work on recovery. The more frequently the checkpoint, the fewer 
events need to be re-processed after recovery.</li>
+</ul>
+
+<p>Following are the main factors affecting checkpoint duration in Flink:</p>
+
+<ol>
+  <li>Barrier travel time and alignment duration</li>
+  <li>Time to take state snapshot and persist it onto the durable 
highly-available storage (such as S3)</li>
+</ol>
+
+<p>Recent improvements such as <a 
href="https://flink.apache.org/2020/10/15/from-aligned-to-unaligned-checkpoints-part-1.html";>Unaligned
 checkpoints</a> and <a 
href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-183%3A+Dynamic+buffer+size+adjustment";>
 Buffer debloating </a> try to address (1), especially in the presence of 
back-pressure. Previously, <a 
href="https://flink.apache.org/features/2018/01/30/incremental-checkpointing.html";>
 Incremental checkpoints </a> were introduced [...]
+
+<p>However, there are still some cases when this duration is high</p>
+
+<h3 
id="every-checkpoint-is-delayed-by-at-least-one-task-with-high-parallelism">Every
 checkpoint is delayed by at least one task with high parallelism</h3>
+
+<center>
+<img src="/img/blog/2022-05-30-changelog-state-backend/failing-task.png" />
+<br />
+</center>
+<p><br /></p>
+
+<p>With the existing incremental checkpoint implementation of the RocksDB 
state backend, every subtask needs to periodically perform some form of 
compaction. That compaction results in new, relatively big files, which in turn 
increase the upload time (2). The probability of at least one node performing 
such compaction and thus slowing down the whole checkpoint grows proportionally 
to the number of nodes. In large deployments, almost every checkpoint becomes 
delayed by some node.</p>
+
+<h3 id="unnecessary-delay-before-uploading-state-snapshot">Unnecessary delay 
before uploading state snapshot</h3>
+
+<center>
+<img src="/img/blog/2022-05-30-changelog-state-backend/checkpoint-timing.png" 
/>
+<br />
+</center>
+<p><br /></p>
+
+<p>State backends don’t start any snapshotting work until the task receives at 
least one checkpoint barrier, increasing the effective checkpoint duration. 
This is suboptimal if the upload time is comparable to the checkpoint interval; 
instead, a snapshot could be uploaded continuously throughout the interval.</p>
+
+<p>This work discusses the mechanism introduced in Flink 1.15 to address the 
above cases by continuously persisting state changes on non-volatile storage 
while performing materialization in the background. The basic idea is described 
in the following section, and then important implementation details are 
highlighted. Subsequent sections discuss benchmarking results, limitations, and 
future work.</p>
+
+<h1 id="high-level-overview">High-level Overview</h1>
+
+<p>The core idea is to introduce a state changelog (a log that records state 
changes); this changelog allows operators to persist state changes in a very 
fine-grained manner, as described below:</p>
+
+<ul>
+  <li>Stateful operators write the state changes to the state changelog, in 
addition to applying them to the state tables in RocksDB or the in-mem 
Hashtable.</li>
+  <li>An operator can acknowledge a checkpoint as soon as the changes in the 
log have reached the durable checkpoint storage.</li>
+  <li>The state tables are persisted periodically as well, independent of the 
checkpoints. We call this procedure the materialization of the state on the 
durable checkpoint storage.</li>
+  <li>Once the state is materialized on the checkpoint storage, the state 
changelog can be truncated to the point where the state is materialized.</li>
+</ul>
+
+<p>This can be illustrated as follows:</p>
+
+<center>
+    <div style="overflow-x: auto">
+        <div style="width:150%">
+            <img style="display:inline; max-width: 33%; max-height: 200px; 
margin-left: -1%" 
src="/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_1.png" /> 
+            <img style="display:inline; max-width: 33%; max-height: 200px; 
margin-left: -1%" 
src="/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_2.png" /> 
+            <img style="display:inline; max-width: 33%; max-height: 200px; 
margin-left: -1%" 
src="/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_3.png" /> 
+        </div>
+    </div>
+
+    <br />
+</center>
+<p><br /></p>
+
+<p>This approach mirrors what database systems do, adjusted to distributed 
checkpoints:</p>
+
+<ul>
+  <li>Changes (inserts/updates/deletes) are written to the transaction log, 
and the transaction is considered durable once the log is synced to disk (or 
other durable storage).</li>
+  <li>The changes are also materialized in the tables (so the database system 
can efficiently query the table). The tables are usually persisted 
asynchronously.</li>
+</ul>
+
+<p>Once all relevant parts of the changed tables have been persisted, the 
transaction log can be truncated, which is similar to the materialization 
procedure in our approach.</p>
+
+<p>Such a design makes a number of trade-offs:</p>
+
+<ol>
+  <li>Increased use of network IO and remote storage space for changelog</li>
+  <li>Increased memory usage to buffer state changes</li>
+  <li>Increased time to replay state changes during the recovery process</li>
+</ol>
+
+<p>The last one, may or may not be compensated by more frequent checkpoints. 
More frequent checkpoints mean less re-processing is needed after recovery.</p>
+
+<h1 id="system-architecture">System architecture</h1>
+
+<h2 id="changelog-storage-dstl">Changelog storage (DSTL)</h2>
+
+<p>The component that is responsible for actually storing state changes has 
the following requirements.</p>
+
+<h3 id="durability">Durability</h3>
+<p>Changelog constitutes a part of a checkpoint, and therefore the same 
durability guarantees as for checkpoints must be provided. However, the 
duration for which the changelog is stored is expected to be short (until the 
changes are materialized).</p>
+
+<h3 id="workload">Workload</h3>
+<p>The workload is write-heavy: changelog is written continuously, and it is 
only read in case of failure. Once written, data can not be modified.</p>
+
+<h3 id="latency">Latency</h3>
+<p>We target checkpoint duration of 1s in the Flink 1.15 MVP for 99% of 
checkpoints. Therefore, an individual write request must complete within that 
duration or less (if parallelism is 100, then 99.99% of write requests must 
complete within 1s).</p>
+
+<h3 id="consistency">Consistency</h3>
+<p>Once a change is persisted (and acknowledged to JM), it must be available 
for replay to enable recovery (this can be achieved by using a single machine, 
quorum, or synchronous replication).</p>
+
+<h3 id="concurrency">Concurrency</h3>
+
+<p>Each task writes to its own changelog, which prevents concurrency issues 
across multiple tasks. However, when a task is restarted, it needs to write to 
the same log, which may cause concurrency issues. This is addressed by:</p>
+
+<ol>
+  <li>Using unique log segment identifiers while writing</li>
+  <li>Fencing previous execution attempts on JM when handling checkpoint 
acknowledgments</li>
+  <li>After closing the log, treating it as Flink state, which is read-only 
and is discarded by a single JM (leader)</li>
+</ol>
+
+<p>To emphasize the difference in durability requirements and usage compared 
to other systems (durable, short-lived, append-only), the component is called 
<strong>“Durable Short-term Log” (DSTL)</strong>.</p>
+
+<p>DSTL can be implemented in many ways, such as Distributed Log, Distributed 
File System* (DFS), or even a database. In the MVP version in Flink 1.15, we 
chose DFS because of the following reasons:</p>
+
+<ol>
+  <li>No additional external dependency; DFS is readily available in most 
environments and is already used to store checkpoints</li>
+  <li>No additional stateful components to manage; using any other persistence 
medium would incur additional operational overhead</li>
+  <li>DFS natively provides durability and consistency guarantees which need 
to be taken care of when implementing a new customized distributed log storage 
(in particular, when implementing replication)</li>
+</ol>
+
+<p>On the other hand, the DFS approach has the following disadvantages:</p>
+
+<ol>
+  <li>has higher latency than for example Distributed Log writing to the local 
disks</li>
+  <li>its scalability is limited by DFS (most Storage Providers start 
rate-limiting at some point)</li>
+</ol>
+
+<p>However, after some initial experimentation, we think the performance of 
popular DFS could satisfy 80% of the use cases, and more results will be 
illustrated with the MVP version in a later section.
+DFS here makes no distinction between DFS and object stores.</p>
+
+<p>Using RocksDB as an example, this approach can be illustrated at the high 
level as follows. State updates are replicated to both RocksDB and DSTL by the 
Changelog State Backend. 
+DSTL continuously writes state changes to DFS and flushes them periodically 
and on checkpoint. That way, checkpoint time only depends on the time to flush 
a small amount of data. 
+RocksDB on the other hand is still used for querying the state. Furthermore, 
its SSTables are periodically uploaded to DFS, which is called 
“materialization”. That upload is independent of and is much less frequent than 
checkpointing procedure, with 10 minutes as the default interval.</p>
+
+<center>
+<img style="max-width: 80%" 
src="/img/blog/2022-05-30-changelog-state-backend/changelog-simple.png" />
+<br />
+</center>
+<p><br /></p>
+
+<p>There are a few more issues worth highlighting here:</p>
+
+<h2 id="state-cleanup">State cleanup</h2>
+<p>State changelog needs to be truncated once the corresponding changes are 
materialized. It becomes more complicated with re-scaling and sharing the 
underlying files across multiple operators. However, Flink already provides a 
mechanism called <code>SharedStateRegistry</code> similar to file system 
reference counting. Log fragments can be viewed as shared state objects, and 
therefore can be tracked by this <code>SharedStateRegistry</code> (please see 
<a href="https://www.ververica.com/b [...]
+
+<h2 id="dfs-specific-issues">DFS-specific issues</h2>
+
+<h3 id="small-files-problem">Small files problem</h3>
+<p>One issue with using DFS is that much more and likely smaller files are 
created for each checkpoint. And with the increased checkpoint frequency, there 
are more checkpoints.
+To mitigate this, state changes related to the same job on a TM are grouped 
into a single file.</p>
+
+<h3 id="high-tail-latency">High tail latency</h3>
+<p>DFS are known for high tail latencies, although this has been improving in 
recent years.
+To address the high-tail-latency problem, write requests are retried when they 
fail to complete within a timeout, which is 1 second by default (but can be 
configured manually).</p>
+
+<h1 id="benchmark-results">Benchmark results</h1>
+
+<p>The improvement of checkpoint stability and speed after enabling Changelog 
highly depends on the factors below:</p>
+
+<ul>
+  <li>The difference between the changelog diff size and the full state size 
(or incremental state size, if comparing changelog to incremental 
checkpoints).</li>
+  <li>The ability to upload the updates continuously during the checkpoint 
(e.g. an operator might maintain state in memory and only update Flink state 
objects on checkpoint - in this case, changelog wouldn’t help much).</li>
+  <li>The ability to group updates from multiple tasks (multiple tasks must be 
deployed on a single TM). Grouping the updates leads to fewer files being 
created thereby reducing the load on DFS, which improves the stability.</li>
+  <li>The ability of the underlying backend to accumulate updates to the same 
key before flushing (This makes state change log potentially contain more 
updates compared to just the final value, leading to a larger incremental 
changelog state size)</li>
+  <li>The speed of the underlying durable storage (the faster it is, the less 
significant the improvement)</li>
+</ul>
+
+<p>The following setup was used in the experiment:</p>
+
+<ul>
+  <li>Parallelism: 50</li>
+  <li>Running time: 21h</li>
+  <li>State backend: RocksDB (incremental checkpoint enabled)</li>
+  <li>Storage: S3 (Presto plugin)</li>
+  <li>Machine type: AWS m5.xlarge (4 slots per TM)</li>
+  <li>Checkpoint interval: 10ms</li>
+  <li>State Table materialization interval: 3m</li>
+  <li>Input rate: 50K events per second</li>
+</ul>
+
+<h2 id="valuestate-workload">ValueState workload</h2>
+<p>A workload updating mostly the new keys each time would benefit the 
most.</p>
+
+<table border="1">
+  <thead>
+    <tr>
+      <th style="padding: 5px">&nbsp;</th>
+      <th style="padding: 5px">Changelog Disabled</th>
+      <th style="padding: 5px">Changelog Enabled</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="padding: 5px">Records processed</td>
+      <td style="padding: 5px">3,808,629,616</td>
+      <td style="padding: 5px">3,810,508,130</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">Checkpoints made</td>
+      <td style="padding: 5px">10,023</td>
+      <td style="padding: 5px">108,649</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">Checkpoint duration, 90%</td>
+      <td style="padding: 5px">6s</td>
+      <td style="padding: 5px">664ms</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">Checkpoint duration, 99.9%</td>
+      <td style="padding: 5px">10s</td>
+      <td style="padding: 5px">1s</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">Full checkpoint size *, 99%</td>
+      <td style="padding: 5px">19.6GB</td>
+      <td style="padding: 5px">25.6GB</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">Recovery time (local recovery disabled)</td>
+      <td style="padding: 5px">20-21s</td>
+      <td style="padding: 5px">35-65s (depending on the checkpoint)</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>As can be seen from the above table, checkpoint duration is reduced 10 
times for 99.9% of checkpoints, while space usage increases by 30%, and 
recovery time increases by 66%-225%.</p>
+
+<p>More details about the checkpoints (Changelog Enabled / Changelog 
Disabled):</p>
+
+<table border="1">
+  <thead>
+    <tr>
+      <th style="padding: 5px">Percentile</th>
+      <th style="padding: 5px">End to End Duration</th>
+      <th style="padding: 5px">Checkpointed Data Size *</th>
+      <th style="padding: 5px">Full Checkpoint Data Size *</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="padding: 5px">50%</td>
+      <td style="padding: 5px">311ms / 5s</td>
+      <td style="padding: 5px">14.8MB / 3.05GB</td>
+      <td style="padding: 5px">24.2GB / 18.5GB</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">90%</td>
+      <td style="padding: 5px">664ms / 6s</td>
+      <td style="padding: 5px">23.5MB / 4.52GB</td>
+      <td style="padding: 5px">25.2GB / 19.3GB</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">99%</td>
+      <td style="padding: 5px">1s / 7s</td>
+      <td style="padding: 5px">36.6MB / 5.19GB</td>
+      <td style="padding: 5px">25.6GB / 19.6GB</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">99.9%</td>
+      <td style="padding: 5px">1s / 10s</td>
+      <td style="padding: 5px">52.8MB / 6.49GB</td>
+      <td style="padding: 5px">25.7GB / 19.8GB</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>* Checkpointed Data Size is the size of data persisted after receiving the 
necessary number of checkpoint barriers, during a so-called synchronous and 
then asynchronous checkpoint phases. Most of the data is persisted 
pre-emptively (i.e. after the previous checkpoint and before the current one), 
and that’s why this size is much lower when the Changelog is enabled.
+<br />
+* Full checkpoint size is the total size of all the files comprising the 
checkpoint, including any files reused from the previous checkpoints. Compared 
to a normal checkpoint, the one with a changelog is less compact, keeping all 
the historical values since the last materialization, and therefore consumes 
much more space</p>
+
+<h2 id="window-workload">Window workload</h2>
+<p>This workload used Processing Time Sliding Window. As can be seen below, 
checkpoints are still faster, resulting in 3 times shorter durations; but 
storage amplification is much higher in this case (45 times more space 
consumed):</p>
+
+<p>Checkpoint Statistics for Window Workload with Changelog Enabled / 
Changelog Disabled</p>
+
+<table border="1">
+  <thead>
+    <tr>
+      <th style="padding: 5px">Percentile</th>
+      <th style="padding: 5px">End to End Duration</th>
+      <th style="padding: 5px">Checkpointed Data Size</th>
+      <th style="padding: 5px">Full Checkpoint Data Size</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="padding: 5px">50%</td>
+      <td style="padding: 5px">791ms / 1s</td>
+      <td style="padding: 5px">269MB / 1.18GB</td>
+      <td style="padding: 5px">85.5GB / 1.99GB</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">90%</td>
+      <td style="padding: 5px">1s / 1s</td>
+      <td style="padding: 5px">292MB / 1.36GB</td>
+      <td style="padding: 5px">97.4GB / 2.16GB</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">99%</td>
+      <td style="padding: 5px">1s / 6s</td>
+      <td style="padding: 5px">310MB / 1.67GB</td>
+      <td style="padding: 5px">103GB / 2.26GB</td>
+    </tr>
+    <tr>
+      <td style="padding: 5px">99.9%</td>
+      <td style="padding: 5px">2s / 6s</td>
+      <td style="padding: 5px">324MB / 1.87GB</td>
+      <td style="padding: 5px">104GB / 2.30GB</td>
+    </tr>
+  </tbody>
+</table>
+
+<p>The increase in space consumption (Full Checkpoint Data Size) can be 
attributed to:
+1. Assigning each element to multiple sliding windows (and persisting the 
state changelog for each). While RocksDB and Heap have the same issue, with 
changelog the impact is multiplied even further.
+2. As mentioned above, if the underlying state backend (i.e. RocksDB) is able 
to accumulate multiple state updates for the same key without flushing, the 
snapshot will be smaller in size than the changelog. In this particular case of 
sliding window, the updates to its contents are eventually followed by purging 
that window. If those updates and purge happen during the same checkpoint, then 
it’s quite likely that the window is not included in the snapshot.
+This also implies that the faster the window is purged, the smaller the size 
of the snapshot is.</p>
+
+<h1 id="conclusion-and-future-work">Conclusion and future work</h1>
+<p>Generic log-based incremental checkpoints is released as MVP version in 
Flink 1.15. This version demonstrates that solutions based on modern DFS can 
provide good enough latency. Furthermore, checkpointing time and stability are 
improved significantly by using the Changelog. However, some trade-offs must be 
made before using it (in particular, space amplification).
+<br />
+In the next releases, we plan to enable more use cases for Changelog, e.g., by 
reducing recovery time via local recovery and improving compatibility.</p>
+
+<p>Another direction is further reducing latency. This can be achieved by 
using faster storage, such as Apache Bookkeeper or Apache Kafka.</p>
+
+<p>Besides that, we are investigating other applications of Changelog, such as 
WAL for sinks and queryable states.</p>
+
+<p>We encourage you to try out this feature and assess the pros and cons of 
using it in your setup. The simplest way to do this it is to add the following 
to your flink-conf.yaml:</p>
+
+<div class="highlight"><pre><code>state.backend.changelog.enabled: true
+state.backend.changelog.storage: filesystem 
+dstl.dfs.base-path: &lt;location similar to state.checkpoints.dir&gt;
+</code></pre></div>
+
+<p>Please see the full documentation <a 
href="https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/state_backends/#enabling-changelog";>here</a>.</p>
+
+<h1 id="acknowledgments">Acknowledgments</h1>
+
+<p>We thank Stephan Ewen for the initial idea of the project, and many other 
engineers including Piotr Nowojski, Yu Li and Yun Tang for design discussions 
and code reviews.</p>
+
+<h1 id="references">References</h1>
+
+<ul>
+  <li>
+    <p><a 
href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-158%3A+Generalized+incremental+checkpoints";>
 FLIP-158 </a></p>
+  </li>
+  <li>
+    <p><a 
href="https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/state_backends/#enabling-changelog";>
 generic log-based incremental checkpoints documentation </a></p>
+  </li>
+  <li>
+    <p><a 
href="https://flink.apache.org/2020/10/15/from-aligned-to-unaligned-checkpoints-part-1.html";>
 Unaligned checkpoints </a></p>
+  </li>
+  <li>
+    <p><a 
href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-183%3A+Dynamic+buffer+size+adjustment";>
 Buffer debloating </a></p>
+  </li>
+  <li>
+    <p><a 
href="https://flink.apache.org/features/2018/01/30/incremental-checkpointing.html";>
 Incremental checkpoints </a></p>
+  </li>
+</ul>
+
+      </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-2022 <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="https://privacy.apache.org/policies/privacy-policy-public.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="/js/jquery.matchHeight-min.js"></script>
+    <script src="/js/bootstrap.min.js"></script>
+    <script src="/js/codetabs.js"></script>
+    <script src="/js/stickysidebar.js"></script>
+  </body>
+</html>
diff --git a/content/blog/feed.xml b/content/blog/feed.xml
index 3f1841b3e..8efbb09e8 100644
--- a/content/blog/feed.xml
+++ b/content/blog/feed.xml
@@ -6,6 +6,380 @@
 <link>https://flink.apache.org/blog</link>
 <atom:link href="https://flink.apache.org/blog/feed.xml"; rel="self" 
type="application/rss+xml" />
 
+<item>
+<title>Improving speed and stability of checkpointing with generic log-based 
incremental checkpoints</title>
+<description>&lt;h1 id=&quot;introduction&quot;&gt;Introduction&lt;/h1&gt;
+
+&lt;p&gt;One of the most important characteristics of stream processing 
systems is end-to-end latency, i.e. the time it takes for the results of 
processing an input record to reach the outputs. In the case of Flink, 
end-to-end latency mostly depends on the checkpointing mechanism, because 
processing results should only become visible after the state of the stream is 
persisted to non-volatile storage (this is assuming exactly-once mode; in other 
modes, results can be published immediately [...]
+
+&lt;p&gt;Furthermore, сheckpoint duration also defines the reasonable interval 
with which checkpoints are made. A shorter interval provides the following 
advantages:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Lower latency for transactional sinks: Transactional sinks commit 
on checkpoints, so faster checkpoints mean more frequent commits.&lt;/li&gt;
+  &lt;li&gt;More predictable checkpoint intervals: Currently, the duration of 
a checkpoint depends on the size of the artifacts that need to be persisted in 
the checkpoint storage.&lt;/li&gt;
+  &lt;li&gt;Less work on recovery. The more frequently the checkpoint, the 
fewer events need to be re-processed after recovery.&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;Following are the main factors affecting checkpoint duration in 
Flink:&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;Barrier travel time and alignment duration&lt;/li&gt;
+  &lt;li&gt;Time to take state snapshot and persist it onto the durable 
highly-available storage (such as S3)&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;Recent improvements such as &lt;a 
href=&quot;https://flink.apache.org/2020/10/15/from-aligned-to-unaligned-checkpoints-part-1.html&quot;&gt;Unaligned
 checkpoints&lt;/a&gt; and &lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-183%3A+Dynamic+buffer+size+adjustment&quot;&gt;
 Buffer debloating &lt;/a&gt; try to address (1), especially in the presence of 
back-pressure. Previously, &lt;a 
href=&quot;https://flink.apache.org/features/2018/01/30/incremental-checkpo 
[...]
+
+&lt;p&gt;However, there are still some cases when this duration is 
high&lt;/p&gt;
+
+&lt;h3 
id=&quot;every-checkpoint-is-delayed-by-at-least-one-task-with-high-parallelism&quot;&gt;Every
 checkpoint is delayed by at least one task with high parallelism&lt;/h3&gt;
+
+&lt;center&gt;
+&lt;img 
src=&quot;/img/blog/2022-05-30-changelog-state-backend/failing-task.png&quot; 
/&gt;
+&lt;br /&gt;
+&lt;/center&gt;
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+
+&lt;p&gt;With the existing incremental checkpoint implementation of the 
RocksDB state backend, every subtask needs to periodically perform some form of 
compaction. That compaction results in new, relatively big files, which in turn 
increase the upload time (2). The probability of at least one node performing 
such compaction and thus slowing down the whole checkpoint grows proportionally 
to the number of nodes. In large deployments, almost every checkpoint becomes 
delayed by some node.&lt;/p&gt;
+
+&lt;h3 
id=&quot;unnecessary-delay-before-uploading-state-snapshot&quot;&gt;Unnecessary 
delay before uploading state snapshot&lt;/h3&gt;
+
+&lt;center&gt;
+&lt;img 
src=&quot;/img/blog/2022-05-30-changelog-state-backend/checkpoint-timing.png&quot;
 /&gt;
+&lt;br /&gt;
+&lt;/center&gt;
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+
+&lt;p&gt;State backends don’t start any snapshotting work until the task 
receives at least one checkpoint barrier, increasing the effective checkpoint 
duration. This is suboptimal if the upload time is comparable to the checkpoint 
interval; instead, a snapshot could be uploaded continuously throughout the 
interval.&lt;/p&gt;
+
+&lt;p&gt;This work discusses the mechanism introduced in Flink 1.15 to address 
the above cases by continuously persisting state changes on non-volatile 
storage while performing materialization in the background. The basic idea is 
described in the following section, and then important implementation details 
are highlighted. Subsequent sections discuss benchmarking results, limitations, 
and future work.&lt;/p&gt;
+
+&lt;h1 id=&quot;high-level-overview&quot;&gt;High-level Overview&lt;/h1&gt;
+
+&lt;p&gt;The core idea is to introduce a state changelog (a log that records 
state changes); this changelog allows operators to persist state changes in a 
very fine-grained manner, as described below:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Stateful operators write the state changes to the state changelog, 
in addition to applying them to the state tables in RocksDB or the in-mem 
Hashtable.&lt;/li&gt;
+  &lt;li&gt;An operator can acknowledge a checkpoint as soon as the changes in 
the log have reached the durable checkpoint storage.&lt;/li&gt;
+  &lt;li&gt;The state tables are persisted periodically as well, independent 
of the checkpoints. We call this procedure the materialization of the state on 
the durable checkpoint storage.&lt;/li&gt;
+  &lt;li&gt;Once the state is materialized on the checkpoint storage, the 
state changelog can be truncated to the point where the state is 
materialized.&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;This can be illustrated as follows:&lt;/p&gt;
+
+&lt;center&gt;
+    &lt;div style=&quot;overflow-x: auto&quot;&gt;
+        &lt;div style=&quot;width:150%&quot;&gt;
+            &lt;img style=&quot;display:inline; max-width: 33%; max-height: 
200px; margin-left: -1%&quot; 
src=&quot;/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_1.png&quot;
 /&gt; 
+            &lt;img style=&quot;display:inline; max-width: 33%; max-height: 
200px; margin-left: -1%&quot; 
src=&quot;/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_2.png&quot;
 /&gt; 
+            &lt;img style=&quot;display:inline; max-width: 33%; max-height: 
200px; margin-left: -1%&quot; 
src=&quot;/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_3.png&quot;
 /&gt; 
+        &lt;/div&gt;
+    &lt;/div&gt;
+
+    &lt;br /&gt;
+&lt;/center&gt;
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+
+&lt;p&gt;This approach mirrors what database systems do, adjusted to 
distributed checkpoints:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Changes (inserts/updates/deletes) are written to the transaction 
log, and the transaction is considered durable once the log is synced to disk 
(or other durable storage).&lt;/li&gt;
+  &lt;li&gt;The changes are also materialized in the tables (so the database 
system can efficiently query the table). The tables are usually persisted 
asynchronously.&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;Once all relevant parts of the changed tables have been persisted, 
the transaction log can be truncated, which is similar to the materialization 
procedure in our approach.&lt;/p&gt;
+
+&lt;p&gt;Such a design makes a number of trade-offs:&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;Increased use of network IO and remote storage space for 
changelog&lt;/li&gt;
+  &lt;li&gt;Increased memory usage to buffer state changes&lt;/li&gt;
+  &lt;li&gt;Increased time to replay state changes during the recovery 
process&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;The last one, may or may not be compensated by more frequent 
checkpoints. More frequent checkpoints mean less re-processing is needed after 
recovery.&lt;/p&gt;
+
+&lt;h1 id=&quot;system-architecture&quot;&gt;System architecture&lt;/h1&gt;
+
+&lt;h2 id=&quot;changelog-storage-dstl&quot;&gt;Changelog storage 
(DSTL)&lt;/h2&gt;
+
+&lt;p&gt;The component that is responsible for actually storing state changes 
has the following requirements.&lt;/p&gt;
+
+&lt;h3 id=&quot;durability&quot;&gt;Durability&lt;/h3&gt;
+&lt;p&gt;Changelog constitutes a part of a checkpoint, and therefore the same 
durability guarantees as for checkpoints must be provided. However, the 
duration for which the changelog is stored is expected to be short (until the 
changes are materialized).&lt;/p&gt;
+
+&lt;h3 id=&quot;workload&quot;&gt;Workload&lt;/h3&gt;
+&lt;p&gt;The workload is write-heavy: changelog is written continuously, and 
it is only read in case of failure. Once written, data can not be 
modified.&lt;/p&gt;
+
+&lt;h3 id=&quot;latency&quot;&gt;Latency&lt;/h3&gt;
+&lt;p&gt;We target checkpoint duration of 1s in the Flink 1.15 MVP for 99% of 
checkpoints. Therefore, an individual write request must complete within that 
duration or less (if parallelism is 100, then 99.99% of write requests must 
complete within 1s).&lt;/p&gt;
+
+&lt;h3 id=&quot;consistency&quot;&gt;Consistency&lt;/h3&gt;
+&lt;p&gt;Once a change is persisted (and acknowledged to JM), it must be 
available for replay to enable recovery (this can be achieved by using a single 
machine, quorum, or synchronous replication).&lt;/p&gt;
+
+&lt;h3 id=&quot;concurrency&quot;&gt;Concurrency&lt;/h3&gt;
+
+&lt;p&gt;Each task writes to its own changelog, which prevents concurrency 
issues across multiple tasks. However, when a task is restarted, it needs to 
write to the same log, which may cause concurrency issues. This is addressed 
by:&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;Using unique log segment identifiers while writing&lt;/li&gt;
+  &lt;li&gt;Fencing previous execution attempts on JM when handling checkpoint 
acknowledgments&lt;/li&gt;
+  &lt;li&gt;After closing the log, treating it as Flink state, which is 
read-only and is discarded by a single JM (leader)&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;To emphasize the difference in durability requirements and usage 
compared to other systems (durable, short-lived, append-only), the component is 
called &lt;strong&gt;“Durable Short-term Log” (DSTL)&lt;/strong&gt;.&lt;/p&gt;
+
+&lt;p&gt;DSTL can be implemented in many ways, such as Distributed Log, 
Distributed File System* (DFS), or even a database. In the MVP version in Flink 
1.15, we chose DFS because of the following reasons:&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;No additional external dependency; DFS is readily available in 
most environments and is already used to store checkpoints&lt;/li&gt;
+  &lt;li&gt;No additional stateful components to manage; using any other 
persistence medium would incur additional operational overhead&lt;/li&gt;
+  &lt;li&gt;DFS natively provides durability and consistency guarantees which 
need to be taken care of when implementing a new customized distributed log 
storage (in particular, when implementing replication)&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;On the other hand, the DFS approach has the following 
disadvantages:&lt;/p&gt;
+
+&lt;ol&gt;
+  &lt;li&gt;has higher latency than for example Distributed Log writing to the 
local disks&lt;/li&gt;
+  &lt;li&gt;its scalability is limited by DFS (most Storage Providers start 
rate-limiting at some point)&lt;/li&gt;
+&lt;/ol&gt;
+
+&lt;p&gt;However, after some initial experimentation, we think the performance 
of popular DFS could satisfy 80% of the use cases, and more results will be 
illustrated with the MVP version in a later section.
+DFS here makes no distinction between DFS and object stores.&lt;/p&gt;
+
+&lt;p&gt;Using RocksDB as an example, this approach can be illustrated at the 
high level as follows. State updates are replicated to both RocksDB and DSTL by 
the Changelog State Backend. 
+DSTL continuously writes state changes to DFS and flushes them periodically 
and on checkpoint. That way, checkpoint time only depends on the time to flush 
a small amount of data. 
+RocksDB on the other hand is still used for querying the state. Furthermore, 
its SSTables are periodically uploaded to DFS, which is called 
“materialization”. That upload is independent of and is much less frequent than 
checkpointing procedure, with 10 minutes as the default interval.&lt;/p&gt;
+
+&lt;center&gt;
+&lt;img style=&quot;max-width: 80%&quot; 
src=&quot;/img/blog/2022-05-30-changelog-state-backend/changelog-simple.png&quot;
 /&gt;
+&lt;br /&gt;
+&lt;/center&gt;
+&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
+
+&lt;p&gt;There are a few more issues worth highlighting here:&lt;/p&gt;
+
+&lt;h2 id=&quot;state-cleanup&quot;&gt;State cleanup&lt;/h2&gt;
+&lt;p&gt;State changelog needs to be truncated once the corresponding changes 
are materialized. It becomes more complicated with re-scaling and sharing the 
underlying files across multiple operators. However, Flink already provides a 
mechanism called &lt;code&gt;SharedStateRegistry&lt;/code&gt; similar to file 
system reference counting. Log fragments can be viewed as shared state objects, 
and therefore can be tracked by this 
&lt;code&gt;SharedStateRegistry&lt;/code&gt; (please see &lt;a  [...]
+
+&lt;h2 id=&quot;dfs-specific-issues&quot;&gt;DFS-specific issues&lt;/h2&gt;
+
+&lt;h3 id=&quot;small-files-problem&quot;&gt;Small files problem&lt;/h3&gt;
+&lt;p&gt;One issue with using DFS is that much more and likely smaller files 
are created for each checkpoint. And with the increased checkpoint frequency, 
there are more checkpoints.
+To mitigate this, state changes related to the same job on a TM are grouped 
into a single file.&lt;/p&gt;
+
+&lt;h3 id=&quot;high-tail-latency&quot;&gt;High tail latency&lt;/h3&gt;
+&lt;p&gt;DFS are known for high tail latencies, although this has been 
improving in recent years.
+To address the high-tail-latency problem, write requests are retried when they 
fail to complete within a timeout, which is 1 second by default (but can be 
configured manually).&lt;/p&gt;
+
+&lt;h1 id=&quot;benchmark-results&quot;&gt;Benchmark results&lt;/h1&gt;
+
+&lt;p&gt;The improvement of checkpoint stability and speed after enabling 
Changelog highly depends on the factors below:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;The difference between the changelog diff size and the full state 
size (or incremental state size, if comparing changelog to incremental 
checkpoints).&lt;/li&gt;
+  &lt;li&gt;The ability to upload the updates continuously during the 
checkpoint (e.g. an operator might maintain state in memory and only update 
Flink state objects on checkpoint - in this case, changelog wouldn’t help 
much).&lt;/li&gt;
+  &lt;li&gt;The ability to group updates from multiple tasks (multiple tasks 
must be deployed on a single TM). Grouping the updates leads to fewer files 
being created thereby reducing the load on DFS, which improves the 
stability.&lt;/li&gt;
+  &lt;li&gt;The ability of the underlying backend to accumulate updates to the 
same key before flushing (This makes state change log potentially contain more 
updates compared to just the final value, leading to a larger incremental 
changelog state size)&lt;/li&gt;
+  &lt;li&gt;The speed of the underlying durable storage (the faster it is, the 
less significant the improvement)&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;The following setup was used in the experiment:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;Parallelism: 50&lt;/li&gt;
+  &lt;li&gt;Running time: 21h&lt;/li&gt;
+  &lt;li&gt;State backend: RocksDB (incremental checkpoint enabled)&lt;/li&gt;
+  &lt;li&gt;Storage: S3 (Presto plugin)&lt;/li&gt;
+  &lt;li&gt;Machine type: AWS m5.xlarge (4 slots per TM)&lt;/li&gt;
+  &lt;li&gt;Checkpoint interval: 10ms&lt;/li&gt;
+  &lt;li&gt;State Table materialization interval: 3m&lt;/li&gt;
+  &lt;li&gt;Input rate: 50K events per second&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;h2 id=&quot;valuestate-workload&quot;&gt;ValueState workload&lt;/h2&gt;
+&lt;p&gt;A workload updating mostly the new keys each time would benefit the 
most.&lt;/p&gt;
+
+&lt;table border=&quot;1&quot;&gt;
+  &lt;thead&gt;
+    &lt;tr&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;&amp;nbsp;&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Changelog Disabled&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Changelog Enabled&lt;/th&gt;
+    &lt;/tr&gt;
+  &lt;/thead&gt;
+  &lt;tbody&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;Records processed&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;3,808,629,616&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;3,810,508,130&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;Checkpoints made&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;10,023&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;108,649&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;Checkpoint duration, 
90%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;6s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;664ms&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;Checkpoint duration, 
99.9%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;10s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;1s&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;Full checkpoint size *, 
99%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;19.6GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;25.6GB&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;Recovery time (local recovery 
disabled)&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;20-21s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;35-65s (depending on the 
checkpoint)&lt;/td&gt;
+    &lt;/tr&gt;
+  &lt;/tbody&gt;
+&lt;/table&gt;
+
+&lt;p&gt;As can be seen from the above table, checkpoint duration is reduced 
10 times for 99.9% of checkpoints, while space usage increases by 30%, and 
recovery time increases by 66%-225%.&lt;/p&gt;
+
+&lt;p&gt;More details about the checkpoints (Changelog Enabled / Changelog 
Disabled):&lt;/p&gt;
+
+&lt;table border=&quot;1&quot;&gt;
+  &lt;thead&gt;
+    &lt;tr&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Percentile&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;End to End Duration&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Checkpointed Data Size 
*&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Full Checkpoint Data Size 
*&lt;/th&gt;
+    &lt;/tr&gt;
+  &lt;/thead&gt;
+  &lt;tbody&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;50%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;311ms / 5s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;14.8MB / 3.05GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;24.2GB / 18.5GB&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;90%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;664ms / 6s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;23.5MB / 4.52GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;25.2GB / 19.3GB&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;99%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;1s / 7s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;36.6MB / 5.19GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;25.6GB / 19.6GB&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;99.9%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;1s / 10s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;52.8MB / 6.49GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;25.7GB / 19.8GB&lt;/td&gt;
+    &lt;/tr&gt;
+  &lt;/tbody&gt;
+&lt;/table&gt;
+
+&lt;p&gt;* Checkpointed Data Size is the size of data persisted after 
receiving the necessary number of checkpoint barriers, during a so-called 
synchronous and then asynchronous checkpoint phases. Most of the data is 
persisted pre-emptively (i.e. after the previous checkpoint and before the 
current one), and that’s why this size is much lower when the Changelog is 
enabled.
+&lt;br /&gt;
+* Full checkpoint size is the total size of all the files comprising the 
checkpoint, including any files reused from the previous checkpoints. Compared 
to a normal checkpoint, the one with a changelog is less compact, keeping all 
the historical values since the last materialization, and therefore consumes 
much more space&lt;/p&gt;
+
+&lt;h2 id=&quot;window-workload&quot;&gt;Window workload&lt;/h2&gt;
+&lt;p&gt;This workload used Processing Time Sliding Window. As can be seen 
below, checkpoints are still faster, resulting in 3 times shorter durations; 
but storage amplification is much higher in this case (45 times more space 
consumed):&lt;/p&gt;
+
+&lt;p&gt;Checkpoint Statistics for Window Workload with Changelog Enabled / 
Changelog Disabled&lt;/p&gt;
+
+&lt;table border=&quot;1&quot;&gt;
+  &lt;thead&gt;
+    &lt;tr&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Percentile&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;End to End Duration&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Checkpointed Data 
Size&lt;/th&gt;
+      &lt;th style=&quot;padding: 5px&quot;&gt;Full Checkpoint Data 
Size&lt;/th&gt;
+    &lt;/tr&gt;
+  &lt;/thead&gt;
+  &lt;tbody&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;50%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;791ms / 1s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;269MB / 1.18GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;85.5GB / 1.99GB&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;90%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;1s / 1s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;292MB / 1.36GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;97.4GB / 2.16GB&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;99%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;1s / 6s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;310MB / 1.67GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;103GB / 2.26GB&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;99.9%&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;2s / 6s&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;324MB / 1.87GB&lt;/td&gt;
+      &lt;td style=&quot;padding: 5px&quot;&gt;104GB / 2.30GB&lt;/td&gt;
+    &lt;/tr&gt;
+  &lt;/tbody&gt;
+&lt;/table&gt;
+
+&lt;p&gt;The increase in space consumption (Full Checkpoint Data Size) can be 
attributed to:
+1. Assigning each element to multiple sliding windows (and persisting the 
state changelog for each). While RocksDB and Heap have the same issue, with 
changelog the impact is multiplied even further.
+2. As mentioned above, if the underlying state backend (i.e. RocksDB) is able 
to accumulate multiple state updates for the same key without flushing, the 
snapshot will be smaller in size than the changelog. In this particular case of 
sliding window, the updates to its contents are eventually followed by purging 
that window. If those updates and purge happen during the same checkpoint, then 
it’s quite likely that the window is not included in the snapshot.
+This also implies that the faster the window is purged, the smaller the size 
of the snapshot is.&lt;/p&gt;
+
+&lt;h1 id=&quot;conclusion-and-future-work&quot;&gt;Conclusion and future 
work&lt;/h1&gt;
+&lt;p&gt;Generic log-based incremental checkpoints is released as MVP version 
in Flink 1.15. This version demonstrates that solutions based on modern DFS can 
provide good enough latency. Furthermore, checkpointing time and stability are 
improved significantly by using the Changelog. However, some trade-offs must be 
made before using it (in particular, space amplification).
+&lt;br /&gt;
+In the next releases, we plan to enable more use cases for Changelog, e.g., by 
reducing recovery time via local recovery and improving compatibility.&lt;/p&gt;
+
+&lt;p&gt;Another direction is further reducing latency. This can be achieved 
by using faster storage, such as Apache Bookkeeper or Apache Kafka.&lt;/p&gt;
+
+&lt;p&gt;Besides that, we are investigating other applications of Changelog, 
such as WAL for sinks and queryable states.&lt;/p&gt;
+
+&lt;p&gt;We encourage you to try out this feature and assess the pros and cons 
of using it in your setup. The simplest way to do this it is to add the 
following to your flink-conf.yaml:&lt;/p&gt;
+
+&lt;div 
class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code&gt;state.backend.changelog.enabled:
 true
+state.backend.changelog.storage: filesystem 
+dstl.dfs.base-path: &amp;lt;location similar to state.checkpoints.dir&amp;gt;
+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
+
+&lt;p&gt;Please see the full documentation &lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/state_backends/#enabling-changelog&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
+
+&lt;h1 id=&quot;acknowledgments&quot;&gt;Acknowledgments&lt;/h1&gt;
+
+&lt;p&gt;We thank Stephan Ewen for the initial idea of the project, and many 
other engineers including Piotr Nowojski, Yu Li and Yun Tang for design 
discussions and code reviews.&lt;/p&gt;
+
+&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;
+    &lt;p&gt;&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-158%3A+Generalized+incremental+checkpoints&quot;&gt;
 FLIP-158 &lt;/a&gt;&lt;/p&gt;
+  &lt;/li&gt;
+  &lt;li&gt;
+    &lt;p&gt;&lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/state_backends/#enabling-changelog&quot;&gt;
 generic log-based incremental checkpoints documentation &lt;/a&gt;&lt;/p&gt;
+  &lt;/li&gt;
+  &lt;li&gt;
+    &lt;p&gt;&lt;a 
href=&quot;https://flink.apache.org/2020/10/15/from-aligned-to-unaligned-checkpoints-part-1.html&quot;&gt;
 Unaligned checkpoints &lt;/a&gt;&lt;/p&gt;
+  &lt;/li&gt;
+  &lt;li&gt;
+    &lt;p&gt;&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-183%3A+Dynamic+buffer+size+adjustment&quot;&gt;
 Buffer debloating &lt;/a&gt;&lt;/p&gt;
+  &lt;/li&gt;
+  &lt;li&gt;
+    &lt;p&gt;&lt;a 
href=&quot;https://flink.apache.org/features/2018/01/30/incremental-checkpointing.html&quot;&gt;
 Incremental checkpoints &lt;/a&gt;&lt;/p&gt;
+  &lt;/li&gt;
+&lt;/ul&gt;
+</description>
+<pubDate>Mon, 30 May 2022 02:00:00 +0200</pubDate>
+<link>https://flink.apache.org/2022/05/30/changelog-state-backend.html</link>
+<guid isPermaLink="true">/2022/05/30/changelog-state-backend.html</guid>
+</item>
+
 <item>
 <title>Getting into Low-Latency Gears with Apache Flink - Part Two</title>
 <description>&lt;p&gt;This series of blog posts present a collection of 
low-latency techniques in Flink. In &lt;a 
href=&quot;https://flink.apache.org/2022/05/18/latency-part1.html&quot;&gt;part 
one&lt;/a&gt;, we discussed the types of latency in Flink and the way we 
measure end-to-end latency and presented a few techniques that optimize latency 
directly. In this post, we will continue with a few more direct latency 
optimization techniques. Just like in part one, for each optimization tec [...]
@@ -19696,379 +20070,5 @@ Transaction{timestamp=1563395831000, origin=1, 
target=&#39;3&#39;, amount=160}}
 <guid isPermaLink="true">/news/2019/09/10/community-update.html</guid>
 </item>
 
-<item>
-<title>Apache Flink 1.9.0 Release Announcement</title>
-<description>&lt;p&gt;The Apache Flink community is proud to announce the 
release of Apache Flink
-1.9.0.&lt;/p&gt;
-
-&lt;p&gt;The Apache Flink project’s goal is to develop a stream processing 
system to
-unify and power many forms of real-time and offline data processing
-applications as well as event-driven applications. In this release, we have
-made a huge step forward in that effort, by integrating Flink’s stream and
-batch processing capabilities under a single, unified runtime.&lt;/p&gt;
-
-&lt;p&gt;Significant features on this path are batch-style recovery for batch 
jobs and
-a preview of the new Blink-based query engine for Table API and SQL queries.
-We are also excited to announce the availability of the State Processor API,
-which is one of the most frequently requested features and enables users to
-read and write savepoints with Flink DataSet jobs. Finally, Flink 1.9 includes
-a reworked WebUI and previews of Flink’s new Python Table API and its
-integration with the Apache Hive ecosystem.&lt;/p&gt;
-
-&lt;p&gt;This blog post describes all major new features and improvements, 
important
-changes to be aware of and what to expect moving forward. For more details,
-check the &lt;a 
href=&quot;https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315522&amp;amp;version=12344601&quot;&gt;complete
 release
-changelog&lt;/a&gt;.&lt;/p&gt;
-
-&lt;p&gt;The binary distribution and source artifacts for this release are now
-available via the &lt;a 
href=&quot;https://flink.apache.org/downloads.html&quot;&gt;Downloads&lt;/a&gt; 
page of
-the Flink project, along with the updated
-&lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-release-1.9/&quot;&gt;documentation&lt;/a&gt;.
-Flink 1.9 is API-compatible with previous 1.x releases for APIs annotated with
-the &lt;code&gt;@Public&lt;/code&gt; annotation.&lt;/p&gt;
-
-&lt;p&gt;Please feel encouraged to download the release and share your 
thoughts with
-the community through the Flink &lt;a 
href=&quot;https://flink.apache.org/community.html#mailing-lists&quot;&gt;mailing
-lists&lt;/a&gt; or
-&lt;a 
href=&quot;https://issues.apache.org/jira/projects/FLINK/summary&quot;&gt;JIRA&lt;/a&gt;.
 As always,
-feedback is very much appreciated!&lt;/p&gt;
-
-&lt;div class=&quot;page-toc&quot;&gt;
-&lt;ul id=&quot;markdown-toc&quot;&gt;
-  &lt;li&gt;&lt;a href=&quot;#new-features-and-improvements&quot; 
id=&quot;markdown-toc-new-features-and-improvements&quot;&gt;New Features and 
Improvements&lt;/a&gt;    &lt;ul&gt;
-      &lt;li&gt;&lt;a href=&quot;#fine-grained-batch-recovery-flip-1&quot; 
id=&quot;markdown-toc-fine-grained-batch-recovery-flip-1&quot;&gt;Fine-grained 
Batch Recovery (FLIP-1)&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a href=&quot;#state-processor-api-flip-43&quot; 
id=&quot;markdown-toc-state-processor-api-flip-43&quot;&gt;State Processor API 
(FLIP-43)&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a href=&quot;#stop-with-savepoint-flip-34&quot; 
id=&quot;markdown-toc-stop-with-savepoint-flip-34&quot;&gt;Stop-with-Savepoint 
(FLIP-34)&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a href=&quot;#flink-webui-rework&quot; 
id=&quot;markdown-toc-flink-webui-rework&quot;&gt;Flink WebUI 
Rework&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a 
href=&quot;#preview-of-the-new-blink-sql-query-processor&quot; 
id=&quot;markdown-toc-preview-of-the-new-blink-sql-query-processor&quot;&gt;Preview
 of the new Blink SQL Query Processor&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a 
href=&quot;#preview-of-full-hive-integration-flink-10556&quot; 
id=&quot;markdown-toc-preview-of-full-hive-integration-flink-10556&quot;&gt;Preview
 of Full Hive Integration (FLINK-10556)&lt;/a&gt;&lt;/li&gt;
-      &lt;li&gt;&lt;a 
href=&quot;#preview-of-the-new-python-table-api-flip-38&quot; 
id=&quot;markdown-toc-preview-of-the-new-python-table-api-flip-38&quot;&gt;Preview
 of the new Python Table API (FLIP-38)&lt;/a&gt;&lt;/li&gt;
-    &lt;/ul&gt;
-  &lt;/li&gt;
-  &lt;li&gt;&lt;a href=&quot;#important-changes&quot; 
id=&quot;markdown-toc-important-changes&quot;&gt;Important 
Changes&lt;/a&gt;&lt;/li&gt;
-  &lt;li&gt;&lt;a href=&quot;#release-notes&quot; 
id=&quot;markdown-toc-release-notes&quot;&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
-  &lt;li&gt;&lt;a href=&quot;#list-of-contributors&quot; 
id=&quot;markdown-toc-list-of-contributors&quot;&gt;List of 
Contributors&lt;/a&gt;&lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;/div&gt;
-
-&lt;h2 id=&quot;new-features-and-improvements&quot;&gt;New Features and 
Improvements&lt;/h2&gt;
-
-&lt;h3 id=&quot;fine-grained-batch-recovery-flip-1&quot;&gt;Fine-grained Batch 
Recovery (FLIP-1)&lt;/h3&gt;
-
-&lt;p&gt;The time to recover a batch (DataSet, Table API and SQL) job from a 
task
-failure was significantly reduced. Until Flink 1.9, task failures in batch
-jobs were recovered by canceling all tasks and restarting the whole job, i.e,
-the job was started from scratch and all progress was voided. With this
-release, Flink can be configured to limit the recovery to only those tasks
-that are in the same &lt;strong&gt;failover region&lt;/strong&gt;. A failover 
region is the set of
-tasks that are connected via pipelined data exchanges. Hence, the
-batch-shuffle connections of a job define the boundaries of its failover
-regions. More details are available in
-&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-1+%3A+Fine+Grained+Recovery+from+Task+Failures&quot;&gt;FLIP-1&lt;/a&gt;.
-&lt;img src=&quot;/img/blog/release-19-flip1.png&quot; 
alt=&quot;alt_text&quot; title=&quot;Fine-grained Batch
-Recovery&quot; /&gt;&lt;/p&gt;
-
-&lt;p&gt;To use this new failover strategy, you need to do the following
-settings:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;Make sure you have the entry 
&lt;code&gt;jobmanager.execution.failover-strategy:
-region&lt;/code&gt; in your 
&lt;code&gt;flink-conf.yaml&lt;/code&gt;.&lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The configuration of the 1.9 
distribution has that entry by default,
-  but when reusing a configuration file from previous setups, you have to add
-  it manually.&lt;/p&gt;
-
-&lt;p&gt;Moreover, you need to set the &lt;code&gt;ExecutionMode&lt;/code&gt; 
of batch jobs in the
-&lt;code&gt;ExecutionConfig&lt;/code&gt; to &lt;code&gt;BATCH&lt;/code&gt; to 
configure that data shuffles are not pipelined
-and jobs have more than one failover region.&lt;/p&gt;
-
-&lt;p&gt;The “Region” failover strategy also improves the recovery of 
“embarrassingly
-parallel” streaming jobs, i.e., jobs without any shuffle like keyBy() or
-rebalance. When such a job is recovered, only the tasks of the affected
-pipeline (failover region) are restarted. For all other streaming jobs, the
-recovery behavior is the same as in prior Flink versions.&lt;/p&gt;
-
-&lt;h3 id=&quot;state-processor-api-flip-43&quot;&gt;State Processor API 
(FLIP-43)&lt;/h3&gt;
-
-&lt;p&gt;Up to Flink 1.9, accessing the state of a job from the outside was 
limited to
-the (still) experimental &lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-stable/dev/stream/state/queryable_state.html&quot;&gt;Queryable
-State&lt;/a&gt;.
-This release introduces a new, powerful library to read, write and modify
-state snapshots using the batch DataSet API. In practice, this means:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;Flink job state can be bootstrapped by reading data from external 
systems,
-such as external databases, and converting it into a savepoint.&lt;/li&gt;
-  &lt;li&gt;State in savepoints can be queried using any of Flink’s batch APIs
-(DataSet, Table, SQL), for example to analyze relevant state patterns or
-check for discrepancies in state that can support application auditing or
-troubleshooting.&lt;/li&gt;
-  &lt;li&gt;The schema of state in savepoints can be migrated offline, 
compared to the
-previous approach requiring online migration on schema access.&lt;/li&gt;
-  &lt;li&gt;Invalid data in savepoints can be identified and 
corrected.&lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;p&gt;The new State Processor API covers all variations of snapshots: 
savepoints,
-full checkpoints and incremental checkpoints. More details are available in
-&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-43%3A+State+Processor+API&quot;&gt;FLIP-43&lt;/a&gt;&lt;/p&gt;
-
-&lt;h3 id=&quot;stop-with-savepoint-flip-34&quot;&gt;Stop-with-Savepoint 
(FLIP-34)&lt;/h3&gt;
-
-&lt;p&gt;&lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-stable/ops/state/savepoints.html#operations&quot;&gt;Cancelling
 with a
-savepoint&lt;/a&gt;
-is a common operation for stopping/restarting, forking or updating Flink jobs.
-However, the existing implementation did not guarantee output persistence to
-external storage systems for exactly-once sinks. To improve the end-to-end
-semantics when stopping a job, Flink 1.9 introduces a new 
&lt;code&gt;SUSPEND&lt;/code&gt; mode to
-stop a job with a savepoint that is consistent with the emitted data.
-You can suspend a job with Flink’s CLI client as follows:&lt;/p&gt;
-
-&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code&gt;bin/flink stop 
-p [:targetDirectory] :jobId
-&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
-
-&lt;p&gt;The final job state is set to &lt;code&gt;FINISHED&lt;/code&gt; on 
success, allowing
-users to detect failures of the requested operation.&lt;/p&gt;
-
-&lt;p&gt;More details are available in
-&lt;a 
href=&quot;https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=103090212&quot;&gt;FLIP-34&lt;/a&gt;&lt;/p&gt;
-
-&lt;h3 id=&quot;flink-webui-rework&quot;&gt;Flink WebUI Rework&lt;/h3&gt;
-
-&lt;p&gt;After a
-&lt;a 
href=&quot;http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Change-underlying-Frontend-Architecture-for-Flink-Web-Dashboard-td24902.html&quot;&gt;discussion&lt;/a&gt;
-about modernizing the internals of Flink’s WebUI, this component was
-reconstructed using the latest stable version of Angular — basically, a bump
-from Angular 1.x to 7.x. The redesigned version is the default in 1.9.0,
-however there is a link to switch to the old WebUI.&lt;/p&gt;
-
-&lt;div class=&quot;row&quot;&gt; &lt;div class=&quot;col-sm-6&quot;&gt; 
&lt;span&gt;&lt;img class=&quot;thumbnail&quot; 
src=&quot;/img/blog/release-19-web1.png&quot; /&gt;&lt;/span&gt; &lt;/div&gt; 
&lt;div class=&quot;col-sm-6&quot;&gt; &lt;span&gt;&lt;img 
class=&quot;thumbnail&quot; src=&quot;/img/blog/release-19-web2.png&quot; 
/&gt;&lt;/span&gt; &lt;/div&gt;
-    &lt;/div&gt;
-
-&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Moving forward, feature parity for 
the old version of the WebUI 
-will not be guaranteed.&lt;/p&gt;
-
-&lt;h3 id=&quot;preview-of-the-new-blink-sql-query-processor&quot;&gt;Preview 
of the new Blink SQL Query Processor&lt;/h3&gt;
-
-&lt;p&gt;Following the &lt;a 
href=&quot;/news/2019/02/13/unified-batch-streaming-blink.html&quot;&gt;donation
 of
-Blink&lt;/a&gt; to
-Apache Flink, the community worked on integrating Blink’s query optimizer and
-runtime for the Table API and SQL. As a first step, we refactored the
-monolithic &lt;code&gt;flink-table&lt;/code&gt; module into smaller modules
-(&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-32%3A+Restructure+flink-table+for+future+contributions&quot;&gt;FLIP-32&lt;/a&gt;).
-This resulted in a clear separation of and well-defined interfaces between the
-Java and Scala API modules and the optimizer and runtime modules.&lt;/p&gt;
-
-&lt;p&gt;&lt;span&gt;&lt;img style=&quot;width:50%&quot; 
src=&quot;/img/blog/release-19-stack.png&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
-
-&lt;p&gt;Next, we extended Blink’s planner to implement the new optimizer 
interface
-such that there are now two pluggable query processors to execute Table API
-and SQL statements: the pre-1.9 Flink processor and the new Blink-based query
-processor. The Blink-based query processor offers better SQL coverage (full 
TPC-H
-coverage in 1.9, TPC-DS coverage is planned for the next release) and improved
-performance for batch queries as the result of more extensive query
-optimization (cost-based plan selection and more optimization rules), improved
-code-generation, and tuned operator implementations.
-The Blink-based query processor also provides a more powerful streaming runner,
-with some new features (e.g. dimension table join, TopN, deduplication) and 
-optimizations to solve data-skew in aggregation and more useful built-in
-functions.&lt;/p&gt;
-
-&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The semantics and set of supported 
operations of the query
-processors are mostly, but not fully aligned.&lt;/p&gt;
-
-&lt;p&gt;However, the integration of Blink’s query processor is not fully 
completed
-yet. Therefore, the pre-1.9 Flink processor is still the default processor in
-Flink 1.9 and recommended for production settings. You can enable the Blink
-processor by configuring it via the 
&lt;code&gt;EnvironmentSettings&lt;/code&gt; when creating a
-&lt;code&gt;TableEnvironment&lt;/code&gt;. The selected processor must be on 
the classpath of the
-executing Java process. For cluster setups, both query processors are
-automatically loaded with the default configuration. When running a query from
-your IDE you need to explicitly &lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-release-1.9/dev/table/#table-program-dependencies&quot;&gt;add
 a planner
-dependency&lt;/a&gt;
-to your project.&lt;/p&gt;
-
-&lt;h4 
id=&quot;other-improvements-to-the-table-api-and-sql&quot;&gt;&lt;strong&gt;Other
 Improvements to the Table API and SQL&lt;/strong&gt;&lt;/h4&gt;
-
-&lt;p&gt;Besides the exciting progress around the Blink planner, the community 
worked
-on a whole set of other improvements to these interfaces, including:&lt;/p&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;
-    &lt;p&gt;&lt;strong&gt;Scala-free Table API and SQL for Java users
-(&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-32%3A+Restructure+flink-table+for+future+contributions&quot;&gt;FLIP-32&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
-
-    &lt;p&gt;As part of the refactoring and splitting of the flink-table 
module, two
-separate API modules for Java and Scala were created. For Scala users,
-nothing really changes, but Java users can use the Table API and/or SQL now
-without pulling in a Scala dependency.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;&lt;strong&gt;Rework of the Table API Type System&lt;/strong&gt;
-&lt;strong&gt;(&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-37%3A+Rework+of+the+Table+API+Type+System&quot;&gt;FLIP-37&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
-
-    &lt;p&gt;The community implemented a &lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-release-1.9/dev/table/types.html#data-types&quot;&gt;new
 data type
-system&lt;/a&gt;
-to detach the Table API from Flink’s
-&lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-release-1.9/dev/types_serialization.html#flinks-typeinformation-class&quot;&gt;TypeInformation&lt;/a&gt;
-class and improve its compliance with the SQL standard. This is still a
-work in progress and expected to be completed in the next release. In
-Flink 1.9, UDFs are―among other things―not ported to the new type system
-yet.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;&lt;strong&gt;Multi-column and Multi-row Transformations for 
Table API&lt;/strong&gt;
-&lt;strong&gt;(&lt;a 
href=&quot;https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=97552739&quot;&gt;FLIP-29&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
-
-    &lt;p&gt;The functionality of the Table API was extended with a set of
-transformations that support multi-row and/or multi-column inputs and
-outputs. These transformations significantly ease the implementation of
-processing logic that would be cumbersome to implement with relational
-operators.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;&lt;strong&gt;New, Unified Catalog APIs&lt;/strong&gt;
-&lt;strong&gt;(&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-30%3A+Unified+Catalog+APIs&quot;&gt;FLIP-30&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
-
-    &lt;p&gt;We reworked the catalog APIs to store metadata and unified the 
handling of
-internal and external catalogs. This effort was mainly initiated as a
-prerequisite for the Hive integration (see below), but improves the overall
-convenience of managing catalog metadata in Flink. Besides improving the
-catalog interfaces, we also extended their functionality. Previously table
-definitions for Table API or SQL queries were volatile. With Flink 1.9, the
-metadata of tables which are registered with a SQL DDL statement can be
-persisted in a catalog. This means you can add a table that is backed by a
-Kafka topic to a Metastore catalog and from then on query this table
-whenever your catalog is connected to Metastore.&lt;/p&gt;
-  &lt;/li&gt;
-  &lt;li&gt;
-    &lt;p&gt;&lt;strong&gt;DDL Support in the SQL API
-(&lt;a 
href=&quot;https://issues.apache.org/jira/browse/FLINK-10232&quot;&gt;FLINK-10232&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;
-
-    &lt;p&gt;Up to this point, Flink SQL only supported DML statements (e.g. 
&lt;code&gt;SELECT&lt;/code&gt;,
-&lt;code&gt;INSERT&lt;/code&gt;). External tables (table sources and sinks) 
had to be registered
-via Java/Scala code or configuration files. For 1.9, we added support for
-SQL DDL statements to register and remove tables and views (&lt;code&gt;CREATE 
TABLE,
-DROP TABLE)&lt;/code&gt;. However, we did not add
-stream-specific syntax extensions to define timestamp extraction and
-watermark generation, yet. Full support for streaming use cases is planned
-for the next release.&lt;/p&gt;
-  &lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;h3 id=&quot;preview-of-full-hive-integration-flink-10556&quot;&gt;Preview 
of Full Hive Integration (FLINK-10556)&lt;/h3&gt;
-
-&lt;p&gt;Apache Hive is widely used in Hadoop’s ecosystem to store and query 
large
-amounts of structured data. Besides being a query processor, Hive features a
-catalog called Metastore to manage and organize large datasets. A common
-integration point for query processors is to integrate with Hive’s Metastore
-in order to be able to tap into the data managed by Hive.&lt;/p&gt;
-
-&lt;p&gt;Recently, the community started implementing an external catalog for 
Flink’s
-Table API and SQL that connects to Hive’s Metastore. In Flink 1.9, users will
-be able to query and process all data that is stored in Hive. As described
-earlier, you will also be able to persist metadata of Flink tables in 
Metastore.
-Moreover, the Hive integration includes support to use Hive’s UDFs in Flink
-Table API or SQL queries. More details are available in
-&lt;a 
href=&quot;https://issues.apache.org/jira/browse/FLINK-10556&quot;&gt;FLINK-10556&lt;/a&gt;.&lt;/p&gt;
-
-&lt;p&gt;While, previously, table definitions for Table API or SQL queries 
were always
-volatile, the new catalog connector additionally allows persisting a table in
-Metastore that is created with a SQL DDL statement (see above). This means
-that you connect to Metastore and register a table that is, for example,
-backed by a Kafka topic. From now on, you can query that table whenever your
-catalog is connected to Metastore.&lt;/p&gt;
-
-&lt;p&gt;Please note that the Hive support in Flink 1.9 is experimental. We are
-planning to stabilize these features for the next release and are looking
-forward to your feedback.&lt;/p&gt;
-
-&lt;h3 id=&quot;preview-of-the-new-python-table-api-flip-38&quot;&gt;Preview 
of the new Python Table API (FLIP-38)&lt;/h3&gt;
-
-&lt;p&gt;This release also introduces a first version of a Python Table API
-(&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-38%3A+Python+Table+API&quot;&gt;FLIP-38&lt;/a&gt;).
-This marks the start towards our goal of bringing
-full-fledged Python support to Flink. The feature was designed as a slim
-Python API wrapper around the Table API, basically translating Python Table
-API method calls into Java Table API calls. In the initial version that ships
-with Flink 1.9, the Python Table API does not support UDFs yet, but just
-standard relational operations. Support for UDFs implemented in Python is on
-the roadmap for future releases.&lt;/p&gt;
-
-&lt;p&gt;If you’d like to try the new Python API, you have to manually &lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-release-1.9/flinkDev/building.html#build-pyflink&quot;&gt;install
-PyFlink&lt;/a&gt;.
-From there, you can have a look at &lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-release-1.9/tutorials/python_table_api.html&quot;&gt;this
-walkthrough&lt;/a&gt;
-or explore it on your own. The &lt;a 
href=&quot;http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/VOTE-Publish-the-PyFlink-into-PyPI-td31201.html&quot;&gt;community
 is currently
-working&lt;/a&gt;
-on preparing a &lt;code&gt;pyflink&lt;/code&gt; Python package that will be 
made available for
-installation via &lt;code&gt;pip&lt;/code&gt;.&lt;/p&gt;
-
-&lt;h2 id=&quot;important-changes&quot;&gt;Important Changes&lt;/h2&gt;
-
-&lt;ul&gt;
-  &lt;li&gt;The Table API and SQL are now part of the default configuration of 
the
-Flink distribution. Before, the Table API and SQL had to be enabled by
-moving the corresponding JAR file from ./opt to ./lib.&lt;/li&gt;
-  &lt;li&gt;The machine learning library (flink-ml) has been removed in 
preparation for
-&lt;a 
href=&quot;https://docs.google.com/document/d/1StObo1DLp8iiy0rbukx8kwAJb0BwDZrQrMWub3DzsEo/edit&quot;&gt;FLIP-39&lt;/a&gt;.&lt;/li&gt;
-  &lt;li&gt;The old DataSet and DataStream Python APIs have been removed in 
favor of
-&lt;a 
href=&quot;https://cwiki.apache.org/confluence/display/FLINK/FLIP-38%3A+Python+Table+API&quot;&gt;FLIP-38&lt;/a&gt;.&lt;/li&gt;
-  &lt;li&gt;Flink can be compiled and run on Java 9. Note that certain 
components
-interacting with external systems (connectors, filesystems, reporters) may
-not work since the respective projects may have skipped Java 9 
support.&lt;/li&gt;
-&lt;/ul&gt;
-
-&lt;h2 id=&quot;release-notes&quot;&gt;Release Notes&lt;/h2&gt;
-
-&lt;p&gt;Please review the &lt;a 
href=&quot;https://nightlies.apache.org/flink/flink-docs-release-1.9/release-notes/flink-1.9.html&quot;&gt;release
-notes&lt;/a&gt;
-for a more detailed list of changes and new features if you plan to upgrade
-your Flink setup to Flink 1.9.0.&lt;/p&gt;
-
-&lt;h2 id=&quot;list-of-contributors&quot;&gt;List of Contributors&lt;/h2&gt;
-
-&lt;p&gt;We would like to thank all contributors who have made this release 
possible:&lt;/p&gt;
-
-&lt;p&gt;Abdul Qadeer (abqadeer), Aitozi, Alberto Romero, Aleksey Pak, 
Alexander
-Fedulov, Alice Yan, Aljoscha Krettek, Aloys, Andrew Duffy, Andrey Zagrebin,
-Ankur, Artsem Semianenka, Benchao Li, Biao Liu, Bo WANG, Bowen L, Chesnay
-Schepler, Clark Yang, Congxian Qiu, Cristian, Danny Chan, David Moravek, Dawid
-Wysakowicz, Dian Fu, EronWright, Fabian Hueske, Fabio Lombardelli, Fokko
-Driesprong, Gao Yun, Gary Yao, Gen Luo, Gyula Fora, Hequn Cheng,
-Hongtao Zhang, Huang Xingbo, HuangXingBo, Hugo Da Cruz Louro, Humberto
-Rodríguez A, Hwanju Kim, Igal Shilman, Jamie Grier, Jark Wu, Jason, Jasper
-Yue, Jeff Zhang, Jiangjie (Becket) Qin, Jiezhi.G, Jincheng Sun, Jing Zhang,
-Jingsong Lee, Juan Gentile, Jungtaek Lim, Kailash Dayanand, Kevin
-Bohinski, Konstantin Knauf, Konstantinos Papadopoulos, Kostas Kloudas, Kurt
-Young, Lakshmi, Lakshmi Gururaja Rao, Leeviiii, LouisXu, Maximilian Michels,
-Nico Kruber, Niels Basjes, Paul Lam, PengFei Li, Peter Huang, Pierre Zemb,
-Piotr Nowojski, Piyush Narang, Richard Deurwaarder, Robert Metzger, Robert
-Stoll, Romano Vacca, Rong Rong, Rui Li, Ryantaocer, Scott Mitchell, Seth
-Wiesman, Shannon Carey, Shimin Yang, Stefan Richter, Stephan Ewen, Stephen
-Connolly, Steven Wu, SuXingLee, TANG Wen-hui, Thomas Weise, Till Rohrmann,
-Timo Walther, Tom Goong, TsReaper, Tzu-Li (Gordon) Tai, Ufuk Celebi,
-Victor Wong, WangHengwei, Wei Zhong, WeiZhong94, Xintong Song, Xpray,
-XuQianJin-Stars, Xuefu Zhang, Xupingyong, Yangze Guo, Yu Li, Yun Gao, Yun
-Tang, Zhanchun Zhang, Zhenghua Gao, Zhijiang, Zhu Zhu, Zili
-Chen, aloys, arganzheng, azagrebin, bd2019us, beyond1920, biao.liub,
-blueszheng, boshu Zheng, chenqi, chummyhe89, chunpinghe, dcadmin,
-dianfu, godfrey he, guanghui01.rong, hehuiyuan, hello, hequn8128, 
-jackyyin, joongkeun.yang, klion26, lamber-ken, leesf, liguowei,
-lincoln-lil, liyafan82, luoqi, mans2singh, maqingxiang, maxin, mjl, okidogi,
-ozan, potseluev, qiangsi.lq, qiaoran, robbinli, shaoxuan-wang, shengqian.zhou,
-shenlang.sl, shuai-xu, sunhaibotb, tianchen, tianchen92,
-tison, tom_gong, vinoyang, vthinkxie, wanggeng3, wenhuitang, winifredtamg,
-xl38154, xuyang1706, yangfei5, yanghua, yuzhao.cyz,
-zhangxin516, zhangxinxing, zhaofaxian, zhijiang, zjuwangg, 林小铂,
-黄培松, 时无两丶.&lt;/p&gt;
-</description>
-<pubDate>Thu, 22 Aug 2019 04:30:00 +0200</pubDate>
-<link>https://flink.apache.org/news/2019/08/22/release-1.9.0.html</link>
-<guid isPermaLink="true">/news/2019/08/22/release-1.9.0.html</guid>
-</item>
-
 </channel>
 </rss>
diff --git a/content/blog/index.html b/content/blog/index.html
index a53f7a637..74caa4104 100644
--- a/content/blog/index.html
+++ b/content/blog/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/2022/05/30/changelog-state-backend.html">Improving speed and stability 
of checkpointing with generic log-based incremental checkpoints</a></h2>
+
+      <p>30 May 2022
+       Roman Khachatryan  &amp; Yuan Mei </p>
+
+      <p>This post describes the mechanism introduced in Flink 1.15 that 
continuously uploads state changes to a durable storage while performing 
materialization in the background</p>
+
+      <p><a href="/2022/05/30/changelog-state-backend.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a href="/2022/05/23/latency-part2.html">Getting 
into Low-Latency Gears with Apache Flink - Part Two</a></h2>
 
@@ -360,19 +373,6 @@ exciting changes.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a href="/2022/02/22/scala-free.html">Scala Free 
in One Fifteen</a></h2>
-
-      <p>22 Feb 2022
-       Seth Wiesman (<a 
href="https://twitter.com/sjwiesman";>@sjwiesman</a>)</p>
-
-      <p>Apache Flink's runtime is now Scala free, allowing users to leverage 
any Scala version in their user code - including Scala 3!</p>
-
-      <p><a href="/2022/02/22/scala-free.html">Continue reading &raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -405,6 +405,16 @@ exciting changes.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page10/index.html b/content/blog/page10/index.html
index 4cdfeed15..f6b7d8b70 100644
--- a/content/blog/page10/index.html
+++ b/content/blog/page10/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2020/01/30/release-1.9.2.html">Apache Flink 1.9.2 Released</a></h2>
+
+      <p>30 Jan 2020
+       Hequn Cheng (<a href="https://twitter.com/HequnC";>@HequnC</a>)</p>
+
+      <p><p>The Apache Flink community released the second bugfix version of 
the Apache Flink 1.9 series.</p>
+
+</p>
+
+      <p><a href="/news/2020/01/30/release-1.9.2.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2020/01/29/state-unlocked-interacting-with-state-in-apache-flink.html">State
 Unlocked: Interacting with State in Apache Flink</a></h2>
 
@@ -355,22 +370,6 @@
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2019/08/22/release-1.9.0.html">Apache Flink 1.9.0 Release 
Announcement</a></h2>
-
-      <p>22 Aug 2019
-      </p>
-
-      <p><p>The Apache Flink community is proud to announce the release of 
Apache Flink
-1.9.0.</p>
-
-</p>
-
-      <p><a href="/news/2019/08/22/release-1.9.0.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -403,6 +402,16 @@
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page11/index.html b/content/blog/page11/index.html
index f8acb25b4..1fee64966 100644
--- a/content/blog/page11/index.html
+++ b/content/blog/page11/index.html
@@ -232,6 +232,22 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2019/08/22/release-1.9.0.html">Apache Flink 1.9.0 Release 
Announcement</a></h2>
+
+      <p>22 Aug 2019
+      </p>
+
+      <p><p>The Apache Flink community is proud to announce the release of 
Apache Flink
+1.9.0.</p>
+
+</p>
+
+      <p><a href="/news/2019/08/22/release-1.9.0.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/2019/07/23/flink-network-stack-2.html">Flink Network Stack Vol. 2: 
Monitoring, Metrics, and that Backpressure Thing</a></h2>
 
@@ -359,19 +375,6 @@ for more details.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/features/2019/03/11/prometheus-monitoring.html">Flink and Prometheus: 
Cloud-native monitoring of streaming applications</a></h2>
-
-      <p>11 Mar 2019
-       Maximilian Bode, TNG Technology Consulting (<a 
href="https://twitter.com/mxpbode";>@mxpbode</a>)</p>
-
-      <p>This blog post describes how developers can leverage Apache Flink's 
built-in metrics system together with Prometheus to observe and monitor 
streaming applications in an effective way.</p>
-
-      <p><a href="/features/2019/03/11/prometheus-monitoring.html">Continue 
reading &raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -404,6 +407,16 @@ for more details.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page12/index.html b/content/blog/page12/index.html
index d542f250a..d53827fc8 100644
--- a/content/blog/page12/index.html
+++ b/content/blog/page12/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/features/2019/03/11/prometheus-monitoring.html">Flink and Prometheus: 
Cloud-native monitoring of streaming applications</a></h2>
+
+      <p>11 Mar 2019
+       Maximilian Bode, TNG Technology Consulting (<a 
href="https://twitter.com/mxpbode";>@mxpbode</a>)</p>
+
+      <p>This blog post describes how developers can leverage Apache Flink's 
built-in metrics system together with Prometheus to observe and monitor 
streaming applications in an effective way.</p>
+
+      <p><a href="/features/2019/03/11/prometheus-monitoring.html">Continue 
reading &raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a href="/news/2019/03/06/ffsf-preview.html">What 
to expect from Flink Forward San Francisco 2019</a></h2>
 
@@ -363,21 +376,6 @@ Please check the <a 
href="https://issues.apache.org/jira/secure/ReleaseNote.jspa
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2018/10/29/release-1.6.2.html">Apache Flink 1.6.2 Released</a></h2>
-
-      <p>29 Oct 2018
-      </p>
-
-      <p><p>The Apache Flink community released the second bugfix version of 
the Apache Flink 1.6 series.</p>
-
-</p>
-
-      <p><a href="/news/2018/10/29/release-1.6.2.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -410,6 +408,16 @@ Please check the <a 
href="https://issues.apache.org/jira/secure/ReleaseNote.jspa
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page13/index.html b/content/blog/page13/index.html
index b23b9466e..49ad92662 100644
--- a/content/blog/page13/index.html
+++ b/content/blog/page13/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2018/10/29/release-1.6.2.html">Apache Flink 1.6.2 Released</a></h2>
+
+      <p>29 Oct 2018
+      </p>
+
+      <p><p>The Apache Flink community released the second bugfix version of 
the Apache Flink 1.6 series.</p>
+
+</p>
+
+      <p><a href="/news/2018/10/29/release-1.6.2.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2018/10/29/release-1.5.5.html">Apache Flink 1.5.5 Released</a></h2>
 
@@ -367,21 +382,6 @@
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2018/03/08/release-1.4.2.html">Apache Flink 1.4.2 Released</a></h2>
-
-      <p>08 Mar 2018
-      </p>
-
-      <p><p>The Apache Flink community released the second bugfix version of 
the Apache Flink 1.4 series.</p>
-
-</p>
-
-      <p><a href="/news/2018/03/08/release-1.4.2.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -414,6 +414,16 @@
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page14/index.html b/content/blog/page14/index.html
index f5d820553..a9a2f74f9 100644
--- a/content/blog/page14/index.html
+++ b/content/blog/page14/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2018/03/08/release-1.4.2.html">Apache Flink 1.4.2 Released</a></h2>
+
+      <p>08 Mar 2018
+      </p>
+
+      <p><p>The Apache Flink community released the second bugfix version of 
the Apache Flink 1.4 series.</p>
+
+</p>
+
+      <p><a href="/news/2018/03/08/release-1.4.2.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/features/2018/03/01/end-to-end-exactly-once-apache-flink.html">An 
Overview of End-to-End Exactly-Once Processing in Apache Flink (with Apache 
Kafka, too!)</a></h2>
 
@@ -364,21 +379,6 @@ what’s coming in Flink 1.4.0 as well as a preview of what 
the Flink community
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2017/06/01/release-1.3.0.html">Apache Flink 1.3.0 Release 
Announcement</a></h2>
-
-      <p>01 Jun 2017 by Robert Metzger (<a 
href="https://twitter.com/";>@rmetzger_</a>)
-      </p>
-
-      <p><p>The Apache Flink community is pleased to announce the 1.3.0 
release. Over the past 4 months, the Flink community has been working hard to 
resolve more than 680 issues. See the <a 
href="/blog/release_1.3.0-changelog.html">complete changelog</a> for more 
detail.</p>
-
-</p>
-
-      <p><a href="/news/2017/06/01/release-1.3.0.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -411,6 +411,16 @@ what’s coming in Flink 1.4.0 as well as a preview of what 
the Flink community
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page15/index.html b/content/blog/page15/index.html
index 198312a24..2ee4f9092 100644
--- a/content/blog/page15/index.html
+++ b/content/blog/page15/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2017/06/01/release-1.3.0.html">Apache Flink 1.3.0 Release 
Announcement</a></h2>
+
+      <p>01 Jun 2017 by Robert Metzger (<a 
href="https://twitter.com/";>@rmetzger_</a>)
+      </p>
+
+      <p><p>The Apache Flink community is pleased to announce the 1.3.0 
release. Over the past 4 months, the Flink community has been working hard to 
resolve more than 680 issues. See the <a 
href="/blog/release_1.3.0-changelog.html">complete changelog</a> for more 
detail.</p>
+
+</p>
+
+      <p><a href="/news/2017/06/01/release-1.3.0.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2017/05/16/official-docker-image.html">Introducing Docker Images 
for Apache Flink</a></h2>
 
@@ -360,21 +375,6 @@
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2016/09/05/release-1.1.2.html">Apache Flink 1.1.2 Released</a></h2>
-
-      <p>05 Sep 2016
-      </p>
-
-      <p><p>The Apache Flink community released another bugfix version of the 
Apache Flink 1.1. series.</p>
-
-</p>
-
-      <p><a href="/news/2016/09/05/release-1.1.2.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -407,6 +407,16 @@
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page16/index.html b/content/blog/page16/index.html
index b8bd77ca8..629adc5e8 100644
--- a/content/blog/page16/index.html
+++ b/content/blog/page16/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2016/09/05/release-1.1.2.html">Apache Flink 1.1.2 Released</a></h2>
+
+      <p>05 Sep 2016
+      </p>
+
+      <p><p>The Apache Flink community released another bugfix version of the 
Apache Flink 1.1. series.</p>
+
+</p>
+
+      <p><a href="/news/2016/09/05/release-1.1.2.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2016/08/24/ff16-keynotes-panels.html">Flink Forward 2016: 
Announcing Schedule, Keynotes, and Panel Discussion</a></h2>
 
@@ -364,21 +379,6 @@
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2016/03/08/release-1.0.0.html">Announcing Apache Flink 
1.0.0</a></h2>
-
-      <p>08 Mar 2016
-      </p>
-
-      <p><p>The Apache Flink community is pleased to announce the availability 
of the 1.0.0 release. The community put significant effort into improving and 
extending Apache Flink since the last release, focusing on improving the 
experience of writing and executing data stream processing pipelines in 
production.</p>
-
-</p>
-
-      <p><a href="/news/2016/03/08/release-1.0.0.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -411,6 +411,16 @@
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page17/index.html b/content/blog/page17/index.html
index 9b508a0aa..202d2a5a2 100644
--- a/content/blog/page17/index.html
+++ b/content/blog/page17/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2016/03/08/release-1.0.0.html">Announcing Apache Flink 
1.0.0</a></h2>
+
+      <p>08 Mar 2016
+      </p>
+
+      <p><p>The Apache Flink community is pleased to announce the availability 
of the 1.0.0 release. The community put significant effort into improving and 
extending Apache Flink since the last release, focusing on improving the 
experience of writing and executing data stream processing pipelines in 
production.</p>
+
+</p>
+
+      <p><a href="/news/2016/03/08/release-1.0.0.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2016/02/11/release-0.10.2.html">Flink 0.10.2 Released</a></h2>
 
@@ -365,24 +380,6 @@ Apache Flink started.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2015/08/24/introducing-flink-gelly.html">Introducing Gelly: Graph 
Processing with Apache Flink</a></h2>
-
-      <p>24 Aug 2015
-      </p>
-
-      <p><p>This blog post introduces <strong>Gelly</strong>, Apache Flink’s 
<em>graph-processing API and library</em>. Flink’s native support
-for iterations makes it a suitable platform for large-scale graph analytics.
-By leveraging delta iterations, Gelly is able to map various graph processing 
models such as
-vertex-centric or gather-sum-apply to Flink dataflows.</p>
-
-</p>
-
-      <p><a href="/news/2015/08/24/introducing-flink-gelly.html">Continue 
reading &raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -415,6 +412,16 @@ vertex-centric or gather-sum-apply to Flink dataflows.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page18/index.html b/content/blog/page18/index.html
index 6f127f9e8..5f9ae971a 100644
--- a/content/blog/page18/index.html
+++ b/content/blog/page18/index.html
@@ -232,6 +232,24 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2015/08/24/introducing-flink-gelly.html">Introducing Gelly: Graph 
Processing with Apache Flink</a></h2>
+
+      <p>24 Aug 2015
+      </p>
+
+      <p><p>This blog post introduces <strong>Gelly</strong>, Apache Flink’s 
<em>graph-processing API and library</em>. Flink’s native support
+for iterations makes it a suitable platform for large-scale graph analytics.
+By leveraging delta iterations, Gelly is able to map various graph processing 
models such as
+vertex-centric or gather-sum-apply to Flink dataflows.</p>
+
+</p>
+
+      <p><a href="/news/2015/08/24/introducing-flink-gelly.html">Continue 
reading &raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2015/06/24/announcing-apache-flink-0.9.0-release.html">Announcing 
Apache Flink 0.9.0</a></h2>
 
@@ -374,21 +392,6 @@ and offers a new API including definition of flexible 
windows.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2015/01/21/release-0.8.html">Apache Flink 0.8.0 available</a></h2>
-
-      <p>21 Jan 2015
-      </p>
-
-      <p><p>We are pleased to announce the availability of Flink 0.8.0. This 
release includes new user-facing features as well as performance and bug fixes, 
extends the support for filesystems and introduces the Scala API and flexible 
windowing semantics for Flink Streaming. A total of 33 people have contributed 
to this release, a big thanks to all of them!</p>
-
-</p>
-
-      <p><a href="/news/2015/01/21/release-0.8.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -421,6 +424,16 @@ and offers a new API including definition of flexible 
windows.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page19/index.html b/content/blog/page19/index.html
index 7e9bb04e7..dc2b6ed6c 100644
--- a/content/blog/page19/index.html
+++ b/content/blog/page19/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2015/01/21/release-0.8.html">Apache Flink 0.8.0 available</a></h2>
+
+      <p>21 Jan 2015
+      </p>
+
+      <p><p>We are pleased to announce the availability of Flink 0.8.0. This 
release includes new user-facing features as well as performance and bug fixes, 
extends the support for filesystems and introduces the Scala API and flexible 
windowing semantics for Flink Streaming. A total of 33 people have contributed 
to this release, a big thanks to all of them!</p>
+
+</p>
+
+      <p><a href="/news/2015/01/21/release-0.8.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2015/01/06/december-in-flink.html">December 2014 in the Flink 
community</a></h2>
 
@@ -357,6 +372,16 @@ academic and open source project that Flink originates 
from.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page2/index.html b/content/blog/page2/index.html
index 6498d1ac7..57f885ac0 100644
--- a/content/blog/page2/index.html
+++ b/content/blog/page2/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a href="/2022/02/22/scala-free.html">Scala Free 
in One Fifteen</a></h2>
+
+      <p>22 Feb 2022
+       Seth Wiesman (<a 
href="https://twitter.com/sjwiesman";>@sjwiesman</a>)</p>
+
+      <p>Apache Flink's runtime is now Scala free, allowing users to leverage 
any Scala version in their user code - including Scala 3!</p>
+
+      <p><a href="/2022/02/22/scala-free.html">Continue reading &raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2022/02/18/release-1.13.6.html">Apache Flink 1.13.6 Release 
Announcement</a></h2>
 
@@ -356,19 +369,6 @@ This new release brings various improvements to the 
StateFun runtime, a leaner w
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a href="/2021/12/10/log4j-cve.html">Advise on 
Apache Log4j Zero Day (CVE-2021-44228)</a></h2>
-
-      <p>10 Dec 2021
-       Konstantin Knauf </p>
-
-      <p>Apache Flink is affected by an Apache Log4j Zero Day 
(CVE-2021-44228). This blog post contains advise for users on how to address 
this.</p>
-
-      <p><a href="/2021/12/10/log4j-cve.html">Continue reading &raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -401,6 +401,16 @@ This new release brings various improvements to the 
StateFun runtime, a leaner w
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page3/index.html b/content/blog/page3/index.html
index 4d4f8bafe..5af56e948 100644
--- a/content/blog/page3/index.html
+++ b/content/blog/page3/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a href="/2021/12/10/log4j-cve.html">Advise on 
Apache Log4j Zero Day (CVE-2021-44228)</a></h2>
+
+      <p>10 Dec 2021
+       Konstantin Knauf </p>
+
+      <p>Apache Flink is affected by an Apache Log4j Zero Day 
(CVE-2021-44228). This blog post contains advise for users on how to address 
this.</p>
+
+      <p><a href="/2021/12/10/log4j-cve.html">Continue reading &raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a href="/2021/11/03/flink-backward.html">Flink 
Backward - The Apache Flink Retrospective</a></h2>
 
@@ -367,21 +380,6 @@ This new release brings various improvements to the 
StateFun runtime, a leaner w
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2021/08/09/release-1.11.4.html">Apache Flink 1.11.4 
Released</a></h2>
-
-      <p>09 Aug 2021
-       Xiaoling He </p>
-
-      <p><p>The Apache Flink community released the next bugfix version of the 
Apache Flink 1.11 series.</p>
-
-</p>
-
-      <p><a href="/news/2021/08/09/release-1.11.4.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -414,6 +412,16 @@ This new release brings various improvements to the 
StateFun runtime, a leaner w
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page4/index.html b/content/blog/page4/index.html
index bc1f664cd..d7f30eead 100644
--- a/content/blog/page4/index.html
+++ b/content/blog/page4/index.html
@@ -232,6 +232,21 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2021/08/09/release-1.11.4.html">Apache Flink 1.11.4 
Released</a></h2>
+
+      <p>09 Aug 2021
+       Xiaoling He </p>
+
+      <p><p>The Apache Flink community released the next bugfix version of the 
Apache Flink 1.11 series.</p>
+
+</p>
+
+      <p><a href="/news/2021/08/09/release-1.11.4.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2021/08/06/release-1.13.2.html">Apache Flink 1.13.2 
Released</a></h2>
 
@@ -363,19 +378,6 @@ to develop scalable, consistent, and elastic distributed 
applications.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a href="/2021/03/11/batch-execution-mode.html">A 
Rundown of Batch Execution Mode in the DataStream API</a></h2>
-
-      <p>11 Mar 2021
-       Dawid Wysakowicz (<a 
href="https://twitter.com/dwysakowicz";>@dwysakowicz</a>)</p>
-
-      <p>Apache Flink 1.12 introduced batch execution mode through FLIP-140. 
This blog post discusses when to use the new mode, discusses its benefits and 
gives examples of programs that can be run in it.</p>
-
-      <p><a href="/2021/03/11/batch-execution-mode.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -408,6 +410,16 @@ to develop scalable, consistent, and elastic distributed 
applications.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page5/index.html b/content/blog/page5/index.html
index 536fa85d0..c4c2622ff 100644
--- a/content/blog/page5/index.html
+++ b/content/blog/page5/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a href="/2021/03/11/batch-execution-mode.html">A 
Rundown of Batch Execution Mode in the DataStream API</a></h2>
+
+      <p>11 Mar 2021
+       Dawid Wysakowicz (<a 
href="https://twitter.com/dwysakowicz";>@dwysakowicz</a>)</p>
+
+      <p>Apache Flink 1.12 introduced batch execution mode through FLIP-140. 
This blog post discusses when to use the new mode, discusses its benefits and 
gives examples of programs that can be run in it.</p>
+
+      <p><a href="/2021/03/11/batch-execution-mode.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2021/03/03/release-1.12.2.html">Apache Flink 1.12.2 
Released</a></h2>
 
@@ -359,19 +372,6 @@
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/2020/12/15/pipelined-region-sheduling.html">Improvements in task 
scheduling for batch workloads in Apache Flink 1.12</a></h2>
-
-      <p>15 Dec 2020
-       Andrey Zagrebin </p>
-
-      <p>In this blogpost, we’ll take a closer look at how far the community 
has come in improving task scheduling for batch workloads, why this matters and 
what you can expect in Flink 1.12 with the new pipelined region scheduler.</p>
-
-      <p><a href="/2020/12/15/pipelined-region-sheduling.html">Continue 
reading &raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -404,6 +404,16 @@
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page6/index.html b/content/blog/page6/index.html
index b434b454a..167c1b874 100644
--- a/content/blog/page6/index.html
+++ b/content/blog/page6/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/2020/12/15/pipelined-region-sheduling.html">Improvements in task 
scheduling for batch workloads in Apache Flink 1.12</a></h2>
+
+      <p>15 Dec 2020
+       Andrey Zagrebin </p>
+
+      <p>In this blogpost, we’ll take a closer look at how far the community 
has come in improving task scheduling for batch workloads, why this matters and 
what you can expect in Flink 1.12 with the new pipelined region scheduler.</p>
+
+      <p><a href="/2020/12/15/pipelined-region-sheduling.html">Continue 
reading &raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/news/2020/12/10/release-1.12.0.html">Apache Flink 1.12.0 Release 
Announcement</a></h2>
 
@@ -361,19 +374,6 @@ as well as increased observability for operational 
purposes.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a href="/news/2020/08/20/flink-docker.html">The 
State of Flink on Docker</a></h2>
-
-      <p>20 Aug 2020
-       Robert Metzger (<a 
href="https://twitter.com/rmetzger_";>@rmetzger_</a>)</p>
-
-      <p>This blog post gives an update on the recent developments of Flink's 
support for Docker.</p>
-
-      <p><a href="/news/2020/08/20/flink-docker.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -406,6 +406,16 @@ as well as increased observability for operational 
purposes.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page7/index.html b/content/blog/page7/index.html
index c2331844a..b432aced7 100644
--- a/content/blog/page7/index.html
+++ b/content/blog/page7/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a href="/news/2020/08/20/flink-docker.html">The 
State of Flink on Docker</a></h2>
+
+      <p>20 Aug 2020
+       Robert Metzger (<a 
href="https://twitter.com/rmetzger_";>@rmetzger_</a>)</p>
+
+      <p>This blog post gives an update on the recent developments of Flink's 
support for Docker.</p>
+
+      <p><a href="/news/2020/08/20/flink-docker.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a href="/2020/08/19/statefun.html">Monitoring 
and Controlling Networks of IoT Devices with Flink Stateful Functions</a></h2>
 
@@ -362,19 +375,6 @@ illustrate this trend.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2020/07/06/release-1.11.0.html">Apache Flink 1.11.0 Release 
Announcement</a></h2>
-
-      <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. We're particularly excited about unaligned 
checkpoints to cope with high backpressure scenarios, a new source API that 
simplifies and unifies the implementation of (custom) sources, and support for 
Change Data Capture (CDC) and other comm [...]
-
-      <p><a href="/news/2020/07/06/release-1.11.0.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -407,6 +407,16 @@ illustrate this trend.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page8/index.html b/content/blog/page8/index.html
index aadc1ee6c..89e189b35 100644
--- a/content/blog/page8/index.html
+++ b/content/blog/page8/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2020/07/06/release-1.11.0.html">Apache Flink 1.11.0 Release 
Announcement</a></h2>
+
+      <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. We're particularly excited about unaligned 
checkpoints to cope with high backpressure scenarios, a new source API that 
simplifies and unifies the implementation of (custom) sources, and support for 
Change Data Capture (CDC) and other comm [...]
+
+      <p><a href="/news/2020/07/06/release-1.11.0.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/ecosystem/2020/06/23/flink-on-zeppelin-part2.html">Flink on Zeppelin 
Notebooks for Interactive Data Analysis - Part 2</a></h2>
 
@@ -362,19 +375,6 @@ and provide a tutorial for running Streaming ETL with 
Flink on Zeppelin.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2020/04/15/flink-serialization-tuning-vol-1.html">Flink 
Serialization Tuning Vol. 1: Choosing your Serializer — if you can</a></h2>
-
-      <p>15 Apr 2020
-       Nico Kruber </p>
-
-      <p>Serialization is a crucial element of your Flink job. This article is 
the first in a series of posts that will highlight Flink’s serialization stack, 
and looks at the different ways Flink can serialize your data types.</p>
-
-      <p><a 
href="/news/2020/04/15/flink-serialization-tuning-vol-1.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -407,6 +407,16 @@ and provide a tutorial for running Streaming ETL with 
Flink on Zeppelin.</p>
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git a/content/blog/page9/index.html b/content/blog/page9/index.html
index e92be5049..9ccef1923 100644
--- a/content/blog/page9/index.html
+++ b/content/blog/page9/index.html
@@ -232,6 +232,19 @@
   <div class="col-sm-8">
     <!-- Blog posts -->
     
+    <article>
+      <h2 class="blog-title"><a 
href="/news/2020/04/15/flink-serialization-tuning-vol-1.html">Flink 
Serialization Tuning Vol. 1: Choosing your Serializer — if you can</a></h2>
+
+      <p>15 Apr 2020
+       Nico Kruber </p>
+
+      <p>Serialization is a crucial element of your Flink job. This article is 
the first in a series of posts that will highlight Flink’s serialization stack, 
and looks at the different ways Flink can serialize your data types.</p>
+
+      <p><a 
href="/news/2020/04/15/flink-serialization-tuning-vol-1.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
     <article>
       <h2 class="blog-title"><a 
href="/2020/04/09/pyflink-udf-support-flink.html">PyFlink: Introducing Python 
Support for UDFs in Flink's Table API</a></h2>
 
@@ -356,21 +369,6 @@ This release marks a big milestone: Stateful Functions 2.0 
is not only an API up
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2020/01/30/release-1.9.2.html">Apache Flink 1.9.2 Released</a></h2>
-
-      <p>30 Jan 2020
-       Hequn Cheng (<a href="https://twitter.com/HequnC";>@HequnC</a>)</p>
-
-      <p><p>The Apache Flink community released the second bugfix version of 
the Apache Flink 1.9 series.</p>
-
-</p>
-
-      <p><a href="/news/2020/01/30/release-1.9.2.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -403,6 +401,16 @@ This release marks a big milestone: Stateful Functions 2.0 
is not only an API up
 
     <ul id="markdown-toc">
       
+      <li><a href="/2022/05/30/changelog-state-backend.html">Improving speed 
and stability of checkpointing with generic log-based incremental 
checkpoints</a></li>
+
+      
+        
+      
+    
+      
+      
+
+      
       <li><a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></li>
 
       
diff --git 
a/content/img/blog/2022-05-30-changelog-state-backend/changelog-simple.png 
b/content/img/blog/2022-05-30-changelog-state-backend/changelog-simple.png
new file mode 100644
index 000000000..2bb814a51
Binary files /dev/null and 
b/content/img/blog/2022-05-30-changelog-state-backend/changelog-simple.png 
differ
diff --git 
a/content/img/blog/2022-05-30-changelog-state-backend/checkpoint-timing.png 
b/content/img/blog/2022-05-30-changelog-state-backend/checkpoint-timing.png
new file mode 100644
index 000000000..fdd0b7882
Binary files /dev/null and 
b/content/img/blog/2022-05-30-changelog-state-backend/checkpoint-timing.png 
differ
diff --git 
a/content/img/blog/2022-05-30-changelog-state-backend/failing-task.png 
b/content/img/blog/2022-05-30-changelog-state-backend/failing-task.png
new file mode 100644
index 000000000..662bf393e
Binary files /dev/null and 
b/content/img/blog/2022-05-30-changelog-state-backend/failing-task.png differ
diff --git 
a/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_1.png 
b/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_1.png
new file mode 100644
index 000000000..7733f063a
Binary files /dev/null and 
b/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_1.png 
differ
diff --git 
a/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_2.png 
b/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_2.png
new file mode 100644
index 000000000..be1326b87
Binary files /dev/null and 
b/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_2.png 
differ
diff --git 
a/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_3.png 
b/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_3.png
new file mode 100644
index 000000000..1cd68d731
Binary files /dev/null and 
b/content/img/blog/2022-05-30-changelog-state-backend/log_checkpoints_3.png 
differ
diff --git a/content/index.html b/content/index.html
index eb2ef30f8..78e921d54 100644
--- a/content/index.html
+++ b/content/index.html
@@ -397,6 +397,9 @@
 
   <dl>
       
+        <dt> <a href="/2022/05/30/changelog-state-backend.html">Improving 
speed and stability of checkpointing with generic log-based incremental 
checkpoints</a></dt>
+        <dd>This post describes the mechanism introduced in Flink 1.15 that 
continuously uploads state changes to a durable storage while performing 
materialization in the background</dd>
+      
         <dt> <a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></dt>
         <dd>This multi-part series of blog post presents a collection of 
low-latency techniques in Flink. Following with part one, Part two continues  
with a few more techniques that optimize latency directly.</dd>
       
@@ -411,9 +414,6 @@
       
         <dt> <a href="/2022/05/06/async-sink-base.html">The Generic 
Asynchronous Base Sink</a></dt>
         <dd>An overview of the new AsyncBaseSink and how to use it for 
building your own concrete sink</dd>
-      
-        <dt> <a href="/2022/05/06/pyflink-1.15-thread-mode.html">Exploring the 
thread mode in PyFlink</a></dt>
-        <dd>Flink 1.15 introduced a new Runtime Execution Mode named 'thread' 
mode in PyFlink. This post explains how it works and when to use it.</dd>
     
   </dl>
 
diff --git a/content/zh/index.html b/content/zh/index.html
index 39afbfe35..1121a2566 100644
--- a/content/zh/index.html
+++ b/content/zh/index.html
@@ -394,6 +394,9 @@
 
   <dl>
       
+        <dt> <a href="/2022/05/30/changelog-state-backend.html">Improving 
speed and stability of checkpointing with generic log-based incremental 
checkpoints</a></dt>
+        <dd>This post describes the mechanism introduced in Flink 1.15 that 
continuously uploads state changes to a durable storage while performing 
materialization in the background</dd>
+      
         <dt> <a href="/2022/05/23/latency-part2.html">Getting into Low-Latency 
Gears with Apache Flink - Part Two</a></dt>
         <dd>This multi-part series of blog post presents a collection of 
low-latency techniques in Flink. Following with part one, Part two continues  
with a few more techniques that optimize latency directly.</dd>
       
@@ -408,9 +411,6 @@
       
         <dt> <a href="/2022/05/06/async-sink-base.html">The Generic 
Asynchronous Base Sink</a></dt>
         <dd>An overview of the new AsyncBaseSink and how to use it for 
building your own concrete sink</dd>
-      
-        <dt> <a href="/2022/05/06/pyflink-1.15-thread-mode.html">Exploring the 
thread mode in PyFlink</a></dt>
-        <dd>Flink 1.15 introduced a new Runtime Execution Mode named 'thread' 
mode in PyFlink. This post explains how it works and when to use it.</dd>
     
   </dl>
 

Reply via email to