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> + + + + <!-- 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> + + + <!-- Third menu section aim to support community and contributors --> + + <!-- Community --> + <li><a href="/community.html">Community & 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> + + + + <!-- 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 & 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"> </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: <location similar to state.checkpoints.dir> +</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> · <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><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>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-checkpo [...] + +<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 [...] + +<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> +</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><p>This series of blog posts present a collection of low-latency techniques in Flink. In <a href="https://flink.apache.org/2022/05/18/latency-part1.html">part one</a>, 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='3', 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><p>The Apache Flink community is proud to announce the release of Apache Flink -1.9.0.</p> - -<p>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.</p> - -<p>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.</p> - -<p>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 <a href="https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315522&amp;version=12344601">complete release -changelog</a>.</p> - -<p>The binary distribution and source artifacts for this release are now -available via the <a href="https://flink.apache.org/downloads.html">Downloads</a> page of -the Flink project, along with the updated -<a href="https://nightlies.apache.org/flink/flink-docs-release-1.9/">documentation</a>. -Flink 1.9 is API-compatible with previous 1.x releases for APIs annotated with -the <code>@Public</code> annotation.</p> - -<p>Please feel encouraged to download the release and share your thoughts with -the community through the Flink <a href="https://flink.apache.org/community.html#mailing-lists">mailing -lists</a> or -<a href="https://issues.apache.org/jira/projects/FLINK/summary">JIRA</a>. As always, -feedback is very much appreciated!</p> - -<div class="page-toc"> -<ul id="markdown-toc"> - <li><a href="#new-features-and-improvements" id="markdown-toc-new-features-and-improvements">New Features and Improvements</a> <ul> - <li><a href="#fine-grained-batch-recovery-flip-1" id="markdown-toc-fine-grained-batch-recovery-flip-1">Fine-grained Batch Recovery (FLIP-1)</a></li> - <li><a href="#state-processor-api-flip-43" id="markdown-toc-state-processor-api-flip-43">State Processor API (FLIP-43)</a></li> - <li><a href="#stop-with-savepoint-flip-34" id="markdown-toc-stop-with-savepoint-flip-34">Stop-with-Savepoint (FLIP-34)</a></li> - <li><a href="#flink-webui-rework" id="markdown-toc-flink-webui-rework">Flink WebUI Rework</a></li> - <li><a href="#preview-of-the-new-blink-sql-query-processor" id="markdown-toc-preview-of-the-new-blink-sql-query-processor">Preview of the new Blink SQL Query Processor</a></li> - <li><a href="#preview-of-full-hive-integration-flink-10556" id="markdown-toc-preview-of-full-hive-integration-flink-10556">Preview of Full Hive Integration (FLINK-10556)</a></li> - <li><a href="#preview-of-the-new-python-table-api-flip-38" id="markdown-toc-preview-of-the-new-python-table-api-flip-38">Preview of the new Python Table API (FLIP-38)</a></li> - </ul> - </li> - <li><a href="#important-changes" id="markdown-toc-important-changes">Important Changes</a></li> - <li><a href="#release-notes" id="markdown-toc-release-notes">Release Notes</a></li> - <li><a href="#list-of-contributors" id="markdown-toc-list-of-contributors">List of Contributors</a></li> -</ul> - -</div> - -<h2 id="new-features-and-improvements">New Features and Improvements</h2> - -<h3 id="fine-grained-batch-recovery-flip-1">Fine-grained Batch Recovery (FLIP-1)</h3> - -<p>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 <strong>failover region</strong>. 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 -<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-1+%3A+Fine+Grained+Recovery+from+Task+Failures">FLIP-1</a>. -<img src="/img/blog/release-19-flip1.png" alt="alt_text" title="Fine-grained Batch -Recovery" /></p> - -<p>To use this new failover strategy, you need to do the following -settings:</p> - -<ul> - <li>Make sure you have the entry <code>jobmanager.execution.failover-strategy: -region</code> in your <code>flink-conf.yaml</code>.</li> -</ul> - -<p><strong>Note:</strong> 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.</p> - -<p>Moreover, you need to set the <code>ExecutionMode</code> of batch jobs in the -<code>ExecutionConfig</code> to <code>BATCH</code> to configure that data shuffles are not pipelined -and jobs have more than one failover region.</p> - -<p>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.</p> - -<h3 id="state-processor-api-flip-43">State Processor API (FLIP-43)</h3> - -<p>Up to Flink 1.9, accessing the state of a job from the outside was limited to -the (still) experimental <a href="https://nightlies.apache.org/flink/flink-docs-stable/dev/stream/state/queryable_state.html">Queryable -State</a>. -This release introduces a new, powerful library to read, write and modify -state snapshots using the batch DataSet API. In practice, this means:</p> - -<ul> - <li>Flink job state can be bootstrapped by reading data from external systems, -such as external databases, and converting it into a savepoint.</li> - <li>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.</li> - <li>The schema of state in savepoints can be migrated offline, compared to the -previous approach requiring online migration on schema access.</li> - <li>Invalid data in savepoints can be identified and corrected.</li> -</ul> - -<p>The new State Processor API covers all variations of snapshots: savepoints, -full checkpoints and incremental checkpoints. More details are available in -<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-43%3A+State+Processor+API">FLIP-43</a></p> - -<h3 id="stop-with-savepoint-flip-34">Stop-with-Savepoint (FLIP-34)</h3> - -<p><a href="https://nightlies.apache.org/flink/flink-docs-stable/ops/state/savepoints.html#operations">Cancelling with a -savepoint</a> -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 <code>SUSPEND</code> 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:</p> - -<div class="highlight"><pre><code>bin/flink stop -p [:targetDirectory] :jobId -</code></pre></div> - -<p>The final job state is set to <code>FINISHED</code> on success, allowing -users to detect failures of the requested operation.</p> - -<p>More details are available in -<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=103090212">FLIP-34</a></p> - -<h3 id="flink-webui-rework">Flink WebUI Rework</h3> - -<p>After a -<a href="http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Change-underlying-Frontend-Architecture-for-Flink-Web-Dashboard-td24902.html">discussion</a> -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.</p> - -<div class="row"> <div class="col-sm-6"> <span><img class="thumbnail" src="/img/blog/release-19-web1.png" /></span> </div> <div class="col-sm-6"> <span><img class="thumbnail" src="/img/blog/release-19-web2.png" /></span> </div> - </div> - -<p><strong>Note:</strong> Moving forward, feature parity for the old version of the WebUI -will not be guaranteed.</p> - -<h3 id="preview-of-the-new-blink-sql-query-processor">Preview of the new Blink SQL Query Processor</h3> - -<p>Following the <a href="/news/2019/02/13/unified-batch-streaming-blink.html">donation of -Blink</a> 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 <code>flink-table</code> module into smaller modules -(<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-32%3A+Restructure+flink-table+for+future+contributions">FLIP-32</a>). -This resulted in a clear separation of and well-defined interfaces between the -Java and Scala API modules and the optimizer and runtime modules.</p> - -<p><span><img style="width:50%" src="/img/blog/release-19-stack.png" /></span></p> - -<p>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.</p> - -<p><strong>Note:</strong> The semantics and set of supported operations of the query -processors are mostly, but not fully aligned.</p> - -<p>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 <code>EnvironmentSettings</code> when creating a -<code>TableEnvironment</code>. 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 <a href="https://nightlies.apache.org/flink/flink-docs-release-1.9/dev/table/#table-program-dependencies">add a planner -dependency</a> -to your project.</p> - -<h4 id="other-improvements-to-the-table-api-and-sql"><strong>Other Improvements to the Table API and SQL</strong></h4> - -<p>Besides the exciting progress around the Blink planner, the community worked -on a whole set of other improvements to these interfaces, including:</p> - -<ul> - <li> - <p><strong>Scala-free Table API and SQL for Java users -(<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-32%3A+Restructure+flink-table+for+future+contributions">FLIP-32</a>)</strong></p> - - <p>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.</p> - </li> - <li> - <p><strong>Rework of the Table API Type System</strong> -<strong>(<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-37%3A+Rework+of+the+Table+API+Type+System">FLIP-37</a>)</strong></p> - - <p>The community implemented a <a href="https://nightlies.apache.org/flink/flink-docs-release-1.9/dev/table/types.html#data-types">new data type -system</a> -to detach the Table API from Flink’s -<a href="https://nightlies.apache.org/flink/flink-docs-release-1.9/dev/types_serialization.html#flinks-typeinformation-class">TypeInformation</a> -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.</p> - </li> - <li> - <p><strong>Multi-column and Multi-row Transformations for Table API</strong> -<strong>(<a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=97552739">FLIP-29</a>)</strong></p> - - <p>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.</p> - </li> - <li> - <p><strong>New, Unified Catalog APIs</strong> -<strong>(<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-30%3A+Unified+Catalog+APIs">FLIP-30</a>)</strong></p> - - <p>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.</p> - </li> - <li> - <p><strong>DDL Support in the SQL API -(<a href="https://issues.apache.org/jira/browse/FLINK-10232">FLINK-10232</a>)</strong></p> - - <p>Up to this point, Flink SQL only supported DML statements (e.g. <code>SELECT</code>, -<code>INSERT</code>). 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 (<code>CREATE TABLE, -DROP TABLE)</code>. 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.</p> - </li> -</ul> - -<h3 id="preview-of-full-hive-integration-flink-10556">Preview of Full Hive Integration (FLINK-10556)</h3> - -<p>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.</p> - -<p>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 -<a href="https://issues.apache.org/jira/browse/FLINK-10556">FLINK-10556</a>.</p> - -<p>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.</p> - -<p>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.</p> - -<h3 id="preview-of-the-new-python-table-api-flip-38">Preview of the new Python Table API (FLIP-38)</h3> - -<p>This release also introduces a first version of a Python Table API -(<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-38%3A+Python+Table+API">FLIP-38</a>). -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.</p> - -<p>If you’d like to try the new Python API, you have to manually <a href="https://nightlies.apache.org/flink/flink-docs-release-1.9/flinkDev/building.html#build-pyflink">install -PyFlink</a>. -From there, you can have a look at <a href="https://nightlies.apache.org/flink/flink-docs-release-1.9/tutorials/python_table_api.html">this -walkthrough</a> -or explore it on your own. The <a href="http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/VOTE-Publish-the-PyFlink-into-PyPI-td31201.html">community is currently -working</a> -on preparing a <code>pyflink</code> Python package that will be made available for -installation via <code>pip</code>.</p> - -<h2 id="important-changes">Important Changes</h2> - -<ul> - <li>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.</li> - <li>The machine learning library (flink-ml) has been removed in preparation for -<a href="https://docs.google.com/document/d/1StObo1DLp8iiy0rbukx8kwAJb0BwDZrQrMWub3DzsEo/edit">FLIP-39</a>.</li> - <li>The old DataSet and DataStream Python APIs have been removed in favor of -<a href="https://cwiki.apache.org/confluence/display/FLINK/FLIP-38%3A+Python+Table+API">FLIP-38</a>.</li> - <li>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.</li> -</ul> - -<h2 id="release-notes">Release Notes</h2> - -<p>Please review the <a href="https://nightlies.apache.org/flink/flink-docs-release-1.9/release-notes/flink-1.9.html">release -notes</a> -for a more detailed list of changes and new features if you plan to upgrade -your Flink setup to Flink 1.9.0.</p> - -<h2 id="list-of-contributors">List of Contributors</h2> - -<p>We would like to thank all contributors who have made this release possible:</p> - -<p>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, 林小铂, -黄培松, 时无两丶.</p> -</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 & 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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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 »</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>
