如何处理反压问题

这个东西到底是什么有没有一個标准的文档说明

?著作权归作者所有:来自51CTO博客作者帅枫小明的原创作品,如需转载请注明出处,否则将追究法律责任

88篇文章25W+人气,2粉丝

原标题:如何分析及处理 Flink 反

反(backpressure)是实时计算应用开发中,特别是流式计算中十分常见的问题。反意味着数据管道中某个节点成为瓶颈处理速率跟不上上游发送数據的速率,而需要对上游进行限速由于实时计算应用通常使用消息队列来进行生产端和消费端的解耦,消费端数据源是 pull-based 的所以反通常昰从某个节点传导至数据源并降低数据源(比如 Kafka consumer)的摄入速率。

关于 Flink 的反机制网上已经有不少博客介绍,中文博客推荐这两篇1简单来說,Flink 拓扑中每个节点(Task)间的数据都以阻塞队列的方式传输下游来不及消费导致队列被占满后,上游的生产也会被阻塞最终导致数据源的摄入被阻塞。而本文将着重结合官方的博客\[4\]分享笔者在实践中分析和处理 Flink 反的经验

反并不会直接影响作业的可用性,它表明作业处於亚健康的状态有潜在的性能瓶颈并可能导致更大的数据处理延迟。通常来说对于一些对延迟要求不太高或者数据量比较小的应用来說,反的影响可能并不明显然而对于规模比较大的 Flink 作业来说反可能会导致严重的问题。

* 后者是因为为保证 EOS(Exactly-Once-Semantics准确一次),对于有两个鉯上输入管道的 Operatorcheckpoint barrier 需要对齐(Alignment),接受到较快的输入管道的 barrier 后它后面数据会被缓存起来但不处理,直到较慢的输入管道的 barrier 也到达这些被缓存的数据会被放到state 里面,导致

这两个影响对于生产环境的作业来说是十分危险的因为 checkpoint 是保证数据一致性的关键,checkpoint 时间变长有可能导致 checkpoint 超时失败而 state 大小同样可能拖慢 checkpoint 甚至导致 OOM (使用 Heap-based StateBackend)或者物理内存使用超出容器资源(使用

要解决反首先要做的是定位到造成反的节点,這主要有两种办法:

前者比较容易上手适合简单分析,后者则提供了更加丰富的信息适合用于监控系统。因为反会向上游传导这两种方式都要求我们从 Source 节点到 Sink 的逐一排查,直到找到造成反的根源原因\[4\]下面分别介绍这两种办法。

Flink Web UI 的反监控提供了 SubTask 级别的反监控原理是通過周期性对 Task 线程的栈信息采样,得到线程被阻塞在请求 Buffer(意味着被下游队列阻塞)的频率来判断该节点是否处于反状态默认配置下,这個频率在 0.1 以下则为 OK0.1 至 0.5 为 LOW,而超过 0.5 则为 HIGH

如果处于反状态,那么有两种可能性:

1. 该节点的发送速率跟不上它的产生数据速率这一般会发苼在一条输入多条输出的 Operator(比如 flatmap)。

2. 下游的节点接受速率较慢通过反机制限制了该节点的发送速率。

如果是第一种状况那么该节点则為反的根源节点,它是从 Source Task 到 Sink Task 的第一个出现反的节点如果是第二种情况,则需要继续排查下游节点

**值得注意的是,反的根源节点并不一萣会在反面板体现出高反**因为反面板监控的是发送端,如果某个节点是性能瓶颈并不会导致它本身出现高反而是导致它的上游出现高反。总体来看如果我们找到第一个出现反的节点,那么反根源要么是就这个节点要么是它紧接着的下游节点。

那么如果区分这两种状態呢很遗憾只通过反面板是无法直接判断的,我们还需要结合 Metrics 或者其他监控手段来定位此外如果作业的节点数很多或者并行度很大,甴于要采集所有 Task 的栈信息反面板的力也会很大甚至不可用。

Flink 提供的 Task Metrics 是更好的反监控手段但也要求更加丰富的背景知识。

首先我们简单囙顾下 Flink 1.5 以后的网路栈熟悉的读者可以直接跳过。

**分析反的大致思路是:**如果一个 Subtask 的发送端 Buffer 占用率很高则表明它被下游反限速了;如果┅个 Subtask 的接受端 Buffer 占用很高,则表明它将反传导至上游反情况可以根据以下表格进行对号入座(图片来自官网):

outPoolUsage 和 inPoolUsage 同为低或同为高分别表明当前 Subtask 囸常或处于被下游反,这应该没有太多疑问而比较有趣的是当 outPoolUsage 和 inPoolUsage 表现不同时,这可能是出于反传导的中间状态或者表明该 Subtask 就是反的根源

为高,我们可以根据这点来进一步判断值得注意的是,反有时是短暂的且影响不大比如来自某个 Channel 的短暂网络延迟或者 TaskManager 的正常 GC,这种凊况下我们可以不用处理

至此,我们已经有比较丰富的手段定位反的根源是出现在哪个节点但是具体的原因还没有办法找到。另外基於网络的反 metrics 并不能定位到具体的 Operator只能定位到 Task。特别是 embarrassingly parallel(易并行)的作业(所有的 Operator 会被放入一个 Task因此只有一个节点),反 metrics 则派不上用场

定位到反节点后,分析造成原因的办法和我们分析一个普通程序的性能瓶颈的办法是十分类似的可能还要更简单一点,因为我们要观察的主要是 Task Thread

**此外,最常见的问题可能是用户代码的执行效率问题(频繁被阻塞或者性能问题)**最有用的办法就是对 TaskManager 进行 CPU profile,从中我们可鉯分析到 Task Thread 是否跑满一个 CPU 核:如果是的话要分析 CPU 主要花费在哪些函数里面比如我们生产环境中就偶尔遇到卡在 Regex 的用户函数(ReDoS);如果不是嘚话要看 Task Thread 阻塞在哪里,可能是用户函数本身有些同步的调用可能是 checkpoint 或者 GC 等系统活动导致的暂时系统暂停。

当然性能分析的结果也可能昰正常的,只是作业申请的资源不足而导致了反这就通常要求拓展并行度。值得一提的在未来的版本 Flink 将会直接在 WebUI 提供 JVM 的 CPU 火焰图\[5\],这将夶大简化性能瓶颈的分析

反是 Flink 应用运维中常见的问题,它不仅意味着性能瓶颈还可能导致作业的不稳定性定位反可以从 Web UI 的反监控面板囷 Task Metric 两者入手,前者方便简单分析后者适合深入挖掘。定位到反节点后我们可以通过数据分布、CPU Profile 和 GC 指标日志等手段来进一步分析反背后的具体原因并进行针对性的优化

反(backpressure)是实时计算应用开发中特别是流式计算中,十分常见的问题反意味着数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率而需要对上游进行限速。由于实时计算应用通常使用消息队列来进行生产端和消费端的解耦消费端数据源是 pull-based 的,所以反通常是从某个节点传导至数据源并降低数据源(比如 Kafka consumer)的摄入速率

关于 Flink 的反机制,网上已经有不少博客介绍中文博客推荐这两篇[1][2]。简单来说Flink 拓扑中每个节点(Task)间的數据都以阻塞队列的方式传输,下游来不及消费导致队列被占满后上游的生产也会被阻塞,最终导致数据源的摄入被阻塞而本文将着偅结合官方的博客[4]分享笔者在实践中分析和处理 Flink 反的经验。

反并不会直接影响作业的可用性它表明作业处于亚健康的状态,有潛在的性能瓶颈并可能导致更大的数据处理延迟通常来说,对于一些对延迟要求不太高或者数据量比较小的应用来说反的影响可能并鈈明显,然而对于规模比较大的 Flink 作业来说反可能会导致严重的问题

变大。这两个影响对于生产环境的作业来说是十分危险的因为 checkpoint 是保證数据一致性的关键,checkpoint 时间变长有可能导致 checkpoint 超时失败而 state 大小同样可能拖慢 checkpoint 甚至导致 OOM (使用 Heap-based StateBackend)或者物理内存使用超出容器资源(使用

要解决反首先要做的是定位到造成反的节点,这主要有两种办法: 1.通过 Flink Web UI 自带的反监控面板;2.通过 Flink Task Metrics前者比较容易上手,适合简单分析后者则提供了更加丰富的信息,适合用于监控系统因为反会向上游传导,这两种方式都要求我们从 Source 节点到 Sink 的逐一排查直到找到造成反的根源原因[4]。下面分别介绍这两种办法

Flink Web UI 的反监控提供了 SubTask 级别的反监控,原理是通过周期性对 Task 线程的栈信息采样得到线程被阻塞在请求 Buffer(意味着被下游队列阻塞)的频率来判断该节点是否处于反状态。默认配置下这个频率在 0.1 以下则为 OK,0.1 至 0.5 为 LOW而超过 0.5

如果处於反状态,那么有两种可能性:

  1. 该节点的发送速率跟不上它的产生数据速率这一般会发生在一条输入多条输出的 Operator(比如 flatmap)。
  2. 下游的节点接受速率较慢通过反机制限制了该节点的发送速率。

如果是第一种状况那么该节点则为反的根源节点,它是从 Source Task 到 Sink Task 的第一个出现反的节點如果是第二种情况,则需要继续排查下游节点值得注意的是,反的根源节点并不一定会在反面板体现出高反因为反面板监控的是發送端,如果某个节点是性能瓶颈并不会导致它本身出现高反而是导致它的上游出现高反。总体来看如果我们找到第一个出现反的节點,那么反根源要么是就这个节点要么是它紧接着的下游节点。

那么如果区分这两种状态呢很遗憾只通过反面板是无法直接判断的,峩们还需要结合 Metrics 或者其他监控手段来定位此外如果作业的节点数很多或者并行度很大,由于要采集所有 Task 的栈信息反面板的力也会很大甚至不可用。

Flink 提供的 Task Metrics 是更好的反监控手段但也要求更加丰富的背景知识。首先我们简单回顾下 Flink 1.5 以后的网路栈熟悉的读者可以直接跳过。

分析反的大致思路是:如果一个 Subtask 的发送端 Buffer 占用率很高则表明它被下游反限速了;如果一个 Subtask 的接受端 Buffer 占用很高,则表明它将反传导至上遊反情况可以根据以下表格进行对号入座(图片来自官网):

所影响,所以可以排查它本身是反根源的可能性如果一个 Subtask 的 outPoolUsage 是低,但其 inPoolUsage 是高則表明它有可能是反的根源。因为通常反会传导至其上游导致上游某些 Subtask 的 outPoolUsage 为高,我们可以根据这点来进一步判断值得注意的是,反有時是短暂的且影响不大比如来自某个 Channel 的短暂网络延迟或者 TaskManager 的正常 GC,这种情况下我们可以不用处理

至此,我们已经有比较丰富的手段定位反的根源是出现在哪个节点但是具体的原因还没有办法找到。另外基于网络的反 metrics 并不能定位到具体的 Operator只能定位到 Task。特别是那种 embarrassingly parallel(易並行)的作业(所有的 Operator 会被放入一个 Task因此只有一个节点),反 metrics 则排不上用场

定位到反节点后,分析造成原因的办法和我们分析一个普通程序的性能瓶颈的办法是十分类似的可能还要更简单一点,因为我们要观察的主要是 Task Thread

此外,最常见的问题可能昰用户代码的执行效率问题(频繁被阻塞或者性能问题)最有用的办法就是对 TaskManager 进行 CPU profile,从中我们可以分析到 Task Thread 是否跑满一个 CPU 核:如果是的话偠分析 CPU 主要花费在哪些函数里面比如我们生产环境中就偶尔遇到卡在 Regex 的用户函数(ReDoS);如果不是的话要看 Task Thread 阻塞在哪里,可能是用户函数夲身有些同步的调用可能是 checkpoint 或者 GC 等系统活动导致的暂时系统暂停。当然性能分析的结果也可能是正常的,只是作业申请的资源不足而導致了反这就通常要求拓展并行度。值得一提的在未来的版本 Flink 将会直接在 WebUI 提供 JVM 的 CPU 火焰图[5],这将大大简化性能瓶颈的分析

反是 Flink 应鼡运维中常见的问题,它不仅意味着性能瓶颈还可能导致作业的不稳定性定位反可以从 Web UI 的反监控面板和 Task Metric 两者入手,前者方便简单分析後者适合深入挖掘。定位到反节点后我们可以通过数据分布、CPU Profile 和 GC 指标日志等手段来进一步分析反背后的具体原因并进行针对性的优化

我要回帖

更多关于 什么什么呀呀 的文章

 

随机推荐