flink-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From u..@apache.org
Subject [59/84] [abbrv] flink-web git commit: Rebuild website
Date Wed, 18 Jan 2017 14:00:59 GMT
http://git-wip-us.apache.org/repos/asf/flink-web/blob/61adc137/content/news/2015/09/16/off-heap-memory.html
----------------------------------------------------------------------
diff --git a/content/news/2015/09/16/off-heap-memory.html b/content/news/2015/09/16/off-heap-memory.html
new file mode 100644
index 0000000..60d7bda
--- /dev/null
+++ b/content/news/2015/09/16/off-heap-memory.html
@@ -0,0 +1,1083 @@
+<!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: Off-heap Memory in Apache Flink and the curious JIT compiler</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/navbar-brand-logo.png" 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=" active 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.1" 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.1" target="_blank">1.1 (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-release-1.2" target="_blank">1.2 (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.1/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>Off-heap Memory in Apache Flink and the curious JIT compiler</h1>
+
+      <article>
+        <p>16 Sep 2015 by Stephan Ewen (<a href="https://twitter.com/stephanewen">@stephanewen</a>)</p>
+
+<p>Running data-intensive code in the JVM and making it well-behaved is tricky. Systems that put billions of data objects naively onto the JVM heap face unpredictable OutOfMemoryErrors and Garbage Collection stalls. Of course, you still want to to keep your data in memory as much as possible, for speed and responsiveness of the processing applications. In that context, “off-heap” has become almost something like a magic word to solve these problems.</p>
+
+<p>In this blog post, we will look at how Flink exploits off-heap memory. The feature is part of the upcoming release, but you can try it out with the latest nightly builds. We will also give a few interesting insights into the behavior for Java’s JIT compiler for highly optimized methods and loops.</p>
+
+<h2 id="recap-memory-management-in-flink">Recap: Memory Management in Flink</h2>
+
+<p>To understand Flink’s approach to off-heap memory, we need to recap Flink’s approach to custom managed memory. We have written an <a href="/news/2015/05/11/Juggling-with-Bits-and-Bytes.html">earlier blog post about how Flink manages JVM memory itself</a></p>
+
+<p>As a summary, the core part is that Flink implements its algorithms not against Java objects, arrays, or lists, but actually against a data structure similar to <code>java.nio.ByteBuffer</code>. Flink uses its own specialized version, called <a href="https://github.com/apache/flink/blob/release-0.9.1-rc1/flink-core/src/main/java/org/apache/flink/core/memory/MemorySegment.java"><code>MemorySegment</code></a> on which algorithms put and get at specific positions ints, longs, byte arrays, etc, and compare and copy memory. The memory segments are held and distributed by a central component (called <code>MemoryManager</code>) from which algorithms request segments according to their calculated memory budgets.</p>
+
+<p>Don’t believe that this can be fast? Have a look at the <a href="/news/2015/05/11/Juggling-with-Bits-and-Bytes.html">benchmarks in the earlier blogpost</a>, which show that it is actually often much faster than working on objects, due to better control over data layout (cache efficiency, data size), and reducing the pressure on Java’s Garbage Collector.</p>
+
+<p>This form of memory management has been in Flink for a long time. Anecdotally, the first public demo of Flink’s predecessor project <em>Stratosphere</em>, at the VLDB conference in 2010, was running its programs with custom managed memory (although I believe few attendees were aware of that).</p>
+
+<h2 id="why-actually-bother-with-off-heap-memory">Why actually bother with off-heap memory?</h2>
+
+<p>Given that Flink has a sophisticated level of managing on-heap memory, why do we even bother with off-heap memory? It is true that <em>“out of memory”</em> has been much less of a problem for Flink because of its heap memory management techniques. Nonetheless, there are a few good reasons to offer the possibility to move Flink’s managed memory out of the JVM heap:</p>
+
+<ul>
+  <li>
+    <p>Very large JVMs (100s of GBytes heap memory) tend to be tricky. It takes long to start them (allocate and initialize heap) and garbage collection stalls can be huge (minutes). While newer incremental garbage collectors (like G1) mitigate this problem to some extend, an even better solution is to just make the heap much smaller and allocate Flink’s managed memory chunks outside the heap.</p>
+  </li>
+  <li>
+    <p>I/O and network efficiency: In many cases, we write MemorySegments to disk (spilling) or to the network (data transfer). Off-heap memory can be written/transferred with zero copies, while heap memory always incurs an additional memory copy.</p>
+  </li>
+  <li>
+    <p>Off-heap memory can actually be owned by other processes. That way, cached data survives process crashes (due to user code exceptions) and can be used for recovery. Flink does not exploit that, yet, but it is interesting future work.</p>
+  </li>
+</ul>
+
+<p>The opposite question is also valid. Why should Flink ever not use off-heap memory?</p>
+
+<ul>
+  <li>
+    <p>On-heap is easier and interplays better with tools. Some container environments and monitoring tools get confused when the monitored heap size does not remotely reflect the amount of memory used by the process.</p>
+  </li>
+  <li>
+    <p>Short lived memory segments are cheaper on the heap. Flink sometimes needs to allocate some short lived buffers, which works cheaper on the heap than off-heap.</p>
+  </li>
+  <li>
+    <p>Some operations are actually a bit faster on heap memory (or the JIT compiler understands them better).</p>
+  </li>
+</ul>
+
+<h2 id="the-off-heap-memory-implementation">The off-heap Memory Implementation</h2>
+
+<p>Given that all memory intensive internal algorithms are already implemented against the <code>MemorySegment</code>, our implementation to switch to off-heap memory is actually trivial. You can compare it to replacing all <code>ByteBuffer.allocate(numBytes)</code> calls with <code>ByteBuffer.allocateDirect(numBytes)</code>. In Flink’s case it meant that we made the <code>MemorySegment</code> abstract and added the <code>HeapMemorySegment</code> and <code>OffHeapMemorySegment</code> subclasses. The <code>OffHeapMemorySegment</code> takes the off-heap memory pointer from a <code>java.nio.DirectByteBuffer</code> and implements its specialized access methods using <code>sun.misc.Unsafe</code>. We also made a few adjustments to the startup scripts and the deployment code to make sure that the JVM is permitted enough off-heap memory (direct memory, <em>-XX:MaxDirectMemorySize</em>).</p>
+
+<p>In practice we had to go one step further, to make the implementation perform well. While the <code>ByteBuffer</code> is used in I/O code paths to compose headers and move bulk memory into place, the MemorySegment is part of the innermost loops of many algorithms (sorting, hash tables, …). That means that the access methods have to be as fast as possible.</p>
+
+<h2 id="understanding-the-jit-and-tuning-the-implementation">Understanding the JIT and tuning the implementation</h2>
+
+<p>The <code>MemorySegment</code> was (before our change) a standalone class, it was <em>final</em> (had no subclasses). Via <em>Class Hierarchy Analysis (CHA)</em>, the JIT compiler was able to determine that all of the accessor method calls go to one specific implementation. That way, all method calls can be perfectly de-virtualized and inlined, which is essential to performance, and the basis for all further optimizations (like vectorization of the calling loop).</p>
+
+<p>With two different memory segments loaded at the same time, the JIT compiler cannot perform the same level of optimization any more, which results in a noticeable difference in performance: A slowdown of about 2.7 x in the following example:</p>
+
+<div class="highlight"><pre><code>Writing 100000 x 32768 bytes to 32768 bytes segment:
+
+HeapMemorySegment    (standalone) : 1,441 msecs
+OffHeapMemorySegment (standalone) : 1,628 msecs
+HeapMemorySegment    (subclass)   : 3,841 msecs
+OffHeapMemorySegment (subclass)   : 3,847 msecs
+</code></pre></div>
+
+<p>To get back to the original performance, we explored two approaches:</p>
+
+<h3 id="approach-1-make-sure-that-only-one-memory-segment-implementation-is-ever-loaded">Approach 1: Make sure that only one memory segment implementation is ever loaded.</h3>
+
+<p>We re-structured the code a bit to make sure that all places that produce long-lived and short-lived memory segments instantiate the same MemorySegment subclass (Heap- or Off-Heap segment). Using factories rather than directly instantiating the memory segment classes, this was straightforward.</p>
+
+<p>Experiments (see appendix) showed that the JIT compiler properly detects this (via hierarchy analysis) and that it can perform the same level of aggressive optimization as before, when there was only one <code>MemorySegment</code> class.</p>
+
+<h3 id="approach-2-write-one-segment-that-handles-both-heap-and-off-heap-memory">Approach 2: Write one segment that handles both heap and off-heap memory</h3>
+
+<p>We created a class <code>HybridMemorySegment</code> which handles transparently both heap- and off-heap memory. It can be initialized either with a byte array (heap memory), or with a pointer to a memory region outside the heap (off-heap memory).</p>
+
+<p>Fortunately, there is a nice trick to do this without introducing code branches and specialized handling of the two different memory types. The trick is based on the way that the <code>sun.misc.Unsafe</code> methods interpret object references. To illustrate this, we take the method that gets a long integer from a memory position:</p>
+
+<div class="highlight"><pre><code>sun.misc.Unsafe.getLong(Object reference, long offset)
+</code></pre></div>
+
+<p>The method accepts an object reference, takes its memory address, and add the offset to obtain a pointer. It then fetches the eight bytes at the address pointed to and interprets them as a long integer. Since the method accepts <em>null</em> as the reference (and interprets it a <em>zero</em>) one can write a method that fetches a long integer seamlessly from heap and off-heap memory as follows:</p>
+
+<div class="highlight"><pre><code class="language-java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">HybridMemorySegment</span> <span class="o">{</span>
+
+  <span class="kd">private</span> <span class="kd">final</span> <span class="kt">byte</span><span class="o">[]</span> <span class="n">heapMemory</span><span class="o">;</span>  <span class="c1">// non-null in heap case, null in off-heap case</span>
+  <span class="kd">private</span> <span class="kd">final</span> <span class="kt">long</span> <span class="n">address</span><span class="o">;</span>       <span class="c1">// may be absolute, or relative to byte[]</span>
+
+
+  <span class="c1">// method of interest</span>
+  <span class="kd">public</span> <span class="kt">long</span> <span class="nf">getLong</span><span class="o">(</span><span class="kt">int</span> <span class="n">pos</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">return</span> <span class="n">UNSAFE</span><span class="o">.</span><span class="na">getLong</span><span class="o">(</span><span class="n">heapMemory</span><span class="o">,</span> <span class="n">address</span> <span class="o">+</span> <span class="n">pos</span><span class="o">);</span>
+  <span class="o">}</span>
+
+
+  <span class="c1">// initialize for heap memory</span>
+  <span class="kd">public</span> <span class="nf">HybridMemorySegment</span><span class="o">(</span><span class="kt">byte</span><span class="o">[]</span> <span class="n">heapMemory</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">this</span><span class="o">.</span><span class="na">heapMemory</span> <span class="o">=</span> <span class="n">heapMemory</span><span class="o">;</span>
+    <span class="k">this</span><span class="o">.</span><span class="na">address</span> <span class="o">=</span> <span class="n">UNSAFE</span><span class="o">.</span><span class="na">arrayBaseOffset</span><span class="o">(</span><span class="kt">byte</span><span class="o">[].</span><span class="na">class</span><span class="o">)</span>
+  <span class="o">}</span>
+  
+  <span class="c1">// initialize for off-heap memory</span>
+  <span class="kd">public</span> <span class="nf">HybridMemorySegment</span><span class="o">(</span><span class="kt">long</span> <span class="n">offheapPointer</span><span class="o">)</span> <span class="o">{</span>
+    <span class="k">this</span><span class="o">.</span><span class="na">heapMemory</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
+    <span class="k">this</span><span class="o">.</span><span class="na">address</span> <span class="o">=</span> <span class="n">offheapPointer</span>
+  <span class="o">}</span>
+<span class="o">}</span></code></pre></div>
+
+<p>To check whether both cases (heap and off-heap) really result in the same code paths (no hidden branches inside the <code>Unsafe.getLong(Object, long)</code> method) one can check out the C++ source code of <code>sun.misc.Unsafe</code>, available here: <a href="http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/prims/unsafe.cpp">http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/prims/unsafe.cpp</a></p>
+
+<p>Of particular interest is the macro in line 155, which is the base of all GET methods. Tracing the function calls (many are no-ops), one can see that both variants of Unsafe’s <code>getLong()</code> result in the same code:
+Either <code>0 + absolutePointer</code> or <code>objectRefAddress + offset</code>.</p>
+
+<h2 id="summary">Summary</h2>
+
+<p>We ended up choosing a combination of both techniques:</p>
+
+<ul>
+  <li>
+    <p>For off-heap memory, we use the <code>HybridMemorySegment</code> from approach (2) which can represent both heap and off-heap memory. That way, the same class represents the long-lived off-heap memory as the short-lived temporary buffers allocated (or wrapped) on the heap.</p>
+  </li>
+  <li>
+    <p>We follow approach (1) to use factories to make sure that one segment is ever only loaded, which gives peak performance. We can exploit the performance benefits of the <code>HeapMemorySegment</code> on individual byte operations, and we have a mechanism in place to add further implementations of <code>MemorySegments</code> for the case that Oracle really removes <code>sun.misc.Unsafe</code> in future Java versions.</p>
+  </li>
+</ul>
+
+<p>The final code can be found in the Flink repository, under <a href="https://github.com/apache/flink/tree/master/flink-core/src/main/java/org/apache/flink/core/memory">https://github.com/apache/flink/tree/master/flink-core/src/main/java/org/apache/flink/core/memory</a></p>
+
+<p>Detailed micro benchmarks are in the appendix.  A summary of the findings is as follows:</p>
+
+<ul>
+  <li>
+    <p>The <code>HybridMemorySegment</code> performs equally well in heap and off-heap memory, as is to be expected (the code paths are the same)</p>
+  </li>
+  <li>
+    <p>The <code>HeapMemorySegment</code> is quite a bit faster in reading individual bytes, not so much at writing them. Access to a <em>byte[]</em> is after all a bit cheaper than an invocation of a <code>sun.misc.Unsafe</code> method, even when JIT-ed.</p>
+  </li>
+  <li>
+    <p>The abstract class <code>MemorySegment</code> (with its subclasses <code>HeapMemorySegment</code> and <code>HybridMemorySegment</code>) performs as well as any specialized non-abstract class, as long as only one subclass is loaded. When both are loaded, performance may suffer by a factor of 2.7 x on certain operations.</p>
+  </li>
+  <li>
+    <p>How badly the performance degrades in cases where both MemorySegment subclasses are loaded seems to depend a lot on which subclass is loaded and operated on before and after which. Sometimes, performance is affected more than other times. It seems to be an artifact of the JIT’s code profiling and how heavily it performs optimistic specialization towards certain subclasses.</p>
+  </li>
+</ul>
+
+<p>There is still a bit of mystery left, specifically why sometimes code is faster when it performs more checks (has more instructions and an additional branch). Even though the branch is perfectly predictable, this seems counter-intuitive. The only explanation that we could come up with is that the branch optimizations (such as optimistic elimination etc) result in code that does better register allocation (for whatever reason, maybe the intermediate instructions just fit the allocation algorithm better).</p>
+
+<h2 id="tldr">tl;dr</h2>
+
+<ul>
+  <li>
+    <p>Off-heap memory in Flink complements the already very fast on-heap memory management. It improves the scalability to very large heap sizes and reduces memory copies for network and disk I/O.</p>
+  </li>
+  <li>
+    <p>Flink’s already present memory management infrastructure made the addition of off-heap memory simple. Off-heap memory is not only used for caching data, Flink can actually sort data off-heap and build hash tables off-heap.</p>
+  </li>
+  <li>
+    <p>We play a few nice tricks in the implementation to make sure the code is as friendly as possible to the JIT compiler and processor, to make the managed memory accesses are as fast as possible.</p>
+  </li>
+  <li>
+    <p>Understanding the JVM’s JIT compiler is tough - one needs a lot of (randomized) micro benchmarking to examine its behavior.</p>
+  </li>
+</ul>
+
+<hr />
+
+<h2 id="appendix-detailed-micro-benchmarks">Appendix: Detailed Micro Benchmarks</h2>
+
+<p>These microbenchmarks test the performance of the different memory segment implementations on various operation.</p>
+
+<p>Each experiments tests the different implementations multiple times in different orders, to balance the advantage/disadvantage of the JIT compiler specializing towards certain code paths. All experiments were run 5x, discarding the fastest and slowest run, and then averaged. This compensated for delay before the JIT kicks in.</p>
+
+<p>My setup:</p>
+
+<ul>
+  <li>Oracle Java 8 (1.8.0_25)</li>
+  <li>4 GBytes JVM heap (the experiments need 1.4 GBytes Heap + 1 GBytes direct memory)</li>
+  <li>Intel Core i7-4700MQ CPU, 2.40GHz (4 cores, 8 hardware contexts)</li>
+</ul>
+
+<p>The tested implementations are</p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Type</th>
+      <th>Description</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code> <em>(exclusive)</em></td>
+      <td>The case where it is the only loaded MemorySegment subclass.</td>
+    </tr>
+    <tr>
+      <td><code>HeapMemorySegment</code> <em>(mixed)</em></td>
+      <td>The case where both the HeapMemorySegment and the HybridMemorySegment are loaded.</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code> <em>(heap-exclusive)</em></td>
+      <td>Backed by heap memory, and the case where it is the only loaded MemorySegment class.</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code> <em>(heap-mixed)</em></td>
+      <td>Backed by heap memory, and the case where both the HeapMemorySegment and the HybridMemorySegment are loaded.</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code> <em>(off-heap-exclusive)</em></td>
+      <td>Backed by off-heap memory, and the case where it is the only loaded MemorySegment class.</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code> <em>(off-heap-mixed)</em></td>
+      <td>Backed by heap off-memory, and the case where both the HeapMemorySegment and the HybridMemorySegment are loaded.</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>Has no class hierarchy and virtual methods at all.</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code> <em>(heap)</em></td>
+      <td>Has no class hierarchy and virtual methods at all, backed by heap memory.</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code> <em>(off-heap)</em></td>
+      <td>Has no class hierarchy and virtual methods at all, backed by off-heap memory.</td>
+    </tr>
+  </tbody>
+</table>
+
+<div class="small">
+<h3 id="byte-accesses">Byte accesses</h3>
+
+<p><strong>Writing 100000 x 32768 bytes to 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, exclusive</td>
+      <td>1,441 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>3,841 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, exclusive</td>
+      <td>1,626 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, exclusive</td>
+      <td>1,628 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>3,848 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>3,847 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>1,442 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>1,623 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>1,620 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 100000 x 32768 bytes from 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, exclusive</td>
+      <td>1,326 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>1,378 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, exclusive</td>
+      <td>2,029 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, exclusive</td>
+      <td>2,030 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>2,047 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>2,049 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>1,331 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>2,030 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>2,030 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Writing 10 x 1073741824 bytes to 1073741824 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, exclusive</td>
+      <td>5,602 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>12,570 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, exclusive</td>
+      <td>5,691 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, exclusive</td>
+      <td>5,691 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>12,566 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>12,556 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>5,599 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>5,687 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>5,681 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 10 x 1073741824 bytes from 1073741824 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, exclusive</td>
+      <td>4,243 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>4,265 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, exclusive</td>
+      <td>6,730 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, exclusive</td>
+      <td>6,725 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>6,933 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>6,926 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>4,247 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>6,919 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>6,916 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="byte-array-accesses">Byte Array accesses</h3>
+
+<p><strong>Writing 100000 x 32 byte[1024] to 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>164 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>163 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>163 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>165 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>182 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>176 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 100000 x 32 byte[1024] from 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>157 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>155 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>162 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>161 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>175 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>179 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Writing 10 x 1048576 byte[1024] to 1073741824 bytes segment</strong> </p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>1,164 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>1,173 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>1,157 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>1,169 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>1,174 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>1,166 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 10 x 1048576 byte[1024] from 1073741824 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>854 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>853 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>854 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>857 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>896 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>887 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="long-integer-accesses">Long integer accesses</h3>
+
+<p><em>(note that the heap and off-heap segments use the same or comparable code for this)</em></p>
+
+<p><strong>Writing 100000 x 4096 longs to 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>221 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>222 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>221 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>194 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>220 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>221 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 100000 x 4096 longs from 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>233 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>232 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>231 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>232 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>232 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>233 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Writing 10 x 134217728 longs to 1073741824 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>1,120 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>1,120 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>1,115 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>1,148 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>1,116 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>1,113 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 10 x 134217728 longs from 1073741824 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>1,097 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>1,099 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>1,093 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>917 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>1,105 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>1,097 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="integer-accesses">Integer accesses</h3>
+
+<p><em>(note that the heap and off-heap segments use the same or comparable code for this)</em></p>
+
+<p><strong>Writing 100000 x 8192 ints to 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>578 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>580 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>576 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>624 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>576 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>578 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 100000 x 8192 ints from 32768 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>464 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>464 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>465 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>463 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>464 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>463 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Writing 10 x 268435456 ints to 1073741824 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>2,187 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>2,161 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>2,152 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>2,770 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>2,161 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>2,157 msecs</td>
+    </tr>
+  </tbody>
+</table>
+
+<p><strong>Reading 10 x 268435456 ints from 1073741824 bytes segment</strong></p>
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>Segment</th>
+      <th>Time</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td><code>HeapMemorySegment</code>, mixed</td>
+      <td>1,782 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, heap, mixed</td>
+      <td>1,783 msecs</td>
+    </tr>
+    <tr>
+      <td><code>HybridMemorySegment</code>, off-heap, mixed</td>
+      <td>1,774 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHeapSegment</code></td>
+      <td>1,501 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, heap</td>
+      <td>1,774 msecs</td>
+    </tr>
+    <tr>
+      <td><code>PureHybridSegment</code>, off-heap</td>
+      <td>1,771 msecs</td>
+    </tr>
+  </tbody>
+</table>
+</div>
+
+
+      </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-2016 <a href="http://apache.org">The Apache Software Foundation</a>. All Rights Reserved.</p>
+        <p>Apache Flink, Apache, 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/61adc137/content/news/2015/11/16/release-0.10.0.html
----------------------------------------------------------------------
diff --git a/content/news/2015/11/16/release-0.10.0.html b/content/news/2015/11/16/release-0.10.0.html
new file mode 100644
index 0000000..93bad1f
--- /dev/null
+++ b/content/news/2015/11/16/release-0.10.0.html
@@ -0,0 +1,367 @@
+<!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: Announcing Apache Flink 0.10.0</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/navbar-brand-logo.png" 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=" active 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.1" 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.1" target="_blank">1.1 (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-release-1.2" target="_blank">1.2 (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.1/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>Announcing Apache Flink 0.10.0</h1>
+
+      <article>
+        <p>16 Nov 2015</p>
+
+<p>The Apache Flink community is pleased to announce the availability of the 0.10.0 release. The community put significant effort into improving and extending Apache Flink since the last release, focusing on data stream processing and operational features. About 80 contributors provided bug fixes, improvements, and new features such that in total more than 400 JIRA issues could be resolved.</p>
+
+<p>For Flink 0.10.0, the focus of the community was to graduate the DataStream API from beta and to evolve Apache Flink into a production-ready stream data processor with a competitive feature set. These efforts resulted in support for event-time and out-of-order streams, exactly-once guarantees in the case of failures, a very flexible windowing mechanism, sophisticated operator state management, and a highly-available cluster operation mode. Flink 0.10.0 also brings a new monitoring dashboard with real-time system and job monitoring capabilities. Both batch and streaming modes of Flink benefit from the new high availability and improved monitoring features. Needless to say that Flink 0.10.0 includes many more features, improvements, and bug fixes.</p>
+
+<p>We encourage everyone to <a href="/downloads.html">download the release</a> and <a href="https://ci.apache.org/projects/flink/flink-docs-release-0.10/">check out the documentation</a>. Feedback through the Flink <a href="/community.html#mailing-lists">mailing lists</a> is, as always, very welcome!</p>
+
+<h2 id="new-features">New Features</h2>
+
+<h3 id="event-time-stream-processing">Event-time Stream Processing</h3>
+
+<p>Many stream processing applications consume data from sources that produce events with associated timestamps such as sensor or user-interaction events. Very often, events have to be collected from several sources such that it is usually not guaranteed that events arrive in the exact order of their timestamps at the stream processor. Consequently, stream processors must take out-of-order elements into account in order to produce results which are correct and consistent with respect to the timestamps of the events. With release 0.10.0, Apache Flink supports event-time processing as well as ingestion-time and processing-time processing. See <a href="https://issues.apache.org/jira/browse/FLINK-2674">FLINK-2674</a> for details.</p>
+
+<h3 id="stateful-stream-processing">Stateful Stream Processing</h3>
+
+<p>Operators that maintain and update state are a common pattern in many stream processing applications. Since streaming applications tend to run for a very long time, operator state can become very valuable and impossible to recompute. In order to enable fault-tolerance, operator state must be backed up to persistent storage in regular intervals. Flink 0.10.0 offers flexible interfaces to define, update, and query operator state and hooks to connect various state backends.</p>
+
+<h3 id="highly-available-cluster-operations">Highly-available Cluster Operations</h3>
+
+<p>Stream processing applications may be live for months. Therefore, a production-ready stream processor must be highly-available and continue to process data even in the face of failures. With release 0.10.0, Flink supports high availability modes for standalone cluster and <a href="https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html">YARN</a> setups, eliminating any single point of failure. In this mode, Flink relies on <a href="https://zookeeper.apache.org">Apache Zookeeper</a> for leader election and persisting small sized meta-data of running jobs. You can <a href="https://ci.apache.org/projects/flink/flink-docs-release-0.10/setup/jobmanager_high_availability.html">check out the documentation</a> to see how to enable high availability. See <a href="https://issues.apache.org/jira/browse/FLINK-2287">FLINK-2287</a> for details.</p>
+
+<h3 id="graduated-datastream-api">Graduated DataStream API</h3>
+
+<p>The DataStream API was revised based on user feedback and with foresight for upcoming features and graduated from beta status to fully supported. The most obvious changes are related to the methods for stream partitioning and window operations. The new windowing system is based on the concepts of window assigners, triggers, and evictors, inspired by the <a href="http://www.vldb.org/pvldb/vol8/p1792-Akidau.pdf">Dataflow Model</a>. The new API is fully described in the <a href="https://ci.apache.org/projects/flink/flink-docs-release-0.10/apis/streaming_guide.html">DataStream API documentation</a>. This <a href="https://cwiki.apache.org/confluence/display/FLINK/Migration+Guide%3A+0.9.x+to+0.10.x">migration guide</a> will help to port your Flink 0.9 DataStream programs to the revised API of Flink 0.10.0. See <a href="https://issues.apache.org/jira/browse/FLINK-2674">FLINK-2674</a> and <a href="https://issues.apache.org/jira/browse/FLINK-2877">FLINK-2877</a> for details.</p>
+
+<h3 id="new-connectors-for-data-streams">New Connectors for Data Streams</h3>
+
+<p>Apache Flink 0.10.0 features DataStream sources and sinks for many common data producers and stores. This includes an exactly-once rolling file sink which supports any file system, including HDFS, local FS, and S3. We also updated the <a href="https://kafka.apache.org">Apache Kafka</a> producer to use the new producer API, and added a connectors for <a href="https://github.com/elastic/elasticsearch">ElasticSearch</a> and <a href="https://nifi.apache.org">Apache Nifi</a>. More connectors for DataStream programs will be added by the community in the future. See the following JIRA issues for details <a href="https://issues.apache.org/jira/browse/FLINK-2583">FLINK-2583</a>, <a href="https://issues.apache.org/jira/browse/FLINK-2386">FLINK-2386</a>, <a href="https://issues.apache.org/jira/browse/FLINK-2372">FLINK-2372</a>, <a href="https://issues.apache.org/jira/browse/FLINK-2740">FLINK-2740</a>, and <a href="https://issues.apache.org/jira/browse/FLINK-2558">FLINK-2558</a>.</p>
+
+<h3 id="new-web-dashboard--real-time-monitoring">New Web Dashboard &amp; Real-time Monitoring</h3>
+
+<p>The 0.10.0 release features a newly designed and significantly improved monitoring dashboard for Apache Flink. The new dashboard visualizes the progress of running jobs and shows real-time statistics of processed data volumes and record counts. Moreover, it gives access to resource usage and JVM statistics of TaskManagers including JVM heap usage and garbage collection details. The following screenshot shows the job view of the new dashboard.</p>
+
+<center>
+<img src="/img/blog/new-dashboard-screenshot.png" style="width:90%;margin:15px" />
+</center>
+
+<p>The web server that provides all monitoring statistics has been designed with a REST interface allowing other systems to also access the internal system metrics. See <a href="https://issues.apache.org/jira/browse/FLINK-2357">FLINK-2357</a> for details.</p>
+
+<h3 id="off-heap-managed-memory">Off-heap Managed Memory</h3>
+
+<p>Flink’s internal operators (such as its sort algorithm and hash tables) write data to and read data from managed memory to achieve memory-safe operations and reduce garbage collection overhead. Until version 0.10.0, managed memory was allocated only from JVM heap memory. With this release, managed memory can also be allocated from off-heap memory. This will facilitate shorter TaskManager start-up times as well as reduce garbage collection pressure. See <a href="https://ci.apache.org/projects/flink/flink-docs-release-0.10/setup/config.html#managed-memory">the documentation</a> to learn how to configure managed memory on off-heap memory. JIRA issue <a href="https://issues.apache.org/jira/browse/FLINK-1320">FLINK-1320</a> contains further details.</p>
+
+<h3 id="outer-joins">Outer Joins</h3>
+
+<p>Outer joins have been one of the most frequently requested features for Flink’s <a href="https://ci.apache.org/projects/flink/flink-docs-release-0.10/apis/programming_guide.html">DataSet API</a>. Although there was a workaround to implement outer joins as CoGroup function, it had significant drawbacks including added code complexity and not being fully memory-safe. With release 0.10.0, Flink adds native support for <a href="https://ci.apache.org/projects/flink/flink-docs-release-0.10/apis/dataset_transformations.html#outerjoin">left, right, and full outer joins</a> to the DataSet API. All outer joins are backed by a memory-safe operator implementation that leverages Flink’s managed memory. See <a href="https://issues.apache.org/jira/browse/FLINK-687">FLINK-687</a> and <a href="https://issues.apache.org/jira/browse/FLINK-2107">FLINK-2107</a> for details.</p>
+
+<h3 id="gelly-major-improvements-and-scala-api">Gelly: Major Improvements and Scala API</h3>
+
+<p><a href="https://ci.apache.org/projects/flink/flink-docs-release-0.10/libs/gelly_guide.html">Gelly</a> is Flink’s API and library for processing and analyzing large-scale graphs. Gelly was introduced with release 0.9.0 and has been very well received by users and contributors. Based on user feedback, Gelly has been improved since then. In addition, Flink 0.10.0 introduces a Scala API for Gelly. See <a href="https://issues.apache.org/jira/browse/FLINK-2857">FLINK-2857</a> and <a href="https://issues.apache.org/jira/browse/FLINK-1962">FLINK-1962</a> for details.</p>
+
+<h2 id="more-improvements-and-fixes">More Improvements and Fixes</h2>
+
+<p>The Flink community resolved more than 400 issues. The following list is a selection of new features and fixed bugs.</p>
+
+<ul>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-1851">FLINK-1851</a> Java Table API does not support Casting</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2152">FLINK-2152</a> Provide zipWithIndex utility in flink-contrib</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2158">FLINK-2158</a> NullPointerException in DateSerializer.</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2240">FLINK-2240</a> Use BloomFilter to minimize probe side records which are spilled to disk in Hybrid-Hash-Join</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2533">FLINK-2533</a> Gap based random sample optimization</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2555">FLINK-2555</a> Hadoop Input/Output Formats are unable to access secured HDFS clusters</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2565">FLINK-2565</a> Support primitive arrays as keys</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2582">FLINK-2582</a> Document how to build Flink with other Scala versions</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2584">FLINK-2584</a> ASM dependency is not shaded away</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2689">FLINK-2689</a> Reusing null object for joins with SolutionSet</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2703">FLINK-2703</a> Remove log4j classes from fat jar / document how to use Flink with logback</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2763">FLINK-2763</a> Bug in Hybrid Hash Join: Request to spill a partition with less than two buffers.</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2767">FLINK-2767</a> Add support Scala 2.11 to Scala shell</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2774">FLINK-2774</a> Import Java API classes automatically in Flink’s Scala shell</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2782">FLINK-2782</a> Remove deprecated features for 0.10</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2800">FLINK-2800</a> kryo serialization problem</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2834">FLINK-2834</a> Global round-robin for temporary directories</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2842">FLINK-2842</a> S3FileSystem is broken</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2874">FLINK-2874</a> Certain Avro generated getters/setters not recognized</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2895">FLINK-2895</a> Duplicate immutable object creation</li>
+  <li><a href="https://issues.apache.org/jira/browse/FLINK-2964">FLINK-2964</a> MutableHashTable fails when spilling partitions without overflow segments</li>
+</ul>
+
+<h2 id="notice">Notice</h2>
+
+<p>As previously announced, Flink 0.10.0 no longer supports Java 6. If you are still using Java 6, please consider upgrading to Java 8 (Java 7 ended its free support in April 2015).
+Also note that some methods in the DataStream API had to be renamed as part of the API rework. For example the <code>groupBy</code> method has been renamed to <code>keyBy</code> and the windowing API changed. This <a href="https://cwiki.apache.org/confluence/display/FLINK/Migration+Guide%3A+0.9.x+to+0.10.x">migration guide</a> will help to port your Flink 0.9 DataStream programs to the revised API of Flink 0.10.0.</p>
+
+<h2 id="contributors">Contributors</h2>
+
+<ul>
+  <li>Alexander Alexandrov</li>
+  <li>Marton Balassi</li>
+  <li>Enrique Bautista</li>
+  <li>Faye Beligianni</li>
+  <li>Bryan Bende</li>
+  <li>Ajay Bhat</li>
+  <li>Chris Brinkman</li>
+  <li>Dmitry Buzdin</li>
+  <li>Kun Cao</li>
+  <li>Paris Carbone</li>
+  <li>Ufuk Celebi</li>
+  <li>Shivani Chandna</li>
+  <li>Liang Chen</li>
+  <li>Felix Cheung</li>
+  <li>Hubert Czerpak</li>
+  <li>Vimal Das</li>
+  <li>Behrouz Derakhshan</li>
+  <li>Suminda Dharmasena</li>
+  <li>Stephan Ewen</li>
+  <li>Fengbin Fang</li>
+  <li>Gyula Fora</li>
+  <li>Lun Gao</li>
+  <li>Gabor Gevay</li>
+  <li>Piotr Godek</li>
+  <li>Sachin Goel</li>
+  <li>Anton Haglund</li>
+  <li>Gábor Hermann</li>
+  <li>Greg Hogan</li>
+  <li>Fabian Hueske</li>
+  <li>Martin Junghanns</li>
+  <li>Vasia Kalavri</li>
+  <li>Ulf Karlsson</li>
+  <li>Frederick F. Kautz</li>
+  <li>Samia Khalid</li>
+  <li>Johannes Kirschnick</li>
+  <li>Kostas Kloudas</li>
+  <li>Alexander Kolb</li>
+  <li>Johann Kovacs</li>
+  <li>Aljoscha Krettek</li>
+  <li>Sebastian Kruse</li>
+  <li>Andreas Kunft</li>
+  <li>Chengxiang Li</li>
+  <li>Chen Liang</li>
+  <li>Andra Lungu</li>
+  <li>Suneel Marthi</li>
+  <li>Tamara Mendt</li>
+  <li>Robert Metzger</li>
+  <li>Maximilian Michels</li>
+  <li>Chiwan Park</li>
+  <li>Sahitya Pavurala</li>
+  <li>Pietro Pinoli</li>
+  <li>Ricky Pogalz</li>
+  <li>Niraj Rai</li>
+  <li>Lokesh Rajaram</li>
+  <li>Johannes Reifferscheid</li>
+  <li>Till Rohrmann</li>
+  <li>Henry Saputra</li>
+  <li>Matthias Sax</li>
+  <li>Shiti Saxena</li>
+  <li>Chesnay Schepler</li>
+  <li>Peter Schrott</li>
+  <li>Saumitra Shahapure</li>
+  <li>Nikolaas Steenbergen</li>
+  <li>Thomas Sun</li>
+  <li>Peter Szabo</li>
+  <li>Viktor Taranenko</li>
+  <li>Kostas Tzoumas</li>
+  <li>Pieter-Jan Van Aeken</li>
+  <li>Theodore Vasiloudis</li>
+  <li>Timo Walther</li>
+  <li>Chengxuan Wang</li>
+  <li>Huang Wei</li>
+  <li>Dawid Wysakowicz</li>
+  <li>Rerngvit Yanggratoke</li>
+  <li>Nezih Yigitbasi</li>
+  <li>Ted Yu</li>
+  <li>Rucong Zhang</li>
+  <li>Vyacheslav Zholudev</li>
+  <li>Zoltán Zvara</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-2016 <a href="http://apache.org">The Apache Software Foundation</a>. All Rights Reserved.</p>
+        <p>Apache Flink, Apache, 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/61adc137/content/news/2015/11/27/release-0.10.1.html
----------------------------------------------------------------------
diff --git a/content/news/2015/11/27/release-0.10.1.html b/content/news/2015/11/27/release-0.10.1.html
new file mode 100644
index 0000000..01e6b7f
--- /dev/null
+++ b/content/news/2015/11/27/release-0.10.1.html
@@ -0,0 +1,251 @@
+<!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: Flink 0.10.1 released</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/navbar-brand-logo.png" 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=" active 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.1" 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.1" target="_blank">1.1 (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-release-1.2" target="_blank">1.2 (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.1/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>Flink 0.10.1 released</h1>
+
+      <article>
+        <p>27 Nov 2015</p>
+
+<p>Today, the Flink community released the first bugfix release of the 0.10 series of Flink.</p>
+
+<p>We recommend all users updating to this release, by bumping the version of your Flink dependencies and updating the binaries on the server.</p>
+
+<h2 id="issues-fixed">Issues fixed</h2>
+
+<ul class="list-unstyled">
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2879">FLINK-2879</a>] -         Links in documentation are broken
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2938">FLINK-2938</a>] -         Streaming docs not in sync with latest state changes
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2942">FLINK-2942</a>] -         Dangling operators in web UI&#39;s program visualization (non-deterministic)
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2967">FLINK-2967</a>] -         TM address detection might not always detect the right interface on slow networks / overloaded JMs
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2977">FLINK-2977</a>] -         Cannot access HBase in a Kerberos secured Yarn cluster
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2987">FLINK-2987</a>] -         Flink 0.10 fails to start on YARN 2.6.0
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2989">FLINK-2989</a>] -         Job Cancel button doesn&#39;t work on Yarn
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3005">FLINK-3005</a>] -         Commons-collections object deserialization remote command execution vulnerability
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3011">FLINK-3011</a>] -         Cannot cancel failing/restarting streaming job from the command line
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3019">FLINK-3019</a>] -         CLI does not list running/restarting jobs
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3020">FLINK-3020</a>] -         Local streaming execution: set number of task manager slots to the maximum parallelism
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3024">FLINK-3024</a>] -         TimestampExtractor Does not Work When returning Long.MIN_VALUE
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3032">FLINK-3032</a>] -         Flink does not start on Hadoop 2.7.1 (HDP), due to class conflict
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3043">FLINK-3043</a>] -         Kafka Connector description in Streaming API guide is wrong/outdated
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3047">FLINK-3047</a>] -         Local batch execution: set number of task manager slots to the maximum parallelism
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3052">FLINK-3052</a>] -         Optimizer does not push properties out of bulk iterations
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2966">FLINK-2966</a>] -         Improve the way job duration is reported on web frontend.
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-2974">FLINK-2974</a>] -         Add periodic offset commit to Kafka Consumer if checkpointing is disabled
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3028">FLINK-3028</a>] -         Cannot cancel restarting job via web frontend
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3040">FLINK-3040</a>] -         Add docs describing how to configure State Backends
+</li>
+<li>[<a href="https://issues.apache.org/jira/browse/FLINK-3041">FLINK-3041</a>] -         Twitter Streaming Description section of Streaming Programming guide refers to an incorrect example &#39;TwitterLocal&#39;
+</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-2016 <a href="http://apache.org">The Apache Software Foundation</a>. All Rights Reserved.</p>
+        <p>Apache Flink, Apache, 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>


Mime
View raw message