Rebuild website

This closes #100.


Project: http://git-wip-us.apache.org/repos/asf/flink-web/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink-web/commit/035337bd
Tree: http://git-wip-us.apache.org/repos/asf/flink-web/tree/035337bd
Diff: http://git-wip-us.apache.org/repos/asf/flink-web/diff/035337bd

Branch: refs/heads/asf-site
Commit: 035337bd381b913ad2ec69aaa13f92061a1faff8
Parents: 8f98e45
Author: Fabian Hueske <[email protected]>
Authored: Wed Feb 7 18:58:14 2018 +0100
Committer: Fabian Hueske <[email protected]>
Committed: Wed Feb 7 18:58:30 2018 +0100

----------------------------------------------------------------------
 content/blog/feed.xml                           |  90 ++++++
 content/blog/index.html                         |  44 ++-
 content/blog/page2/index.html                   |  46 +--
 content/blog/page3/index.html                   |  45 ++-
 content/blog/page4/index.html                   |  44 ++-
 content/blog/page5/index.html                   |  46 +--
 content/blog/page6/index.html                   |  32 ++-
 .../2018/01/30/incremental-checkpointing.html   | 277 +++++++++++++++++++
 .../img/blog/incremental_cp_impl_example.svg    |   3 +
 content/index.html                              |   6 +-
 10 files changed, 553 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/blog/feed.xml
----------------------------------------------------------------------
diff --git a/content/blog/feed.xml b/content/blog/feed.xml
index 2006044..0c44c61 100644
--- a/content/blog/feed.xml
+++ b/content/blog/feed.xml
@@ -7,6 +7,96 @@
 <atom:link href="http://flink.apache.org/blog/feed.xml"; rel="self" 
type="application/rss+xml" />
 
 <item>
+<title>Managing Large State in Apache Flink: An Intro to Incremental 
Checkpointing</title>
+<description>&lt;p&gt;Apache Flink was purpose-built for 
&lt;em&gt;stateful&lt;/em&gt; stream processing. However, what is state in a 
stream processing application? I defined state and stateful stream processing 
in a &lt;a 
href=&quot;http://flink.apache.org/features/2017/07/04/flink-rescalable-state.html&quot;&gt;previous
 blog post&lt;/a&gt;, and in case you need a refresher, &lt;em&gt;state is 
defined as memory in an application’s operators that stores information about 
previously-seen events that you can use to influence the processing of future 
events&lt;/em&gt;.&lt;/p&gt;
+
+&lt;p&gt;State is a fundamental, enabling concept in stream processing 
required for a majority of complex use cases. Some examples highlighted in the 
&lt;a 
href=&quot;https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/state.html&quot;&gt;Flink
 documentation&lt;/a&gt;:&lt;/p&gt;
+
+&lt;ul&gt;
+  &lt;li&gt;When an application searches for certain event patterns, the state 
stores the sequence of events encountered so far.&lt;/li&gt;
+  &lt;li&gt;When aggregating events per minute, the state holds the pending 
aggregates.&lt;/li&gt;
+  &lt;li&gt;When training a machine learning model over a stream of data 
points, the state holds the current version of the model parameters.&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;p&gt;However, stateful stream processing is only useful in production 
environments if the state is fault tolerant. “Fault tolerance” means that 
even if there’s a software or machine failure, the computed end-result is 
accurate, with no data loss or double-counting of events.&lt;/p&gt;
+
+&lt;p&gt;Flink’s fault tolerance has always been a powerful and popular 
feature, minimizing the impact of software or machine failure on your business 
and making it possible to guarantee exactly-once results from a Flink 
application.&lt;/p&gt;
+
+&lt;p&gt;Core to this is &lt;a 
href=&quot;https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/checkpointing.html&quot;&gt;checkpointing&lt;/a&gt;,
 which is the mechanism Flink uses to make application state fault tolerant. A 
checkpoint in Flink is a global, asynchronous snapshot of application state 
that’s taken on a regular interval and sent to durable storage (usually, a 
distributed file system). In the event of a failure, Flink restarts an 
application using the most recently completed checkpoint as a starting point. 
Some Apache Flink users run applications with gigabytes or even terabytes of 
application state. These users reported that with such large state, creating a 
checkpoint was often a slow and resource intensive operation, which is why in 
Flink 1.3 we introduced ‘incremental checkpointing.’&lt;/p&gt;
+
+&lt;p&gt;Before incremental checkpointing, every single Flink checkpoint 
consisted of the full state of an application. We created the incremental 
checkpointing feature after we noticed that writing the full state for every 
checkpoint was often unnecessary, as the state changes from one checkpoint to 
the next were rarely that large. Incremental checkpointing instead maintains 
the differences (or ‘delta’) between each checkpoint and stores only the 
differences between the last checkpoint and the current state.&lt;/p&gt;
+
+&lt;p&gt;Incremental checkpoints can provide a significant performance 
improvement for jobs with a very large state. Early testing of the feature by a 
production user with terabytes of state shows a drop in checkpoint time from 
more than 3 minutes down to 30 seconds after implementing incremental 
checkpoints. This is because the checkpoint doesn’t need to transfer the full 
state to durable storage on each checkpoint.&lt;/p&gt;
+
+&lt;h3 id=&quot;how-to-start&quot;&gt;How to Start&lt;/h3&gt;
+
+&lt;p&gt;Currently, you can only use incremental checkpointing with a RocksDB 
state back-end, and Flink uses RocksDB’s internal backup mechanism to 
consolidate checkpoint data over time. As a result, the incremental checkpoint 
history in Flink does not grow indefinitely, and Flink eventually consumes and 
prunes old checkpoints automatically.&lt;/p&gt;
+
+&lt;p&gt;To enable incremental checkpointing in your application, I recommend 
you read the &lt;a 
href=&quot;https://ci.apache.org/projects/flink/flink-docs-release-1.4/ops/state/large_state_tuning.html#tuning-rocksdb&quot;&gt;the
 Apache Flink documentation on checkpointing&lt;/a&gt; for full details, but in 
summary, you enable checkpointing as normal, but enable incremental 
checkpointing in the constructor by setting the second parameter to 
&lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;
+
+&lt;h4 id=&quot;java-example&quot;&gt;Java Example&lt;/h4&gt;
+
+&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code 
class=&quot;language-java&quot;&gt;&lt;span 
class=&quot;n&quot;&gt;StreamExecutionEnvironment&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;env&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;StreamExecutionEnvironment&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;getExecutionEnvironment&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;();&lt;/span&gt;
+&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;setStateBackend&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;RocksDBStateBackend&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;filebackend&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;));&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
+
+&lt;h4 id=&quot;scala-example&quot;&gt;Scala Example&lt;/h4&gt;
+
+&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code 
class=&quot;language-scala&quot;&gt;&lt;span 
class=&quot;k&quot;&gt;val&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;env&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;StreamExecutionEnvironment&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;getExecutionEnvironment&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt;
+&lt;span class=&quot;n&quot;&gt;env&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;setStateBackend&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;nc&quot;&gt;RocksDBStateBackend&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;filebackend&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
+
+&lt;p&gt;By default, Flink retains 1 completed checkpoint, so if you need a 
higher number, &lt;a 
href=&quot;https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/state/checkpointing.html#related-config-options&quot;&gt;you
 can configure it with the following flag&lt;/a&gt;:&lt;/p&gt;
+
+&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code 
class=&quot;language-java&quot;&gt;&lt;span 
class=&quot;n&quot;&gt;state&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;checkpoints&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;num&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;retained&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
+
+&lt;h3 id=&quot;how-it-works&quot;&gt;How it Works&lt;/h3&gt;
+
+&lt;p&gt;Flink’s incremental checkpointing uses &lt;a 
href=&quot;https://github.com/facebook/rocksdb/wiki/Checkpoints&quot;&gt;RocksDB
 checkpoints&lt;/a&gt; as a foundation. RocksDB is a key-value store based on 
‘&lt;a 
href=&quot;https://en.wikipedia.org/wiki/Log-structured_merge-tree&quot;&gt;log-structured-merge&lt;/a&gt;’
 (LSM) trees that collects all changes in a mutable (changeable) in-memory 
buffer called a ‘memtable’. Any updates to the same key in the memtable 
replace previous values, and once the memtable is full, RocksDB writes it to 
disk with all entries sorted by their key and with light compression applied. 
Once RocksDB writes the memtable to disk it is immutable (unchangeable) and is 
now called a ‘sorted-string-table’ (sstable).&lt;/p&gt;
+
+&lt;p&gt;A ‘compaction’ background task merges sstables to consolidate 
potential duplicates for each key, and over time RocksDB deletes the original 
sstables, with the merged sstable containing all information from across all 
the other sstables.&lt;/p&gt;
+
+&lt;p&gt;On top of this, Flink tracks which sstable files RocksDB has created 
and deleted since the previous checkpoint, and as the sstables are immutable, 
Flink uses this to figure out the state changes. To do this, Flink triggers a 
flush in RocksDB, forcing all memtables into sstables on disk, and hard-linked 
in a local temporary directory. This process is synchronous to the processing 
pipeline, and Flink performs all further steps asynchronously and does not 
block processing.&lt;/p&gt;
+
+&lt;p&gt;Then Flink copies all new sstables to stable storage (e.g., HDFS, S3) 
to reference in the new checkpoint. Flink doesn’t copy all sstables that 
already existed in the previous checkpoint to stable storage but re-reference 
them. Any new checkpoints will no longer reference deleted files as deleted 
sstables in RocksDB are always the result of compaction, and it eventually 
replaces old tables with an sstable that is the result of a merge. This how in 
Flink’s incremental checkpoints can prune the checkpoint history.&lt;/p&gt;
+
+&lt;p&gt;For tracking changes between checkpoints, the uploading of 
consolidated tables is redundant work. Flink performs the process 
incrementally, and typically adds only a small overhead, so we consider this 
worthwhile because it allows Flink to keep a shorter history of checkpoints to 
consider in a recovery.&lt;/p&gt;
+
+&lt;h4 id=&quot;an-example&quot;&gt;An Example&lt;/h4&gt;
+
+&lt;p&gt;&lt;img src=&quot;/img/blog/incremental_cp_impl_example.svg&quot; 
alt=&quot;Example setup&quot; /&gt;
+&lt;em&gt;Example setup&lt;/em&gt;&lt;/p&gt;
+
+&lt;p&gt;Take an example with a subtask of one operator that has a keyed 
state, and the number of retained checkpoints set at 
&lt;strong&gt;2&lt;/strong&gt;. The columns in the figure above show the state 
of the local RocksDB instance for each checkpoint, the files it references, and 
the counts in the shared state registry after the checkpoint 
completes.&lt;/p&gt;
+
+&lt;p&gt;For checkpoint ‘CP 1’, the local RocksDB directory contains two 
sstable files, it considers these new and uploads them to stable storage using 
directory names that match the checkpoint name. When the checkpoint completes, 
Flink creates the two entries in the shared state registry and sets their 
counts to ‘1’. The key in the shared state registry is a composite of an 
operator, subtask, and the original sstable file name. The registry also keeps 
a mapping from the key to the file path in stable storage.&lt;/p&gt;
+
+&lt;p&gt;For checkpoint ‘CP 2’, RocksDB has created two new sstable files, 
and the two older ones still exist. For checkpoint ‘CP 2’, Flink adds the 
two new files to stable storage and can reference the previous two files. When 
the checkpoint completes, Flink increases the counts for all referenced files 
by 1.&lt;/p&gt;
+
+&lt;p&gt;For checkpoint ‘CP 3’, RocksDB’s compaction has merged 
&lt;code&gt;sstable-(1)&lt;/code&gt;, &lt;code&gt;sstable-(2)&lt;/code&gt;, and 
&lt;code&gt;sstable-(3)&lt;/code&gt; into 
&lt;code&gt;sstable-(1,2,3)&lt;/code&gt; and deleted the original files. This 
merged file contains the same information as the source files, with all 
duplicate entries eliminated. In addition to this merged file, 
&lt;code&gt;sstable-(4)&lt;/code&gt; still exists and there is now a new 
&lt;code&gt;sstable-(5)&lt;/code&gt; file. Flink adds the new 
&lt;code&gt;sstable-(1,2,3)&lt;/code&gt; and 
&lt;code&gt;sstable-(5)&lt;/code&gt; files to stable storage, 
&lt;code&gt;sstable-(4)&lt;/code&gt; is re-referenced from checkpoint ‘CP 
2’ and increases the counts for referenced files by 1. The older ‘CP 1’ 
checkpoint is now deleted as the number of retained checkpoints (2) has been 
reached. As part of this deletion, Flink decreases the counts for all files 
referenced ‘CP 1’, (&lt;code&gt;sstable
 -(1)&lt;/code&gt; and &lt;code&gt;sstable-(2)&lt;/code&gt;), by 1.&lt;/p&gt;
+
+&lt;p&gt;For checkpoint ‘CP-4’, RocksDB has merged 
&lt;code&gt;sstable-(4)&lt;/code&gt;, &lt;code&gt;sstable-(5)&lt;/code&gt;, and 
a new &lt;code&gt;sstable-(6)&lt;/code&gt; into 
&lt;code&gt;sstable-(4,5,6)&lt;/code&gt;. Flink adds this new table to stable 
storage and references it together with 
&lt;code&gt;sstable-(1,2,3)&lt;/code&gt;, it increases the counts for 
&lt;code&gt;sstable-(1,2,3)&lt;/code&gt; and 
&lt;code&gt;sstable-(4,5,6)&lt;/code&gt; by 1 and then deletes ‘CP-2’ as 
the number of retained checkpoints has been reached. As the counts for 
&lt;code&gt;sstable-(1)&lt;/code&gt;, &lt;code&gt;sstable-(2)&lt;/code&gt;, and 
&lt;code&gt;sstable-(3)&lt;/code&gt; have now dropped to 0, and Flink deletes 
them from stable storage.&lt;/p&gt;
+
+&lt;h3 id=&quot;race-conditions-and-concurrent-checkpoints&quot;&gt;Race 
Conditions and Concurrent Checkpoints&lt;/h3&gt;
+
+&lt;p&gt;As Flink can execute multiple checkpoints in parallel, sometimes new 
checkpoints start before confirming previous checkpoints as completed. Because 
of this, you should consider which the previous checkpoint to use as a basis 
for a new incremental checkpoint. Flink only references state from a checkpoint 
confirmed by the checkpoint coordinator so that it doesn’t unintentionally 
reference a deleted shared file.&lt;/p&gt;
+
+&lt;h3 
id=&quot;restoring-checkpoints-and-performance-considerations&quot;&gt;Restoring
 Checkpoints and Performance Considerations&lt;/h3&gt;
+
+&lt;p&gt;If you enable incremental checkpointing, there are no further 
configuration steps needed to recover your state in case of failure. If a 
failure occurs, Flink’s &lt;code&gt;JobManager&lt;/code&gt; tells all tasks 
to restore from the last completed checkpoint, be it a full or incremental 
checkpoint. Each &lt;code&gt;TaskManager&lt;/code&gt; then downloads their 
share of the state from the checkpoint on the distributed file system.&lt;/p&gt;
+
+&lt;p&gt;Though the feature can lead to a substantial improvement in 
checkpoint time for users with a large state, there are trade-offs to consider 
with incremental checkpointing. Overall, the process reduces the checkpointing 
time during normal operations but can lead to a longer recovery time depending 
on the size of your state. If the cluster failure is particularly severe and 
the Flink &lt;code&gt;TaskManager&lt;/code&gt;s have to read from multiple 
checkpoints, recovery can be a slower operation than when using non-incremental 
checkpointing. You can also no longer delete old checkpoints as newer 
checkpoints need them, and the history of differences between checkpoints can 
grow indefinitely over time. You need to plan for larger distributed storage to 
maintain the checkpoints and the network overhead to read from it.&lt;/p&gt;
+
+&lt;p&gt;There are some strategies for improving the convenience/performance 
trade-off, and I recommend you read &lt;a 
href=&quot;https://ci.apache.org/projects/flink/flink-docs-release-1.4/ops/state/checkpoints.html#basics-of-incremental-checkpoints&quot;&gt;the
 Flink documentation&lt;/a&gt; for more details.&lt;/p&gt;
+
+&lt;p&gt;&lt;em&gt;This post &lt;a 
href=&quot;https://data-artisans.com/blog/managing-large-state-apache-flink-incremental-checkpointing-overview&quot;
 target=&quot;_blank&quot;&gt; originally appeared on the data Artisans blog 
&lt;/a&gt;and was contributed to the Flink blog by Stefan Richter and Chris 
Ward.&lt;/em&gt;&lt;/p&gt;
+&lt;link rel=&quot;canonical&quot; 
href=&quot;https://data-artisans.com/blog/managing-large-state-apache-flink-incremental-checkpointing-overview&quot;
 /&gt;
+
+</description>
+<pubDate>Tue, 30 Jan 2018 13:00:00 +0100</pubDate>
+<link>http://flink.apache.org/features/2018/01/30/incremental-checkpointing.html</link>
+<guid 
isPermaLink="true">/features/2018/01/30/incremental-checkpointing.html</guid>
+</item>
+
+<item>
 <title>Apache Flink in 2017: Year in Review</title>
 <description>&lt;p&gt;2017 was another exciting year for the Apache Flink® 
community, with 3 major version releases (&lt;a 
href=&quot;http://flink.apache.org/news/2017/02/06/release-1.2.0.html&quot;&gt;Flink
 1.2.0 in February&lt;/a&gt;, &lt;a 
href=&quot;http://flink.apache.org/news/2017/06/01/release-1.3.0.html&quot;&gt;Flink
 1.3.0 in June&lt;/a&gt;, and &lt;a 
href=&quot;http://flink.apache.org/news/2017/12/12/release-1.4.0.html&quot;&gt;Flink
 1.4.0 in December&lt;/a&gt;) and the first-ever &lt;a 
href=&quot;https://sf-2017.flink-forward.org/&quot;&gt;Flink Forward in San 
Francisco&lt;/a&gt;, giving Flink community members in another corner of the 
globe an opportunity to connect. Users shared details about their innovative 
production deployments, redefining what is possible with a modern stream 
processing framework like Flink.&lt;/p&gt;
 

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/blog/index.html
----------------------------------------------------------------------
diff --git a/content/blog/index.html b/content/blog/index.html
index 961d15e..6d7c615 100644
--- a/content/blog/index.html
+++ b/content/blog/index.html
@@ -142,6 +142,19 @@
     <!-- Blog posts -->
     
     <article>
+      <h2 class="blog-title"><a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></h2>
+
+      <p>30 Jan 2018
+       Stefan Ricther (<a 
href="https://twitter.com/StefanRRicther";>@StefanRRicther</a>) &amp; Chris Ward 
(<a href="https://twitter.com/chrischinch";>@chrischinch</a>)</p>
+
+      <p>Flink 1.3.0 introduced incremental checkpointing, making it possible 
for applications with large state to generate checkpoints more efficiently.</p>
+
+      <p><a 
href="/features/2018/01/30/incremental-checkpointing.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
+    <article>
       <h2 class="blog-title"><a 
href="/news/2017/12/21/2017-year-in-review.html">Apache Flink in 2017: Year in 
Review</a></h2>
 
       <p>21 Dec 2017
@@ -277,20 +290,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/04/04/dynamic-tables.html">Continuous Queries on Dynamic 
Tables</a></h2>
-
-      <p>04 Apr 2017 by Fabian Hueske, Shaoxuan Wang, and Xiaowei Jiang
-      </p>
-
-      <p><p>Flink's relational APIs, the Table API and SQL, are unified APIs 
for stream and batch processing, meaning that a query produces the same result 
when being evaluated on streaming or static data.</p>
-<p>In this blog post we discuss the future of these APIs and introduce the 
concept of Dynamic Tables. Dynamic tables will significantly expand the scope 
of the Table API and SQL on streams and enable many more advanced use cases. We 
discuss how streams and dynamic tables relate to each other and explain the 
semantics of continuously evaluating queries on dynamic tables.</p></p>
-
-      <p><a href="/news/2017/04/04/dynamic-tables.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -319,10 +318,25 @@ what’s coming in Flink 1.4.0 as well as a preview of 
what the Flink community
       
 
       
-    <h2>2017</h2>
+    <h2>2018</h2>
 
     <ul id="markdown-toc">
       
+      <li><a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></li>
+
+      
+        
+    </ul>
+        <hr>
+        <h2>2017</h2>
+    <ul id="markdown-toc">
+        
+      
+    
+      
+      
+
+      
       <li><a href="/news/2017/12/21/2017-year-in-review.html">Apache Flink in 
2017: Year in Review</a></li>
 
       

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/blog/page2/index.html
----------------------------------------------------------------------
diff --git a/content/blog/page2/index.html b/content/blog/page2/index.html
index 35840c1..bfac156 100644
--- a/content/blog/page2/index.html
+++ b/content/blog/page2/index.html
@@ -142,6 +142,20 @@
     <!-- Blog posts -->
     
     <article>
+      <h2 class="blog-title"><a 
href="/news/2017/04/04/dynamic-tables.html">Continuous Queries on Dynamic 
Tables</a></h2>
+
+      <p>04 Apr 2017 by Fabian Hueske, Shaoxuan Wang, and Xiaowei Jiang
+      </p>
+
+      <p><p>Flink's relational APIs, the Table API and SQL, are unified APIs 
for stream and batch processing, meaning that a query produces the same result 
when being evaluated on streaming or static data.</p>
+<p>In this blog post we discuss the future of these APIs and introduce the 
concept of Dynamic Tables. Dynamic tables will significantly expand the scope 
of the Table API and SQL on streams and enable many more advanced use cases. We 
discuss how streams and dynamic tables relate to each other and explain the 
semantics of continuously evaluating queries on dynamic tables.</p></p>
+
+      <p><a href="/news/2017/04/04/dynamic-tables.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
+    <article>
       <h2 class="blog-title"><a 
href="/news/2017/03/29/table-sql-api-update.html">From Streams to Tables and 
Back Again: An Update on Flink's Table & SQL API</a></h2>
 
       <p>29 Mar 2017 by Timo Walther (<a 
href="https://twitter.com/";>@twalthr</a>)
@@ -270,21 +284,6 @@
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2016/08/08/release-1.1.0.html">Announcing Apache Flink 
1.1.0</a></h2>
-
-      <p>08 Aug 2016
-      </p>
-
-      <p><div class="alert alert-success"><strong>Important</strong>: The 
Maven artifacts published with version 1.1.0 on Maven central have a Hadoop 
dependency issue. It is highly recommended to use <strong>1.1.1</strong> or 
<strong>1.1.1-hadoop1</strong> as the Flink version.</div>
-
-</p>
-
-      <p><a href="/news/2016/08/08/release-1.1.0.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -313,9 +312,24 @@
       
 
       
-    <h2>2017</h2>
+    <h2>2018</h2>
+
+    <ul id="markdown-toc">
+      
+      <li><a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></li>
 
+      
+        
+    </ul>
+        <hr>
+        <h2>2017</h2>
     <ul id="markdown-toc">
+        
+      
+    
+      
+      
+
       
       <li><a href="/news/2017/12/21/2017-year-in-review.html">Apache Flink in 
2017: Year in Review</a></li>
 

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/blog/page3/index.html
----------------------------------------------------------------------
diff --git a/content/blog/page3/index.html b/content/blog/page3/index.html
index 5e0a9e6..89bc68f 100644
--- a/content/blog/page3/index.html
+++ b/content/blog/page3/index.html
@@ -142,6 +142,21 @@
     <!-- Blog posts -->
     
     <article>
+      <h2 class="blog-title"><a 
href="/news/2016/08/08/release-1.1.0.html">Announcing Apache Flink 
1.1.0</a></h2>
+
+      <p>08 Aug 2016
+      </p>
+
+      <p><div class="alert alert-success"><strong>Important</strong>: The 
Maven artifacts published with version 1.1.0 on Maven central have a Hadoop 
dependency issue. It is highly recommended to use <strong>1.1.1</strong> or 
<strong>1.1.1-hadoop1</strong> as the Flink version.</div>
+
+</p>
+
+      <p><a href="/news/2016/08/08/release-1.1.0.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
+    <article>
       <h2 class="blog-title"><a href="/news/2016/05/24/stream-sql.html">Stream 
Processing for Everyone with SQL and Apache Flink</a></h2>
 
       <p>24 May 2016 by Fabian Hueske (<a 
href="https://twitter.com/";>@fhueske</a>)
@@ -271,19 +286,6 @@
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2015/12/11/storm-compatibility.html">Storm Compatibility in Apache 
Flink: How to run existing Storm topologies on Flink</a></h2>
-
-      <p>11 Dec 2015 by Matthias J. Sax (<a 
href="https://twitter.com/";>@MatthiasJSax</a>)
-      </p>
-
-      <p>In this blog post, we describe Flink's compatibility package for <a 
href="https://storm.apache.org";>Apache Storm</a> that allows to embed Spouts 
(sources) and Bolts (operators) in a regular Flink streaming job. Furthermore, 
the compatibility package provides a Storm compatible API in order to execute 
whole Storm topologies with (almost) no code adaption.</p>
-
-      <p><a href="/news/2015/12/11/storm-compatibility.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -312,9 +314,24 @@
       
 
       
-    <h2>2017</h2>
+    <h2>2018</h2>
+
+    <ul id="markdown-toc">
+      
+      <li><a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></li>
 
+      
+        
+    </ul>
+        <hr>
+        <h2>2017</h2>
     <ul id="markdown-toc">
+        
+      
+    
+      
+      
+
       
       <li><a href="/news/2017/12/21/2017-year-in-review.html">Apache Flink in 
2017: Year in Review</a></li>
 

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/blog/page4/index.html
----------------------------------------------------------------------
diff --git a/content/blog/page4/index.html b/content/blog/page4/index.html
index 68ccf62..02cdc3a 100644
--- a/content/blog/page4/index.html
+++ b/content/blog/page4/index.html
@@ -142,6 +142,19 @@
     <!-- Blog posts -->
     
     <article>
+      <h2 class="blog-title"><a 
href="/news/2015/12/11/storm-compatibility.html">Storm Compatibility in Apache 
Flink: How to run existing Storm topologies on Flink</a></h2>
+
+      <p>11 Dec 2015 by Matthias J. Sax (<a 
href="https://twitter.com/";>@MatthiasJSax</a>)
+      </p>
+
+      <p>In this blog post, we describe Flink's compatibility package for <a 
href="https://storm.apache.org";>Apache Storm</a> that allows to embed Spouts 
(sources) and Bolts (operators) in a regular Flink streaming job. Furthermore, 
the compatibility package provides a Storm compatible API in order to execute 
whole Storm topologies with (almost) no code adaption.</p>
+
+      <p><a href="/news/2015/12/11/storm-compatibility.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
+    <article>
       <h2 class="blog-title"><a 
href="/news/2015/12/04/Introducing-windows.html">Introducing Stream Windows in 
Apache Flink</a></h2>
 
       <p>04 Dec 2015 by Fabian Hueske (<a 
href="https://twitter.com/";>@fhueske</a>)
@@ -279,20 +292,6 @@ vertex-centric or gather-sum-apply to Flink dataflows.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2015/05/11/Juggling-with-Bits-and-Bytes.html">Juggling with Bits 
and Bytes</a></h2>
-
-      <p>11 May 2015 by Fabian Hüske (<a 
href="https://twitter.com/";>@fhueske</a>)
-      </p>
-
-      <p><p>Nowadays, a lot of open-source systems for analyzing large data 
sets are implemented in Java or other JVM-based programming languages. The most 
well-known example is Apache Hadoop, but also newer frameworks such as Apache 
Spark, Apache Drill, and also Apache Flink run on JVMs. A common challenge that 
JVM-based data analysis engines face is to store large amounts of data in 
memory - both for caching and for efficient processing such as sorting and 
joining of data. Managing the JVM memory well makes the difference between a 
system that is hard to configure and has unpredictable reliability and 
performance and a system that behaves robustly with few configuration knobs.</p>
-<p>In this blog post we discuss how Apache Flink manages memory, talk about 
its custom data de/serialization stack, and show how it operates on binary 
data.</p></p>
-
-      <p><a href="/news/2015/05/11/Juggling-with-Bits-and-Bytes.html">Continue 
reading &raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -321,10 +320,25 @@ vertex-centric or gather-sum-apply to Flink dataflows.</p>
       
 
       
-    <h2>2017</h2>
+    <h2>2018</h2>
 
     <ul id="markdown-toc">
       
+      <li><a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></li>
+
+      
+        
+    </ul>
+        <hr>
+        <h2>2017</h2>
+    <ul id="markdown-toc">
+        
+      
+    
+      
+      
+
+      
       <li><a href="/news/2017/12/21/2017-year-in-review.html">Apache Flink in 
2017: Year in Review</a></li>
 
       

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/blog/page5/index.html
----------------------------------------------------------------------
diff --git a/content/blog/page5/index.html b/content/blog/page5/index.html
index 12cdbe0..6828a8b 100644
--- a/content/blog/page5/index.html
+++ b/content/blog/page5/index.html
@@ -142,6 +142,20 @@
     <!-- Blog posts -->
     
     <article>
+      <h2 class="blog-title"><a 
href="/news/2015/05/11/Juggling-with-Bits-and-Bytes.html">Juggling with Bits 
and Bytes</a></h2>
+
+      <p>11 May 2015 by Fabian Hüske (<a 
href="https://twitter.com/";>@fhueske</a>)
+      </p>
+
+      <p><p>Nowadays, a lot of open-source systems for analyzing large data 
sets are implemented in Java or other JVM-based programming languages. The most 
well-known example is Apache Hadoop, but also newer frameworks such as Apache 
Spark, Apache Drill, and also Apache Flink run on JVMs. A common challenge that 
JVM-based data analysis engines face is to store large amounts of data in 
memory - both for caching and for efficient processing such as sorting and 
joining of data. Managing the JVM memory well makes the difference between a 
system that is hard to configure and has unpredictable reliability and 
performance and a system that behaves robustly with few configuration knobs.</p>
+<p>In this blog post we discuss how Apache Flink manages memory, talk about 
its custom data de/serialization stack, and show how it operates on binary 
data.</p></p>
+
+      <p><a href="/news/2015/05/11/Juggling-with-Bits-and-Bytes.html">Continue 
reading &raquo;</a></p>
+    </article>
+
+    <hr>
+    
+    <article>
       <h2 class="blog-title"><a 
href="/news/2015/04/13/release-0.9.0-milestone1.html">Announcing Flink 
0.9.0-milestone1 preview release</a></h2>
 
       <p>13 Apr 2015
@@ -286,21 +300,6 @@ and offers a new API including definition of flexible 
windows.</p>
 
     <hr>
     
-    <article>
-      <h2 class="blog-title"><a 
href="/news/2014/11/04/release-0.7.0.html">Apache Flink 0.7.0 available</a></h2>
-
-      <p>04 Nov 2014
-      </p>
-
-      <p><p>We are pleased to announce the availability of Flink 0.7.0. This 
release includes new user-facing features as well as performance and bug fixes, 
brings the Scala and Java APIs in sync, and introduces Flink Streaming. A total 
of 34 people have contributed to this release, a big thanks to all of them!</p>
-
-</p>
-
-      <p><a href="/news/2014/11/04/release-0.7.0.html">Continue reading 
&raquo;</a></p>
-    </article>
-
-    <hr>
-    
 
     <!-- Pagination links -->
     
@@ -329,9 +328,24 @@ and offers a new API including definition of flexible 
windows.</p>
       
 
       
-    <h2>2017</h2>
+    <h2>2018</h2>
+
+    <ul id="markdown-toc">
+      
+      <li><a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></li>
 
+      
+        
+    </ul>
+        <hr>
+        <h2>2017</h2>
     <ul id="markdown-toc">
+        
+      
+    
+      
+      
+
       
       <li><a href="/news/2017/12/21/2017-year-in-review.html">Apache Flink in 
2017: Year in Review</a></li>
 

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/blog/page6/index.html
----------------------------------------------------------------------
diff --git a/content/blog/page6/index.html b/content/blog/page6/index.html
index c2cbd3f..c4522ea 100644
--- a/content/blog/page6/index.html
+++ b/content/blog/page6/index.html
@@ -142,6 +142,21 @@
     <!-- Blog posts -->
     
     <article>
+      <h2 class="blog-title"><a 
href="/news/2014/11/04/release-0.7.0.html">Apache Flink 0.7.0 available</a></h2>
+
+      <p>04 Nov 2014
+      </p>
+
+      <p><p>We are pleased to announce the availability of Flink 0.7.0. This 
release includes new user-facing features as well as performance and bug fixes, 
brings the Scala and Java APIs in sync, and introduces Flink Streaming. A total 
of 34 people have contributed to this release, a big thanks to all of them!</p>
+
+</p>
+
+      <p><a href="/news/2014/11/04/release-0.7.0.html">Continue reading 
&raquo;</a></p>
+    </article>
+
+    <hr>
+    
+    <article>
       <h2 class="blog-title"><a 
href="/news/2014/10/03/upcoming_events.html">Upcoming Events</a></h2>
 
       <p>03 Oct 2014
@@ -217,9 +232,24 @@ academic and open source project that Flink originates 
from.</p>
       
 
       
-    <h2>2017</h2>
+    <h2>2018</h2>
+
+    <ul id="markdown-toc">
+      
+      <li><a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></li>
 
+      
+        
+    </ul>
+        <hr>
+        <h2>2017</h2>
     <ul id="markdown-toc">
+        
+      
+    
+      
+      
+
       
       <li><a href="/news/2017/12/21/2017-year-in-review.html">Apache Flink in 
2017: Year in Review</a></li>
 

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/features/2018/01/30/incremental-checkpointing.html
----------------------------------------------------------------------
diff --git a/content/features/2018/01/30/incremental-checkpointing.html 
b/content/features/2018/01/30/incremental-checkpointing.html
new file mode 100644
index 0000000..1556d02
--- /dev/null
+++ b/content/features/2018/01/30/incremental-checkpointing.html
@@ -0,0 +1,277 @@
+<!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: Managing Large State in Apache Flink: An Intro to 
Incremental Checkpointing</title>
+    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
+    <link rel="icon" href="/favicon.ico" type="image/x-icon">
+
+    <!-- Bootstrap -->
+    <link rel="stylesheet" 
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/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="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js";></script>
+
+    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media 
queries -->
+    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+    <!--[if lt IE 9]>
+      <script 
src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js";></script>
+      <script 
src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js";></script>
+    <![endif]-->
+  </head>
+  <body>  
+    
+
+    <!-- Main content. -->
+    <div class="container">
+    <div class="row">
+
+      
+     <div id="sidebar" class="col-sm-3">
+          <!-- Top navbar. -->
+    <nav class="navbar navbar-default">
+        <!-- The logo. -->
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" 
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <div class="navbar-logo">
+            <a href="/">
+              <img alt="Apache Flink" src="/img/flink-header-logo.svg" 
width="147px" height="73px">
+            </a>
+          </div>
+        </div><!-- /.navbar-header -->
+
+        <!-- The navigation links. -->
+        <div class="collapse navbar-collapse" 
id="bs-example-navbar-collapse-1">
+          <ul class="nav navbar-nav navbar-main">
+
+            <!-- Downloads -->
+            <li class=""><a class="btn btn-info" 
href="/downloads.html">Download Flink</a></li>
+
+            <!-- Overview -->
+            <li><a href="/index.html">Home</a></li>
+
+            <!-- Intro -->
+            <li><a href="/introduction.html">Introduction to Flink</a></li>
+
+            <!-- Use cases -->
+            <li><a href="/usecases.html">Flink Use Cases</a></li>
+
+            <!-- Powered by -->
+            <li><a href="/poweredby.html">Powered by Flink</a></li>
+
+            <!-- Ecosystem -->
+            <li><a href="/ecosystem.html">Ecosystem</a></li>
+
+            <!-- Community -->
+            <li><a href="/community.html">Community &amp; Project Info</a></li>
+
+            <!-- Contribute -->
+            <li><a href="/how-to-contribute.html">How to Contribute</a></li>
+
+            <!-- Blog -->
+            <li class=" hidden-md hidden-sm"><a href="/blog/"><b>Flink 
Blog</b></a></li>
+
+            <hr />
+
+
+
+            <!-- Documentation -->
+            <!-- <li>
+              <a 
href="http://ci.apache.org/projects/flink/flink-docs-release-1.4"; 
target="_blank">Documentation <small><span class="glyphicon 
glyphicon-new-window"></span></small></a>
+            </li> -->
+            <li class="dropdown">
+              <a class="dropdown-toggle" data-toggle="dropdown" 
href="#">Documentation
+                <span class="caret"></span></a>
+                <ul class="dropdown-menu">
+                  <li><a 
href="http://ci.apache.org/projects/flink/flink-docs-release-1.4"; 
target="_blank">1.4 (Latest stable release) <small><span class="glyphicon 
glyphicon-new-window"></span></small></a></li>
+                  <li><a 
href="http://ci.apache.org/projects/flink/flink-docs-master"; 
target="_blank">1.5 (Snapshot) <small><span class="glyphicon 
glyphicon-new-window"></span></small></a></li>
+                </ul>
+              </li>
+
+            <!-- Quickstart -->
+            <li>
+              <a 
href="http://ci.apache.org/projects/flink/flink-docs-release-1.4/quickstart/setup_quickstart.html";
 target="_blank">Quickstart <small><span class="glyphicon 
glyphicon-new-window"></span></small></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>
+
+          </ul>
+
+
+
+          <ul class="nav navbar-nav navbar-bottom">
+          <hr />
+
+            <!-- FAQ -->
+            <li ><a href="/faq.html">Project FAQ</a></li>
+
+            <!-- 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>
+
+          </ul>
+        </div><!-- /.navbar-collapse -->
+    </nav>
+
+      </div>
+      <div class="col-sm-9">
+      <div class="row-fluid">
+  <div class="col-sm-12">
+    <div class="row">
+      <h1>Managing Large State in Apache Flink: An Intro to Incremental 
Checkpointing</h1>
+
+      <article>
+        <p>30 Jan 2018 Stefan Ricther (<a 
href="https://twitter.com/StefanRRicther";>@StefanRRicther</a>) &amp; Chris Ward 
(<a href="https://twitter.com/chrischinch";>@chrischinch</a>)</p>
+
+<p>Apache Flink was purpose-built for <em>stateful</em> stream processing. 
However, what is state in a stream processing application? I defined state and 
stateful stream processing in a <a 
href="http://flink.apache.org/features/2017/07/04/flink-rescalable-state.html";>previous
 blog post</a>, and in case you need a refresher, <em>state is defined as 
memory in an application’s operators that stores information about 
previously-seen events that you can use to influence the processing of future 
events</em>.</p>
+
+<p>State is a fundamental, enabling concept in stream processing required for 
a majority of complex use cases. Some examples highlighted in the <a 
href="https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/state.html";>Flink
 documentation</a>:</p>
+
+<ul>
+  <li>When an application searches for certain event patterns, the state 
stores the sequence of events encountered so far.</li>
+  <li>When aggregating events per minute, the state holds the pending 
aggregates.</li>
+  <li>When training a machine learning model over a stream of data points, the 
state holds the current version of the model parameters.</li>
+</ul>
+
+<p>However, stateful stream processing is only useful in production 
environments if the state is fault tolerant. “Fault tolerance” means that 
even if there’s a software or machine failure, the computed end-result is 
accurate, with no data loss or double-counting of events.</p>
+
+<p>Flink’s fault tolerance has always been a powerful and popular feature, 
minimizing the impact of software or machine failure on your business and 
making it possible to guarantee exactly-once results from a Flink 
application.</p>
+
+<p>Core to this is <a 
href="https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/stream/checkpointing.html";>checkpointing</a>,
 which is the mechanism Flink uses to make application state fault tolerant. A 
checkpoint in Flink is a global, asynchronous snapshot of application state 
that’s taken on a regular interval and sent to durable storage (usually, a 
distributed file system). In the event of a failure, Flink restarts an 
application using the most recently completed checkpoint as a starting point. 
Some Apache Flink users run applications with gigabytes or even terabytes of 
application state. These users reported that with such large state, creating a 
checkpoint was often a slow and resource intensive operation, which is why in 
Flink 1.3 we introduced ‘incremental checkpointing.’</p>
+
+<p>Before incremental checkpointing, every single Flink checkpoint consisted 
of the full state of an application. We created the incremental checkpointing 
feature after we noticed that writing the full state for every checkpoint was 
often unnecessary, as the state changes from one checkpoint to the next were 
rarely that large. Incremental checkpointing instead maintains the differences 
(or ‘delta’) between each checkpoint and stores only the differences 
between the last checkpoint and the current state.</p>
+
+<p>Incremental checkpoints can provide a significant performance improvement 
for jobs with a very large state. Early testing of the feature by a production 
user with terabytes of state shows a drop in checkpoint time from more than 3 
minutes down to 30 seconds after implementing incremental checkpoints. This is 
because the checkpoint doesn’t need to transfer the full state to durable 
storage on each checkpoint.</p>
+
+<h3 id="how-to-start">How to Start</h3>
+
+<p>Currently, you can only use incremental checkpointing with a RocksDB state 
back-end, and Flink uses RocksDB’s internal backup mechanism to consolidate 
checkpoint data over time. As a result, the incremental checkpoint history in 
Flink does not grow indefinitely, and Flink eventually consumes and prunes old 
checkpoints automatically.</p>
+
+<p>To enable incremental checkpointing in your application, I recommend you 
read the <a 
href="https://ci.apache.org/projects/flink/flink-docs-release-1.4/ops/state/large_state_tuning.html#tuning-rocksdb";>the
 Apache Flink documentation on checkpointing</a> for full details, but in 
summary, you enable checkpointing as normal, but enable incremental 
checkpointing in the constructor by setting the second parameter to 
<code>true</code>.</p>
+
+<h4 id="java-example">Java Example</h4>
+
+<div class="highlight"><pre><code class="language-java"><span 
class="n">StreamExecutionEnvironment</span> <span class="n">env</span> <span 
class="o">=</span> <span class="n">StreamExecutionEnvironment</span><span 
class="o">.</span><span class="na">getExecutionEnvironment</span><span 
class="o">();</span>
+<span class="n">env</span><span class="o">.</span><span 
class="na">setStateBackend</span><span class="o">(</span><span 
class="k">new</span> <span class="nf">RocksDBStateBackend</span><span 
class="o">(</span><span class="n">filebackend</span><span class="o">,</span> 
<span class="kc">true</span><span class="o">));</span></code></pre></div>
+
+<h4 id="scala-example">Scala Example</h4>
+
+<div class="highlight"><pre><code class="language-scala"><span 
class="k">val</span> <span class="n">env</span> <span class="k">=</span> <span 
class="nc">StreamExecutionEnvironment</span><span class="o">.</span><span 
class="n">getExecutionEnvironment</span><span class="o">()</span>
+<span class="n">env</span><span class="o">.</span><span 
class="n">setStateBackend</span><span class="o">(</span><span 
class="k">new</span> <span class="nc">RocksDBStateBackend</span><span 
class="o">(</span><span class="n">filebackend</span><span class="o">,</span> 
<span class="kc">true</span><span class="o">))</span></code></pre></div>
+
+<p>By default, Flink retains 1 completed checkpoint, so if you need a higher 
number, <a 
href="https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/state/checkpointing.html#related-config-options";>you
 can configure it with the following flag</a>:</p>
+
+<div class="highlight"><pre><code class="language-java"><span 
class="n">state</span><span class="o">.</span><span 
class="na">checkpoints</span><span class="o">.</span><span 
class="na">num</span><span class="o">-</span><span 
class="n">retained</span></code></pre></div>
+
+<h3 id="how-it-works">How it Works</h3>
+
+<p>Flink’s incremental checkpointing uses <a 
href="https://github.com/facebook/rocksdb/wiki/Checkpoints";>RocksDB 
checkpoints</a> as a foundation. RocksDB is a key-value store based on ‘<a 
href="https://en.wikipedia.org/wiki/Log-structured_merge-tree";>log-structured-merge</a>’
 (LSM) trees that collects all changes in a mutable (changeable) in-memory 
buffer called a ‘memtable’. Any updates to the same key in the memtable 
replace previous values, and once the memtable is full, RocksDB writes it to 
disk with all entries sorted by their key and with light compression applied. 
Once RocksDB writes the memtable to disk it is immutable (unchangeable) and is 
now called a ‘sorted-string-table’ (sstable).</p>
+
+<p>A ‘compaction’ background task merges sstables to consolidate potential 
duplicates for each key, and over time RocksDB deletes the original sstables, 
with the merged sstable containing all information from across all the other 
sstables.</p>
+
+<p>On top of this, Flink tracks which sstable files RocksDB has created and 
deleted since the previous checkpoint, and as the sstables are immutable, Flink 
uses this to figure out the state changes. To do this, Flink triggers a flush 
in RocksDB, forcing all memtables into sstables on disk, and hard-linked in a 
local temporary directory. This process is synchronous to the processing 
pipeline, and Flink performs all further steps asynchronously and does not 
block processing.</p>
+
+<p>Then Flink copies all new sstables to stable storage (e.g., HDFS, S3) to 
reference in the new checkpoint. Flink doesn’t copy all sstables that already 
existed in the previous checkpoint to stable storage but re-reference them. Any 
new checkpoints will no longer reference deleted files as deleted sstables in 
RocksDB are always the result of compaction, and it eventually replaces old 
tables with an sstable that is the result of a merge. This how in Flink’s 
incremental checkpoints can prune the checkpoint history.</p>
+
+<p>For tracking changes between checkpoints, the uploading of consolidated 
tables is redundant work. Flink performs the process incrementally, and 
typically adds only a small overhead, so we consider this worthwhile because it 
allows Flink to keep a shorter history of checkpoints to consider in a 
recovery.</p>
+
+<h4 id="an-example">An Example</h4>
+
+<p><img src="/img/blog/incremental_cp_impl_example.svg" alt="Example setup" />
+<em>Example setup</em></p>
+
+<p>Take an example with a subtask of one operator that has a keyed state, and 
the number of retained checkpoints set at <strong>2</strong>. The columns in 
the figure above show the state of the local RocksDB instance for each 
checkpoint, the files it references, and the counts in the shared state 
registry after the checkpoint completes.</p>
+
+<p>For checkpoint ‘CP 1’, the local RocksDB directory contains two sstable 
files, it considers these new and uploads them to stable storage using 
directory names that match the checkpoint name. When the checkpoint completes, 
Flink creates the two entries in the shared state registry and sets their 
counts to ‘1’. The key in the shared state registry is a composite of an 
operator, subtask, and the original sstable file name. The registry also keeps 
a mapping from the key to the file path in stable storage.</p>
+
+<p>For checkpoint ‘CP 2’, RocksDB has created two new sstable files, and 
the two older ones still exist. For checkpoint ‘CP 2’, Flink adds the two 
new files to stable storage and can reference the previous two files. When the 
checkpoint completes, Flink increases the counts for all referenced files by 
1.</p>
+
+<p>For checkpoint ‘CP 3’, RocksDB’s compaction has merged 
<code>sstable-(1)</code>, <code>sstable-(2)</code>, and 
<code>sstable-(3)</code> into <code>sstable-(1,2,3)</code> and deleted the 
original files. This merged file contains the same information as the source 
files, with all duplicate entries eliminated. In addition to this merged file, 
<code>sstable-(4)</code> still exists and there is now a new 
<code>sstable-(5)</code> file. Flink adds the new <code>sstable-(1,2,3)</code> 
and <code>sstable-(5)</code> files to stable storage, <code>sstable-(4)</code> 
is re-referenced from checkpoint ‘CP 2’ and increases the counts for 
referenced files by 1. The older ‘CP 1’ checkpoint is now deleted as the 
number of retained checkpoints (2) has been reached. As part of this deletion, 
Flink decreases the counts for all files referenced ‘CP 1’, 
(<code>sstable-(1)</code> and <code>sstable-(2)</code>), by 1.</p>
+
+<p>For checkpoint ‘CP-4’, RocksDB has merged <code>sstable-(4)</code>, 
<code>sstable-(5)</code>, and a new <code>sstable-(6)</code> into 
<code>sstable-(4,5,6)</code>. Flink adds this new table to stable storage and 
references it together with <code>sstable-(1,2,3)</code>, it increases the 
counts for <code>sstable-(1,2,3)</code> and <code>sstable-(4,5,6)</code> by 1 
and then deletes ‘CP-2’ as the number of retained checkpoints has been 
reached. As the counts for <code>sstable-(1)</code>, <code>sstable-(2)</code>, 
and <code>sstable-(3)</code> have now dropped to 0, and Flink deletes them from 
stable storage.</p>
+
+<h3 id="race-conditions-and-concurrent-checkpoints">Race Conditions and 
Concurrent Checkpoints</h3>
+
+<p>As Flink can execute multiple checkpoints in parallel, sometimes new 
checkpoints start before confirming previous checkpoints as completed. Because 
of this, you should consider which the previous checkpoint to use as a basis 
for a new incremental checkpoint. Flink only references state from a checkpoint 
confirmed by the checkpoint coordinator so that it doesn’t unintentionally 
reference a deleted shared file.</p>
+
+<h3 id="restoring-checkpoints-and-performance-considerations">Restoring 
Checkpoints and Performance Considerations</h3>
+
+<p>If you enable incremental checkpointing, there are no further configuration 
steps needed to recover your state in case of failure. If a failure occurs, 
Flink’s <code>JobManager</code> tells all tasks to restore from the last 
completed checkpoint, be it a full or incremental checkpoint. Each 
<code>TaskManager</code> then downloads their share of the state from the 
checkpoint on the distributed file system.</p>
+
+<p>Though the feature can lead to a substantial improvement in checkpoint time 
for users with a large state, there are trade-offs to consider with incremental 
checkpointing. Overall, the process reduces the checkpointing time during 
normal operations but can lead to a longer recovery time depending on the size 
of your state. If the cluster failure is particularly severe and the Flink 
<code>TaskManager</code>s have to read from multiple checkpoints, recovery can 
be a slower operation than when using non-incremental checkpointing. You can 
also no longer delete old checkpoints as newer checkpoints need them, and the 
history of differences between checkpoints can grow indefinitely over time. You 
need to plan for larger distributed storage to maintain the checkpoints and the 
network overhead to read from it.</p>
+
+<p>There are some strategies for improving the convenience/performance 
trade-off, and I recommend you read <a 
href="https://ci.apache.org/projects/flink/flink-docs-release-1.4/ops/state/checkpoints.html#basics-of-incremental-checkpoints";>the
 Flink documentation</a> for more details.</p>
+
+<p><em>This post <a 
href="https://data-artisans.com/blog/managing-large-state-apache-flink-incremental-checkpointing-overview";
 target="_blank"> originally appeared on the data Artisans blog </a>and was 
contributed to the Flink blog by Stefan Richter and Chris Ward.</em></p>
+<link rel="canonical" 
href="https://data-artisans.com/blog/managing-large-state-apache-flink-incremental-checkpointing-overview";
 />
+
+
+      </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-2017 <a href="http://apache.org";>The Apache 
Software Foundation</a>. All Rights Reserved.</p>
+        <p>Apache Flink, Flink®, Apache®, the squirrel logo, and the Apache 
feather logo are either registered trademarks or trademarks of The Apache 
Software Foundation.</p>
+        <p><a href="/privacy-policy.html">Privacy Policy</a> &middot; <a 
href="/blog/feed.xml">RSS feed</a></p>
+      </div>
+    </div>
+    </div><!-- /.container -->
+
+    <!-- Include all compiled plugins (below), or include individual files as 
needed -->
+    <script 
src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js";></script>
+    <script src="/js/codetabs.js"></script>
+    <script src="/js/stickysidebar.js"></script>
+
+
+    <!-- Google Analytics -->
+    <script>
+      
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new 
Date();a=s.createElement(o),
+      
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+      
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+      ga('create', 'UA-52545728-1', 'auto');
+      ga('send', 'pageview');
+    </script>
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/img/blog/incremental_cp_impl_example.svg
----------------------------------------------------------------------
diff --git a/content/img/blog/incremental_cp_impl_example.svg 
b/content/img/blog/incremental_cp_impl_example.svg
new file mode 100644
index 0000000..5c852ab
--- /dev/null
+++ b/content/img/blog/incremental_cp_impl_example.svg
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
+<svg xmlns="http://www.w3.org/2000/svg"; 
xmlns:xl="http://www.w3.org/1999/xlink"; version="1.1" viewBox="5.456693 
3543.4567 789.0866 317.08661" width="789.0866pt" height="317.08661pt"><metadata 
xmlns:dc="http://purl.org/dc/elements/1.1/";><dc:date>2017-08-08 
10:07Z</dc:date><!-- Produced by OmniGraffle Professional 5.4.4 
--></metadata><defs><font-face font-family="Monaco" font-size="7" 
units-per-em="1000" underline-position="-37.597656" 
underline-thickness="75.683594" slope="0" x-height="560.54688" 
cap-height="780.27344" ascent="1e3" descent="-250" 
font-weight="500"><font-face-src><font-face-name 
name="Monaco"/></font-face-src></font-face><font-face font-family="Helvetica" 
font-size="12" units-per-em="1000" underline-position="-75.683594" 
underline-thickness="49.316406" slope="0" x-height="532.22656" 
cap-height="719.72656" ascent="770.01953" descent="-229.98047" 
font-weight="bold"><font-face-src><font-face-name 
name="Helvetica-Bold"/></font-face-src></font-face><font-face font-family="
 Helvetica" font-size="9" units-per-em="1000" underline-position="-75.683594" 
underline-thickness="49.316406" slope="0" x-height="522.94922" 
cap-height="717.28516" ascent="770.01953" descent="-229.98047" 
font-weight="500"><font-face-src><font-face-name 
name="Helvetica"/></font-face-src></font-face><marker orient="auto" 
overflow="visible" markerUnits="strokeWidth" id="DimensionArrow_Marker" 
viewBox="-1 -5 7 10" markerWidth="7" markerHeight="10" color="#738a05"><g><path 
d="M 0 0 L 4.8000002 0 M 4.8000002 3.0000001 L 4.8000002 -3.0000001 M 0 
1.20000005 L 4.2000002 0 L 0 -1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" 
markerUnits="strokeWidth" id="DimensionArrow_Marker_2" viewBox="-6 -5 7 10" 
markerWidth="7" markerHeight="10" color="#738a05"><g><path d="M 0 0 L 
-4.8000002 0 M -4.8000002 -3.0000001 L -4.8000002 3.0000001 M 0 -1.20000005 L 
-4.2000002 0 L 0 1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/>
 </g></marker><marker orient="auto" overflow="visible" 
markerUnits="strokeWidth" id="DimensionArrow_Marker_3" viewBox="-1 -5 7 10" 
markerWidth="7" markerHeight="10" color="#bd3612"><g><path d="M 0 0 L 4.8000002 
0 M 4.8000002 3.0000001 L 4.8000002 -3.0000001 M 0 1.20000005 L 4.2000002 0 L 0 
-1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" 
markerUnits="strokeWidth" id="DimensionArrow_Marker_4" viewBox="-6 -5 7 10" 
markerWidth="7" markerHeight="10" color="#bd3612"><g><path d="M 0 0 L 
-4.8000002 0 M -4.8000002 -3.0000001 L -4.8000002 3.0000001 M 0 -1.20000005 L 
-4.2000002 0 L 0 1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" 
markerUnits="strokeWidth" id="DimensionArrow_Marker_5" viewBox="-1 -5 7 10" 
markerWidth="7" markerHeight="10" color="#2076c8"><g><path d="M 0 0 L 4.8000002 
0 M 4.8000002 3.0000001 L 4.8000002 -3.0000001 M 0 1.20000005 L 4.2000002
  0 L 0 -1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" 
markerUnits="strokeWidth" id="DimensionArrow_Marker_6" viewBox="-6 -5 7 10" 
markerWidth="7" markerHeight="10" color="#2076c8"><g><path d="M 0 0 L 
-4.8000002 0 M -4.8000002 -3.0000001 L -4.8000002 3.0000001 M 0 -1.20000005 L 
-4.2000002 0 L 0 1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" 
markerUnits="strokeWidth" id="DimensionArrow_Marker_7" viewBox="-1 -5 7 10" 
markerWidth="7" markerHeight="10" color="#a57706"><g><path d="M 0 0 L 4.8000002 
0 M 4.8000002 3.0000001 L 4.8000002 -3.0000001 M 0 1.20000005 L 4.2000002 0 L 0 
-1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" 
markerUnits="strokeWidth" id="DimensionArrow_Marker_8" viewBox="-6 -5 7 10" 
markerWidth="7" markerHeight="10" color="#a57706"><g><path d="M 0 0 L 
-4.8000002 
 0 M -4.8000002 -3.0000001 L -4.8000002 3.0000001 M 0 -1.20000005 L -4.2000002 
0 L 0 1.20000005" fill="none" stroke="currentColor" 
stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" 
stroke-dasharray="none" fill="none" fill-opacity="1"><title>Arbeitsfläche 
1</title><rect fill="white" width="1118.55115" 
height="3914.4489"/><g><title>Ebene 1</title><line x1="232.43229" 
y1="3744.6237" x2="165.44272" y2="3815.9998" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line 
x1="160.75" y1="3744.624" x2="160.75" y2="3815.9998" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line 
x1="84.375015" y1="3663.7481" x2="84.375015" y2="3734.6237" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line 
x1="156.02824" y1="3663.7482" x2="89.09676" y2="3734.6237" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line 
x1="227.68149" y1="3663.7481" x2="93.81851" 
 y2="3734.6237" stroke="black" stroke-linecap="round" stroke-linejoin="round" 
stroke-width="1"/><rect x="49" y="3729.8736" width="70.75" height="18.500217" 
fill="#0a2832"/><rect x="49" y="3729.8736" width="70.75" height="18.500217" 
stroke="black" stroke-linecap="round" stroke-linejoin="round" 
stroke-width="1"/><text transform="translate(49 3734.8315)" fill="white"><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="white" x="3.869873" 
y="7" textLength="63.010254">sstable-(1,2,3)</tspan></text><rect x="49" 
y="3589.749" width="70.75" height="18.500217" fill="#0a2832"/><rect x="49" 
y="3589.749" width="70.75" height="18.500217" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text 
transform="translate(49 3594.707)" fill="white"><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="12.27124" y="7" 
textLength="46.20752">sstable-(1)</tspan></text><rect x="125.875" y="3589.749" 
width="70.75" height="18.500217" fill="#0a2832"
 /><rect x="125.875" y="3589.749" width="70.75" height="18.500217" 
stroke="black" stroke-linecap="round" stroke-linejoin="round" 
stroke-width="1"/><text transform="translate(125.875 3594.707)" 
fill="white"><tspan font-family="Monaco" font-size="7" font-weight="500" 
fill="white" x="12.27124" y="7" 
textLength="46.20752">sstable-(2)</tspan></text><rect x="49" y="3648.998" 
width="70.75" height="18.500217" fill="#0a2832"/><rect x="49" y="3648.998" 
width="70.75" height="18.500217" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><text transform="translate(49 
3653.9559)" fill="white"><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="white" x="12.27124" y="7" 
textLength="46.20752">sstable-(1)</tspan></text><rect x="125.375" y="3648.998" 
width="70.75" height="18.500217" fill="#0a2832"/><rect x="125.375" y="3648.998" 
width="70.75" height="18.500217" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><text transform="tr
 anslate(125.375 3653.956)" fill="white"><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="12.27124" y="7" 
textLength="46.20752">sstable-(2)</tspan></text><rect x="201.75" y="3648.998" 
width="70.75" height="18.500217" fill="#0a2832"/><rect x="201.75" y="3648.998" 
width="70.75" height="18.500217" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><text transform="translate(201.75 
3653.9559)" fill="white"><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="white" x="12.27124" y="7" 
textLength="46.20752">sstable-(3)</tspan></text><rect x="278.125" y="3648.998" 
width="70.75" height="18.500217" fill="#0a2832"/><rect x="278.125" y="3648.998" 
width="70.75" height="18.500217" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><text transform="translate(278.125 
3653.956)" fill="white"><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="white" x="12.27124" y="7" textLength="46.20752"
 >sstable-(4)</tspan></text><rect x="125.375" y="3729.8737" width="70.75" 
 >height="18.500217" fill="#0a2832"/><rect x="125.375" y="3729.8737" 
 >width="70.75" height="18.500217" stroke="black" stroke-linecap="round" 
 >stroke-linejoin="round" stroke-width="1"/><text transform="translate(125.375 
 >3734.8317)" fill="white"><tspan font-family="Monaco" font-size="7" 
 >font-weight="500" fill="white" x="12.27124" y="7" 
 >textLength="46.20752">sstable-(4)</tspan></text><rect x="201.75" 
 >y="3729.8735" width="70.75" height="18.500217" fill="#0a2832"/><rect 
 >x="201.75" y="3729.8735" width="70.75" height="18.500217" stroke="black" 
 >stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text 
 >transform="translate(201.75 3734.8314)" fill="white"><tspan 
 >font-family="Monaco" font-size="7" font-weight="500" fill="white" 
 >x="12.27124" y="7" textLength="46.20752">sstable-(5)</tspan></text><text 
 >transform="translate(11.5 3591.999)" fill="#738a05"><tspan 
 >font-family="Helvetica" font-size="12" font-weight="bold
 " fill="#738a05" x=".26660156" y="11" textLength="16.669922">CP</tspan><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" fill="#738a05" 
x="16.725586" y="11" textLength="10.0078125"> 1</tspan></text><text 
transform="translate(11 3651.248)" fill="#bd3612"><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" fill="#bd3612" 
x=".26660156" y="11" textLength="16.669922">CP</tspan><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" fill="#bd3612" 
x="16.725586" y="11" textLength="10.0078125"> 2</tspan></text><text 
transform="translate(11 3732.1238)" fill="#2076c8"><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" fill="#2076c8" 
x=".26660156" y="11" textLength="16.669922">CP</tspan><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" fill="#2076c8" 
x="16.725586" y="11" textLength="10.0078125"> 3</tspan></text><text 
transform="translate(89.5 3671.686)" fill="black"><tspan 
font-family="Helvetica" font-size="9" font-weight="500" 
 x=".24487305" y="9" textLength="25.510254">merge</tspan></text><rect 
x="360.65693" y="3581.999" width="207.84307" height="34.000217" 
fill="black"/><rect x="360.65693" y="3581.999" width="207.84307" 
height="34.000217" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><text transform="translate(365.65693 
3587.207)" fill="#738a05"><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#738a05" x="0" y="7" 
textLength="172.22803">op-2-1-sstable-(1) -&gt; 
dfs://cp-1/23-23-42</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#738a05" x="0" y="21" 
textLength="29.404785">op-2-1-</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#738a05" x="29.404785" y="21" 
textLength="63.010254">sstable-(2) -&gt; </tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="#738a05" x="92.41504" y="21" 
textLength="79.81299">dfs://cp-1/54-75-91</tspan></text><rect x="360.65693" 
y="3625.998" width="207.84308" he
 ight="65.75202" fill="black"/><rect x="360.65693" y="3625.998" 
width="207.84308" height="65.75202" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><text transform="translate(365.65693 
3633.0818)" fill="#738a05"><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#738a05" x="0" y="7" 
textLength="180.62939">op-2-1-sstable-(1) -&gt; 
(dfs://cp-1/23-23-42)</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#738a05" x="0" y="21" 
textLength="180.62939">op-2-1-sstable-(2) -&gt; 
(dfs://cp-1/54-75-91)</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#bd3612" x="0" y="35" 
textLength="172.22803">op-2-1-sstable-(3) -&gt; 
dfs://cp-2/44-63-90</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#bd3612" x="0" y="49" 
textLength="172.22803">op-2-1-sstable-(4) -&gt; 
dfs://cp-2/41-74-28</tspan></text><rect x="360.65693" y="3702.2488" 
width="207.84308" height="56.5" fill="black"/><rect x="360
 .65693" y="3702.2488" width="207.84308" height="56.5" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text 
transform="translate(365.65693 3711.7065)" fill="#2076c8"><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="#2076c8" x="0" y="7" 
textLength="189.03076">op-2-1-sstable-(1,2,3) -&gt; 
dfs://cp-3/38-46-83</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#bd3612" x="0" y="21" 
textLength="180.62939">op-2-1-sstable-(4) -&gt; 
(dfs://cp-2/41-74-28)</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#2076c8" x="0" y="35" 
textLength="29.404785">op-2-1-</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#2076c8" x="29.404785" y="35" 
textLength="155.42529">sstable-(5) -&gt; 
dfs://cp-3/79-20-41-55</tspan></text><rect x="577.81385" y="3581.999" 
width="123.62231" height="34.000286" fill="black"/><rect x="577.81385" 
y="3581.999" width="123.62231" height="34.000286" stroke="black"
  stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text 
transform="translate(582.81385 3587.2069)" fill="white"><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="white" x="0" y="7" 
textLength="92.41504">op-2-1-sstable-(1) : 1</tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="0" y="21" 
textLength="92.41504">op-2-1-sstable-(2) : 1</tspan></text><rect x="579.28193" 
y="3625.998" width="122.15423" height="65.75202" fill="black"/><rect 
x="579.28193" y="3625.998" width="122.15423" height="65.75202" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text 
transform="translate(584.28193 3633.0818)" fill="white"><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="white" x="0" y="7" 
textLength="92.41504">op-2-1-sstable-(1) : 2</tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="0" y="21" 
textLength="92.41504">op-2-1-sstable-(2) : 2</tspan><tspan font-family
 ="Monaco" font-size="7" font-weight="500" fill="white" x="0" y="35" 
textLength="92.41504">op-2-1-sstable-(3) : 1</tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="0" y="49" 
textLength="92.41504">op-2-1-sstable-(4) : 1</tspan></text><rect x="579.28193" 
y="3702.2488" width="122.15423" height="82.25122" fill="black"/><rect 
x="579.28193" y="3702.2488" width="122.15423" height="82.25122" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text 
transform="translate(584.28193 3703.5822)" fill="white"><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="white" x="0" y="7" 
textLength="92.41504">op-2-1-sstable-(1) : 1</tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="0" y="21" 
textLength="92.41504">op-2-1-sstable-(2) : 1</tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="0" y="35" 
textLength="92.41504">op-2-1-sstable-(3) : 1</tspan><tspan font-family="Mon
 aco" font-size="7" font-weight="500" fill="white" x="0" y="49" 
textLength="109.217773">op-2-1-sstable-(1,2,3) : 1</tspan><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="white" x="0" y="63" 
textLength="92.41504">op-2-1-sstable-(4) : 2</tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="0" y="77" 
textLength="92.41504">op-2-1-sstable-(5) : 1</tspan></text><rect x="49" 
y="3811.2495" width="70.75" height="18.500217" fill="#0a2832"/><rect x="49" 
y="3811.2495" width="70.75" height="18.500217" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text 
transform="translate(49 3816.2074)" fill="white"><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="3.869873" y="7" 
textLength="63.010254">sstable-(1,2,3)</tspan></text><rect x="125.375" 
y="3811.2496" width="70.75" height="18.500217" fill="#0a2832"/><rect 
x="125.375" y="3811.2496" width="70.75" height="18.500217" stroke="black" 
stroke-linecap="
 round" stroke-linejoin="round" stroke-width="1"/><text 
transform="translate(125.375 3816.2076)" fill="white"><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="white" x="3.869873" 
y="7" textLength="63.010254">sstable-(4,5,6)</tspan></text><text 
transform="translate(11.5 3813.4997)" fill="#a57706"><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" fill="#a57706" 
x=".26660156" y="11" textLength="16.669922">CP</tspan><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" fill="#a57706" 
x="16.725586" y="11" textLength="10.0078125"> 4</tspan></text><text 
transform="translate(166 3752.5619)" fill="black"><tspan 
font-family="Helvetica" font-size="9" font-weight="500" x=".24487305" y="9" 
textLength="25.510254">merge</tspan></text><rect x="360.65693" y="3794" 
width="207.84308" height="33.5001" fill="black"/><rect x="360.65693" y="3794" 
width="207.84308" height="33.5001" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><tex
 t transform="translate(365.65693 3798.9578)" fill="#2076c8"><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="#2076c8" x="0" y="7" 
textLength="197.43213">op-2-1-sstable-(1,2,3) -&gt; 
(dfs://cp-3/38-46-83)</tspan><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="#a57706" x="0" y="21" 
textLength="189.03076">op-2-1-sstable-(4,5,6) -&gt; 
dfs://cp-3/38-46-83</tspan></text><rect x="579.28193" y="3794" 
width="122.15423" height="54.743706" fill="black"/><rect x="579.28193" y="3794" 
width="122.15423" height="54.743706" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1"/><text transform="translate(584.28193 
3795.5796)" fill="white"><tspan font-family="Monaco" font-size="7" 
font-weight="500" fill="white" x="0" y="7" 
textLength="109.217773">op-2-1-sstable-(1,2,3) : 2</tspan><tspan 
font-family="Monaco" font-size="7" font-weight="500" fill="white" x="0" y="21" 
textLength="92.41504">op-2-1-sstable-(4) : 1</tspan><tspan font-family="Monaco
 " font-size="7" font-weight="500" fill="white" x="0" y="35" 
textLength="92.41504">op-2-1-sstable-(5) : 1</tspan><tspan font-family="Monaco" 
font-size="7" font-weight="500" fill="white" x="0" y="49" 
textLength="109.217773">op-2-1-sstable-(4,5,6) : 1</tspan></text><line x1="11" 
y1="3620.75" x2="788" y2="3620.75" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1" stroke-dasharray="1,4"/><line x1="11" 
y1="3697.25" x2="788" y2="3697.25" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1" stroke-dasharray="1,4"/><line x1="11" 
y1="3788.75" x2="788" y2="3788.75" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1" stroke-dasharray="1,4"/><line 
x1="717.2181" y1="3589.599" x2="717.2181" y2="3609.6928" 
marker-end="url(#DimensionArrow_Marker)" 
marker-start="url(#DimensionArrow_Marker_2)" stroke="#738a05" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line 
x1="738.25" y1="3589.5993" x2="738.25" y2
 ="3685.65" marker-end="url(#DimensionArrow_Marker_3)" 
marker-start="url(#DimensionArrow_Marker_4)" stroke="#bd3612" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line 
x1="759.16273" y1="3631.8496" x2="757.83727" y2="3777.6504" 
marker-end="url(#DimensionArrow_Marker_5)" 
marker-start="url(#DimensionArrow_Marker_6)" stroke="#2076c8" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><line 
x1="779.5" y1="3708.35" x2="779.5" y2="3840.1437" 
marker-end="url(#DimensionArrow_Marker_7)" 
marker-start="url(#DimensionArrow_Marker_8)" stroke="#a57706" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/><text 
transform="translate(121 3547)" fill="black"><tspan font-family="Helvetica" 
font-size="12" font-weight="bold" x="2.1445312" y="11" 
textLength="146.04492">Local RocksDB directory </tspan><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" x="1.8134766" y="25" 
textLength="143.37305">for Operator 2, Subtask 1</tspan></text><text transfo
 rm="translate(383.07846 3547.0001)" fill="black"><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" x=".1484375" y="11" 
textLength="162.703125">Shared States in Checkpoint</tspan><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" x="6.9921875" y="25" 
textLength="135.01172">(Key -&gt; uploaded DFS fi</tspan><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" x="142.00391" y="25" 
textLength="14.003906">le)</tspan></text><text transform="translate(593.125 
3547.0003)" fill="black"><tspan font-family="Helvetica" font-size="12" 
font-weight="bold" x="9.8203125" y="11" textLength="76.69336">Shared State 
</tspan><tspan font-family="Helvetica" font-size="12" font-weight="bold" 
x=".16113281" y="25" textLength="92.677734">Registry Counts</tspan></text><text 
transform="translate(712 3547.0003)" fill="black"><tspan 
font-family="Helvetica" font-size="12" font-weight="bold" x="11.161133" y="11" 
textLength="54.01172">Retained </tspan><tspan font-family="Helve
 tica" font-size="12" font-weight="bold" x=".49414062" y="25" 
textLength="72.01172">Checkpoints</tspan></text><line x1="42" y1="3550.5" 
x2="42" y2="3850.7437" stroke="black" stroke-linecap="round" 
stroke-linejoin="round" stroke-width="1" stroke-dasharray="1,4"/><line 
x1="354.5" y1="3550.5" x2="354.5" y2="3849.7437" stroke="black" 
stroke-linecap="round" stroke-linejoin="round" stroke-width="1" 
stroke-dasharray="1,4"/><line x1="574" y1="3550.5" x2="574" y2="3848.7437" 
stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" 
stroke-dasharray="1,4"/><line x1="706.875" y1="3550.5" x2="706.875" 
y2="3848.7437" stroke="black" stroke-linecap="round" stroke-linejoin="round" 
stroke-width="1" stroke-dasharray="1,4"/><line x1="12" y1="3578.2088" x2="789" 
y2="3578.2088" stroke="black" stroke-linecap="round" stroke-linejoin="round" 
stroke-width="1" stroke-dasharray="1,4"/><text transform="translate(191 
3796.4586)" fill="black"><tspan font-family="Monaco" font-size="7" font-wei
 ght="500" fill="black" x=".29589844" y="7" 
textLength="50.408203">+sstable-(6)</tspan></text></g></g></svg>

http://git-wip-us.apache.org/repos/asf/flink-web/blob/035337bd/content/index.html
----------------------------------------------------------------------
diff --git a/content/index.html b/content/index.html
index ce6ac23..6bce04e 100644
--- a/content/index.html
+++ b/content/index.html
@@ -168,6 +168,9 @@
 
   <dl>
       
+        <dt> <a 
href="/features/2018/01/30/incremental-checkpointing.html">Managing Large State 
in Apache Flink: An Intro to Incremental Checkpointing</a></dt>
+        <dd>Flink 1.3.0 introduced incremental checkpointing, making it 
possible for applications with large state to generate checkpoints more 
efficiently.</dd>
+      
         <dt> <a href="/news/2017/12/21/2017-year-in-review.html">Apache Flink 
in 2017: Year in Review</a></dt>
         <dd>As 2017 comes to a close, let's take a moment to look back on the 
Flink community's great work during the past year.</dd>
       
@@ -190,9 +193,6 @@ what’s coming in Flink 1.4.0 as well as a preview of what 
the Flink community
         <dd><p>The Apache Flink community released the second bugfix version 
of the Apache Flink 1.3 series.</p>
 
 </dd>
-      
-        <dt> <a href="/features/2017/07/04/flink-rescalable-state.html">A Deep 
Dive into Rescalable State in Apache Flink</a></dt>
-        <dd><p>A primer on stateful stream processing and an in-depth 
walkthrough of rescalable state in Apache Flink.</p></dd>
     
   </dl>
 

Reply via email to