This is an automated email from the ASF dual-hosted git repository. pnowojski pushed a commit to branch asf-site in repository https://gitbox.apache.org/repos/asf/flink-web.git
commit de596c53ecfaec5480cab1db7370c9fb5b37bb7a Author: Piotr Nowojski <[email protected]> AuthorDate: Wed Jul 7 14:38:36 2021 +0200 Rebuild website --- content/2021/07/07/backpressure.html | 448 +++++++++++++++++++++ content/blog/index.html | 2 +- .../img/blog/2021-07-07-backpressure/animated.png | Bin 0 -> 847082 bytes .../2021-07-07-backpressure/bottleneck-zoom.png | Bin 0 -> 185048 bytes .../2021-07-07-backpressure/simple-example.png | Bin 0 -> 102308 bytes .../2021-07-07-backpressure/sliding-window.png | Bin 0 -> 22391 bytes .../2021-07-07-backpressure/source-task-busy.png | Bin 0 -> 25852 bytes .../img/blog/2021-07-07-backpressure/subtasks.png | Bin 0 -> 137756 bytes content/index.html | 2 +- content/zh/index.html | 2 +- 10 files changed, 451 insertions(+), 3 deletions(-) diff --git a/content/2021/07/07/backpressure.html b/content/2021/07/07/backpressure.html new file mode 100644 index 0000000..1f7f6b4 --- /dev/null +++ b/content/2021/07/07/backpressure.html @@ -0,0 +1,448 @@ +<!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: How to identify the source of backpressure?</title> + <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> + <link rel="icon" href="/favicon.ico" type="image/x-icon"> + + <!-- Bootstrap --> + <link rel="stylesheet" href="/css/bootstrap.min.css"> + <link rel="stylesheet" href="/css/flink.css"> + <link rel="stylesheet" href="/css/syntax.css"> + + <!-- Blog RSS feed --> + <link href="/blog/feed.xml" rel="alternate" type="application/rss+xml" title="Apache Flink Blog: RSS feed" /> + + <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> + <!-- We need to load Jquery in the header for custom google analytics event tracking--> + <script src="/js/jquery.min.js"></script> + + <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body> + + + <!-- Main content. --> + <div class="container"> + <div class="row"> + + + <div id="sidebar" class="col-sm-3"> + + +<!-- Top navbar. --> + <nav class="navbar navbar-default"> + <!-- The logo. --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <div class="navbar-logo"> + <a href="/"> + <img alt="Apache Flink" src="/img/flink-header-logo.svg" width="147px" height="73px"> + </a> + </div> + </div><!-- /.navbar-header --> + + <!-- The navigation links. --> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav navbar-main"> + + <!-- First menu section explains visitors what Flink is --> + + <!-- What is Stream Processing? --> + <!-- + <li><a href="/streamprocessing1.html">What is Stream Processing?</a></li> + --> + + <!-- What is Flink? --> + <li><a href="/flink-architecture.html">What is Apache Flink?</a></li> + + + + <!-- What is Stateful Functions? --> + + <li><a href="/stateful-functions.html">What is Stateful Functions?</a></li> + + <!-- Use cases --> + <li><a href="/usecases.html">Use Cases</a></li> + + <!-- Powered by --> + <li><a href="/poweredby.html">Powered By</a></li> + + + + <!-- Second menu section aims to support Flink users --> + + <!-- Downloads --> + <li><a href="/downloads.html">Downloads</a></li> + + <!-- Getting Started --> + <li class="dropdown"> + <a class="dropdown-toggle" data-toggle="dropdown" href="#">Getting Started<span class="caret"></span></a> + <ul class="dropdown-menu"> + <li><a href="https://ci.apache.org/projects/flink/flink-docs-release-1.13//docs/try-flink/local_installation/" target="_blank">With Flink <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + <li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-release-3.0/getting-started/project-setup.html" target="_blank">With Flink Stateful Functions <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + <li><a href="/training.html">Training Course</a></li> + </ul> + </li> + + <!-- Documentation --> + <li class="dropdown"> + <a class="dropdown-toggle" data-toggle="dropdown" href="#">Documentation<span class="caret"></span></a> + <ul class="dropdown-menu"> + <li><a href="https://ci.apache.org/projects/flink/flink-docs-release-1.13" target="_blank">Flink 1.13 (Latest stable release) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + <li><a href="https://ci.apache.org/projects/flink/flink-docs-master" target="_blank">Flink Master (Latest Snapshot) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + <li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-release-3.0" target="_blank">Flink Stateful Functions 3.0 (Latest stable release) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + <li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-master" target="_blank">Flink Stateful Functions Master (Latest Snapshot) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + </ul> + </li> + + <!-- getting help --> + <li><a href="/gettinghelp.html">Getting Help</a></li> + + <!-- Blog --> + <li><a href="/blog/"><b>Flink Blog</b></a></li> + + + <!-- Flink-packages --> + <li> + <a href="https://flink-packages.org" target="_blank">flink-packages.org <small><span class="glyphicon glyphicon-new-window"></span></small></a> + </li> + + + <!-- Third menu section aim to support community and contributors --> + + <!-- Community --> + <li><a href="/community.html">Community & Project Info</a></li> + + <!-- Roadmap --> + <li><a href="/roadmap.html">Roadmap</a></li> + + <!-- Contribute --> + <li><a href="/contributing/how-to-contribute.html">How to Contribute</a></li> + + + <!-- GitHub --> + <li> + <a href="https://github.com/apache/flink" target="_blank">Flink on GitHub <small><span class="glyphicon glyphicon-new-window"></span></small></a> + </li> + + + + <!-- Language Switcher --> + <li> + + + <a href="/zh/2021/07/07/backpressure.html">中文版</a> + + + </li> + + </ul> + + <style> + .smalllinks:link { + display: inline-block !important; background: none; padding-top: 0px; padding-bottom: 0px; padding-right: 0px; min-width: 75px; + } + </style> + + <ul class="nav navbar-nav navbar-bottom"> + <hr /> + + <!-- Twitter --> + <li><a href="https://twitter.com/apacheflink" target="_blank">@ApacheFlink <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + + <!-- Visualizer --> + <li class=" hidden-md hidden-sm"><a href="/visualizer/" target="_blank">Plan Visualizer <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + + <li > + <a href="/security.html">Flink Security</a> + </li> + + <hr /> + + <li><a href="https://apache.org" target="_blank">Apache Software Foundation <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> + + <li> + + <a class="smalllinks" href="https://www.apache.org/licenses/" target="_blank">License</a> <small><span class="glyphicon glyphicon-new-window"></span></small> + + <a class="smalllinks" href="https://www.apache.org/security/" target="_blank">Security</a> <small><span class="glyphicon glyphicon-new-window"></span></small> + + <a class="smalllinks" href="https://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a> <small><span class="glyphicon glyphicon-new-window"></span></small> + + <a class="smalllinks" href="https://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a> <small><span class="glyphicon glyphicon-new-window"></span></small> + </li> + + </ul> + </div><!-- /.navbar-collapse --> + </nav> + + </div> + <div class="col-sm-9"> + <div class="row-fluid"> + <div class="col-sm-12"> + <div class="row"> + <h1>How to identify the source of backpressure?</h1> + <p><i></i></p> + + <article> + <p>07 Jul 2021 Piotr Nowojski (<a href="https://twitter.com/PiotrNowojski">@PiotrNowojski</a>)</p> + +<div class="page-toc"> +<ul id="markdown-toc"> + <li><a href="#what-is-backpressure" id="markdown-toc-what-is-backpressure">What is backpressure?</a> <ul> + <li><a href="#why-should-i-care-about-backpressure" id="markdown-toc-why-should-i-care-about-backpressure">Why should I care about backpressure?</a></li> + <li><a href="#why-shouldnt-i-care-about-backpressure" id="markdown-toc-why-shouldnt-i-care-about-backpressure">Why shouldn’t I care about backpressure?</a></li> + </ul> + </li> + <li><a href="#how-to-detect-and-track-down-the-source-of-backpressure" id="markdown-toc-how-to-detect-and-track-down-the-source-of-backpressure">How to detect and track down the source of backpressure?</a> <ul> + <li><a href="#what-are-those-numbers" id="markdown-toc-what-are-those-numbers">What are those numbers?</a></li> + <li><a href="#varying-load" id="markdown-toc-varying-load">Varying load</a></li> + </ul> + </li> + <li><a href="#what-can-i-do-with-backpressure" id="markdown-toc-what-can-i-do-with-backpressure">What can I do with backpressure?</a></li> +</ul> + +</div> + +<div class="row front-graphic"> + <img src="/img/blog/2021-07-07-backpressure/animated.png" alt="Backpressure monitoring in the web UI" /> + <p class="align-center">Backpressure monitoring in the web UI</p> +</div> + +<p>The backpressure topic was tackled from different angles over the last couple of years. However, when it comes +to identifying and analyzing sources of backpressure, things have changed quite a bit in the recent Flink releases +(especially with new additions to metrics and the web UI in Flink 1.13). This post will try to clarify some of +these changes and go into more detail about how to track down the source of backpressure, but first…</p> + +<h2 id="what-is-backpressure">What is backpressure?</h2> + +<p>This has been explained very well in an old, but still accurate, <a href="https://www.ververica.com/blog/how-flink-handles-backpressure">post by Ufuk Celebi</a>. +I highly recommend reading it if you are not familiar with this concept. For a much deeper and low-level understanding of +the topic and how Flink’s network stack works, there is a more <a href="https://alibabacloud.com/blog/analysis-of-network-flow-control-and-back-pressure-flink-advanced-tutorials_596632">advanced explanation available here</a>.</p> + +<p>At a high level, backpressure happens if some operator(s) in the Job Graph cannot process records at the +same rate as they are received. This fills up the input buffers of the subtask that is running this slow operator. +Once the input buffers are full, backpressure propagates to the output buffers of the upstream subtasks. +Once those are filled up, the upstream subtasks are also forced to slow down their records’ processing +rate to match the processing rate of the operator causing this bottleneck down the stream. Backpressure +further propagates up the stream until it reaches the source operators.</p> + +<p>As long as the load and available resources are static and none of the operators produce short bursts of +data (like windowing operators), those input/output buffers should only be in one of two states: almost empty +or almost full. If the downstream operator or subtask is able to keep up with the influx of data, the +buffers will be empty. If not, then the buffers will be full [<sup>1</sup>]. In fact, checking the buffers’ usage metrics +was the basis of the previously recommended way on how to detect and analyze backpressure described <a href="https://flink.apache.org/2019/07/23/flink-network-stack-2.html#backpressure">a couple +of years back by Nico Kruber</a>. +As I mentioned in the beginning, Flink now offers much better tools to do the same job, but before we get to that, +there are two questions worth asking.</p> + +<h3 id="why-should-i-care-about-backpressure">Why should I care about backpressure?</h3> + +<p>Backpressure is an indicator that your machines or operators are overloaded. The buildup of backpressure +directly affects the end-to-end latency of the system, as records are waiting longer in the queues before +being processed. Secondly, aligned checkpointing takes longer with backpressure, while unaligned checkpoints +will be larger (you can read more about aligned and unaligned checkpoints <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/concepts/stateful-stream-processing/#checkpointing">in the documentation</a>. +If you are struggling with checkpoint barriers propagation times, taking care of backpressure would most +likely help to solve the problem. Lastly, you might just want to optimize your job in order to reduce +the costs of running the job.</p> + +<p>In order to address the problem for all cases, one needs to be aware of it, then locate and analyze it.</p> + +<h3 id="why-shouldnt-i-care-about-backpressure">Why shouldn’t I care about backpressure?</h3> + +<p>Frankly, you do not always have to care about the presence of backpressure. Almost by definition, lack +of backpressure means that your cluster is at least ever so slightly underutilized and over-provisioned. +If you want to minimize idling resources, you probably can not avoid incurring some backpressure. This +is especially true for batch processing.</p> + +<h2 id="how-to-detect-and-track-down-the-source-of-backpressure">How to detect and track down the source of backpressure?</h2> + +<p>One way to detect backpressure is to use <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/ops/metrics/#system-metrics">metrics</a>, +however, in Flink 1.13 it’s no longer necessary to dig so deep. In most cases, it should be enough to just +look at the job graph in the Web UI.</p> + +<div class="row front-graphic"> + <img src="/img/blog/2021-07-07-backpressure/simple-example.png" /> +</div> + +<p>The first thing to note in the example above is that different tasks have different colors. Those colors +represent a combination of two factors: under how much backpressure this task is and how busy it is. Idling +tasks will be blue, fully busy tasks will be red hot, and fully backpressured tasks will be black. Anything +in between will be a combination/shade of those three colors. With this knowledge, one can easily spot the +backpressured tasks (black). The busiest (red) task downstream of the backpressured tasks will most likely +be the source of the backpressure (the bottleneck).</p> + +<p>If you click on one particular task and go into the “BackPressure” tab you will be able to further dissect +the problem and check what is the busy/backpressured/idle status of every subtask in that task. For example, +this is especially handy if there is a data skew and not all subtasks are equally utilized.</p> + +<div class="row front-graphic"> + <img src="/img/blog/2021-07-07-backpressure/subtasks.png" alt="Backpressure among subtasks" /> + <p class="align-center">Backpressure among subtasks</p> +</div> + +<p>In the above example, we can clearly see which subtasks are idling, which are backpressured, and that +none of them are busy. And frankly, in a nutshell, that should be enough to quickly understand what is +happening with your Job :) However, there are a couple of more details worth explaining.</p> + +<h3 id="what-are-those-numbers">What are those numbers?</h3> + +<p>If you are curious how it works underneath, we can go a little deeper. At the base of this new mechanism +we have three <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/ops/metrics/#io">new metrics</a> +that are exposed and calculated by each subtask: +- <code>idleTimeMsPerSecond</code> +- <code>busyTimeMsPerSecond</code> +- <code>backPressuredTimeMsPerSecond</code> +Each of them measures the average time in milliseconds per second that the subtask spent being idle, +busy, or backpressured respectively. Apart from some rounding errors they should complement each other and +add up to 1000ms/s. In essence, they are quite similar to, for example, CPU usage metrics.</p> + +<p>Another important detail is that they are being averaged over a short period of time (a couple of seconds) +and they take into account everything that is happening inside the subtask’s thread: operators, functions, +timers, checkpointing, records serialization/deserialization, network stack, and other Flink internal +overheads. A <code>WindowOperator</code> that is busy firing timers and producing results will be reported as busy or backpressured. +A function doing some expensive computation in <code>CheckpointedFunction#snapshotState</code> call, for instance flushing +internal buffers, will also be reported as busy.</p> + +<p>One limitation, however, is that <code>busyTimeMsPerSecond</code> and <code>idleTimeMsPerSecond</code> metrics are oblivious +to anything that is happening in separate threads, outside of the main subtask’s execution loop. +Fortunately, this is only relevant for two cases: +- Custom threads that you manually spawn in your operators (a discouraged practice). +- Old-style sources that implement the deprecated <code>SourceFunction</code> interface. Such sources will report <code>NaN</code>/<code>N/A</code> +as the value for busyTimeMsPerSecond. For more information on the topic of Data Sources please +<a href="https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/dev/datastream/sources/">take a look here</a>.</p> + +<div class="row front-graphic"> + <img src="/img/blog/2021-07-07-backpressure/source-task-busy.png" alt="Old-style sources do not report busy time" /> + <p class="align-center">Old-style sources do not report busy time</p> +</div> + +<p>In order to present those raw numbers in the web UI, those metrics need to be aggregated from all subtasks +(on the job graph we are showing only tasks). This is why the web UI presents the maximal value from all +subtasks of a given task and why the aggregated maximal values of busy and backpressured may not add up to 100%. +One subtask can be backpressured at 60%, while another can be busy at 60%. This can result in a task that +is both backpressured and busy at 60%.</p> + +<h3 id="varying-load">Varying load</h3> + +<p>There is one more thing. Do you remember that those metrics are measured and averaged over a couple of seconds? +Keep this in mind when analyzing jobs or tasks with varying load, such as (sub)tasks containing a <code>WindowOperator</code> +that is firing periodically. Both the subtask with a constant load of 50% and the subtask that alternates every +second between being fully busy and fully idle will be reporting the same value of <code>busyTimeMsPerSecond</code> +of 500ms/s.</p> + +<p>Furthermore, varying load and especially firing windows can move the bottleneck to a different place in +the job graph:</p> + +<div class="row front-graphic"> + <img src="/img/blog/2021-07-07-backpressure/bottleneck-zoom.png" alt="Bottleneck alternating between two tasks" /> + <p class="align-center">Bottleneck alternating between two tasks</p> +</div> + +<div class="row front-graphic"> + <img src="/img/blog/2021-07-07-backpressure/sliding-window.png" alt="SlidingWindowOperator" /> + <p class="align-center">SlidingWindowOperator</p> +</div> + +<p>In this particular example, <code>SlidingWindowOperator</code> was the bottleneck as long as it was accumulating records. +However, as soon as it starts to fire its windows (once every 10 seconds), the downstream task +<code>SlidingWindowCheckMapper -> Sink: SlidingWindowCheckPrintSink</code> becomes the bottleneck and <code>SlidingWindowOperator</code> +gets backpressured. As those busy/backpressured/idle metrics are averaging time over a couple of seconds, +this subtlety is not immediately visible and has to be read between the lines. On top of that, the web UI +is updating its state only once every 10 seconds, which makes spotting more frequent changes a bit more difficult.</p> + +<h2 id="what-can-i-do-with-backpressure">What can I do with backpressure?</h2> + +<p>In general this is a complex topic that is worthy of a dedicated blog post. It was, to a certain extent, +addressed in <a href="https://flink.apache.org/2019/07/23/flink-network-stack-2.html#:~:text=this%20is%20unnecessary.-,What%20to%20do%20with%20Backpressure%3F,-Assuming%20that%20you">previous blog posts</a>. +In short, there are two high-level ways of dealing with backpressure. Either add more resources (more machines, +faster CPU, more RAM, better network, using SSDs…) or optimize usage of the resources you already have +(optimize the code, tune the configuration, avoid data skew). In either case, you first need to analyze +what is causing backpressure by: +1. Identifying the presence of backpressure. +2. Locating which subtask(s) or machines are causing it. +3. Digging deeper into what part of the code is causing it and which resource is scarce.</p> + +<p>Backpressure monitoring improvements and metrics can help you with the first two points. To tackle the +last one, profiling the code can be the way to go. To help with profiling, also starting from Flink 1.13, +<a href="http://www.brendangregg.com/flamegraphs.html">Flame Graphs</a> are <a href="https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/ops/debugging/flame_graphs/">integrated into Flink’s web UI</a>. +Flame Graphs is a well known profiling tool and visualization technique and I encourage you to give it a try.</p> + +<p>But keep in mind that after locating where the bottleneck is, you can analyze it the same way you would +any other non-distributed application (by checking resource utilization, attaching a profiler, etc). +Usually there is no silver bullet for problems like this. You can try to scale up but sometimes it might +not be easy or practical to do.</p> + +<p>Anyway… The aforementioned improvements to backpressure monitoring allow us to easily detect the source of backpressure, +and Flame Graphs can help us to analyze why a particular subtask is causing problems. Together those two +features should make the previously quite tedious process of debugging and performance analysis of Flink +jobs that much easier! Please upgrade to Flink 1.13.x and try them out!</p> + +<p>[<sup>1</sup>] There is a third possibility. In a rare case when network exchange is actually the bottleneck in your job, +the downstream task will have empty input buffers, while upstream output buffers will be full. <a class="anchor" id="1"></a></p> + + </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-2021 <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> · <a href="/blog/feed.xml">RSS feed</a></p> + </div> + </div> + </div><!-- /.container --> + + <!-- Include all compiled plugins (below), or include individual files as needed --> + <script src="/js/jquery.matchHeight-min.js"></script> + <script src="/js/bootstrap.min.js"></script> + <script src="/js/codetabs.js"></script> + <script src="/js/stickysidebar.js"></script> + + <!-- 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> diff --git a/content/blog/index.html b/content/blog/index.html index 2531f3e..067b4b1 100644 --- a/content/blog/index.html +++ b/content/blog/index.html @@ -206,7 +206,7 @@ <p>07 Jul 2021 Piotr Nowojski (<a href="https://twitter.com/PiotrNowojski">@PiotrNowojski</a>)</p> - <p>Apache Flink 1.13 introduced a couple of important changes in the area of backpressure monitoring and performance analysing of Flink Jobs. This blog post aims to introduce those changes and explain how to use them.</p> + <p>Apache Flink 1.13 introduced a couple of important changes in the area of backpressure monitoring and performance analysis of Flink Jobs. This blog post aims to introduce those changes and explain how to use them.</p> <p><a href="/2021/07/07/backpressure.html">Continue reading »</a></p> </article> diff --git a/content/img/blog/2021-07-07-backpressure/animated.png b/content/img/blog/2021-07-07-backpressure/animated.png new file mode 100644 index 0000000..40ea809 Binary files /dev/null and b/content/img/blog/2021-07-07-backpressure/animated.png differ diff --git a/content/img/blog/2021-07-07-backpressure/bottleneck-zoom.png b/content/img/blog/2021-07-07-backpressure/bottleneck-zoom.png new file mode 100644 index 0000000..b4e5b80 Binary files /dev/null and b/content/img/blog/2021-07-07-backpressure/bottleneck-zoom.png differ diff --git a/content/img/blog/2021-07-07-backpressure/simple-example.png b/content/img/blog/2021-07-07-backpressure/simple-example.png new file mode 100644 index 0000000..fceccb3 Binary files /dev/null and b/content/img/blog/2021-07-07-backpressure/simple-example.png differ diff --git a/content/img/blog/2021-07-07-backpressure/sliding-window.png b/content/img/blog/2021-07-07-backpressure/sliding-window.png new file mode 100644 index 0000000..dcd3240 Binary files /dev/null and b/content/img/blog/2021-07-07-backpressure/sliding-window.png differ diff --git a/content/img/blog/2021-07-07-backpressure/source-task-busy.png b/content/img/blog/2021-07-07-backpressure/source-task-busy.png new file mode 100644 index 0000000..8f72b54 Binary files /dev/null and b/content/img/blog/2021-07-07-backpressure/source-task-busy.png differ diff --git a/content/img/blog/2021-07-07-backpressure/subtasks.png b/content/img/blog/2021-07-07-backpressure/subtasks.png new file mode 100644 index 0000000..bf6ede6 Binary files /dev/null and b/content/img/blog/2021-07-07-backpressure/subtasks.png differ diff --git a/content/index.html b/content/index.html index fbc42c6..1260e15 100644 --- a/content/index.html +++ b/content/index.html @@ -578,7 +578,7 @@ <dl> <dt> <a href="/2021/07/07/backpressure.html">How to identify the source of backpressure?</a></dt> - <dd>Apache Flink 1.13 introduced a couple of important changes in the area of backpressure monitoring and performance analysing of Flink Jobs. This blog post aims to introduce those changes and explain how to use them.</dd> + <dd>Apache Flink 1.13 introduced a couple of important changes in the area of backpressure monitoring and performance analysis of Flink Jobs. This blog post aims to introduce those changes and explain how to use them.</dd> <dt> <a href="/news/2021/05/28/release-1.13.1.html">Apache Flink 1.13.1 Released</a></dt> <dd><p>The Apache Flink community released the first bugfix version of the Apache Flink 1.13 series.</p> diff --git a/content/zh/index.html b/content/zh/index.html index 3296781..b109d1d 100644 --- a/content/zh/index.html +++ b/content/zh/index.html @@ -571,7 +571,7 @@ <dl> <dt> <a href="/2021/07/07/backpressure.html">How to identify the source of backpressure?</a></dt> - <dd>Apache Flink 1.13 introduced a couple of important changes in the area of backpressure monitoring and performance analysing of Flink Jobs. This blog post aims to introduce those changes and explain how to use them.</dd> + <dd>Apache Flink 1.13 introduced a couple of important changes in the area of backpressure monitoring and performance analysis of Flink Jobs. This blog post aims to introduce those changes and explain how to use them.</dd> <dt> <a href="/news/2021/05/28/release-1.13.1.html">Apache Flink 1.13.1 Released</a></dt> <dd><p>The Apache Flink community released the first bugfix version of the Apache Flink 1.13 series.</p>
