在线做app的网站,上海自助建站,网站微信认证费用,嵩明网站建设Flink 网络流控及反压的介绍#xff1a;
Apache Flink学习网
反压的理解 简单来说#xff0c; Flink 拓扑中每个节点#xff08;Task#xff09;间的数据都以阻塞队列的方式传输#xff0c;下游来不及消费导致队列被占满后#xff0c;上游的生产也会被阻塞#xff0c;…Flink 网络流控及反压的介绍
Apache Flink学习网
反压的理解 简单来说 Flink 拓扑中每个节点Task间的数据都以阻塞队列的方式传输下游来不及消费导致队列被占满后上游的生产也会被阻塞最终导致数据源的摄入被阻塞。反压BackPressure 通常产生于这样的场景短时间的负载高峰导致系统接收数据的速率远高于它处理数据的速率。许多日常问题都会导致反压例如垃圾回收停顿可能会导致流入的数据快速堆积或遇到大促、秒杀活动导致流量陡增。
反压的危害 反压如果不能得到正确的处理 可能会影响到 checkpoint 时长和 state 大小甚至可能会导致资源耗尽甚至系统崩溃。 1影响 checkpoint 时长 barrier 不会越过普通数据数据处理被阻塞也会导致checkpoint barrier 流经整个数据管道的时长变长 导致 checkpoint 总体时间End to End Duration变长。 2影响 state 大小 barrier 对齐时接受到较快的输入管道的 barrier 后它后面数据会被缓存起来但不处理直到较慢的输入管道的 barrier 也到达这些被缓存的数据会被放到 state 里面导致 checkpoint 变大。 这两个影响对于生产环境的作业来说是十分危险的因为 checkpoint 是保证数据一致性的关键 checkpoint 时间变长有可能导致 checkpoint 超时失败而 state 大小同样可能拖慢 checkpoint 甚至导致 OOM 使用 Heap-based StateBackend或者物理内存使用超出容器资源使用 RocksDBStateBackend的稳定性问题。 因此我们在生产中要尽量避免出现反压的情况。
利用 Flink Web UI 定位 Flink Web UI 的反压监控提供了 SubTask 级别的反压监控 1.13 版本以前是通过周期性对 Task 线程的栈信息采样得到线程被阻塞在请求 Buffer 意味着被下游队列阻塞的频率来判断该节点是否处于反压状态。默认配置下这个频率在 0.1 以下则为 OK 0.1至 0.5 为 LOW而超过 0.5 则为 HIGH。 Flink 1.13 优化了反压检测的逻辑使用基于任务 Mailbox 计时而不在再于堆栈采样并且重新实现了作业图的 UI 展示 Flink 现在在 UI 上通过颜色和数值来展示繁忙和反压的程度。 分析瓶颈算子 如果处于反压状态那么有两种可能性 1 该节点的发送速率跟不上它的产生数据速率。这一般会发生在一条输入多条输出的 Operator比如 flatmap。 这种情况该节点是反压的根源节点它是从 Source Task到 Sink Task 的第一个出现反压的节点。 2 下游的节点接受速率较慢通过反压机制限制了该节点的发送速率。 这种情况需要继续排查下游节点一直找到第一个为 OK 的一般就是根源节点。总体来看如果我们找到第一个出现反压的节点反压根源要么是就这个节点要么是它紧接着的下游节点。 通常来讲第二种情况更常见。 如果无法确定还需要结合 Metrics 进一步判断。
利用 Metrics 定位 监控反压时会用到的 Metrics 主要和 Channel 接受端的 Buffer 使用率有关最为有用的是以下几个 Metrics: 其中 inPoolUsage floatingBuffersUsage exclusiveBuffersUsage。
1根据指标分析反压 分析反压的大致思路是如果一个 Subtask 的发送端 Buffer 占用率很高则表明它 被下游反压限速了如果一个 Subtask 的接受端 Buffer 占用很高则表明它将反压传导 至上游。反压情况可以根据以下表格进行对号入座(1.9 以上): 2 可以进一步分析数据传输 Flink 1.9及以上版本还可以根据 floatingBuffersUsage/exclusiveBuffersUsage 以及其上游 Task 的 outPoolUsage 来进行进一步的分析一个 Subtask 和其上游Subtask 的数据传输。 在流量较大时 Channel 的 Exclusive Buffer 可能会被写满此时 Flink 会向 Buffer Pool 申请剩余的 Floating Buffer。这些 Floating Buffer 属于备用 Buffer。 总结 1 floatingBuffersUsage 为高 则表明反压正在传导至上游 2 同时 exclusiveBuffersUsage 为低 则表明可能有倾斜 比如 floatingBuffersUsage 高、 exclusiveBuffersUsage 低为有倾斜因为少数channel 占用了大部分的 Floating Buffer。