2026/1/10 1:15:21
网站建设
项目流程
网站建设上市公司,自己网站上做支付宝怎么收费的,万网域名注册官网,怎么查网站备案进度今天来聊在 Flink 运维过程中比较常见的一个问题#xff1a;反压。
什么是反压
反压是流式系统中关于数据处理能力的动态反馈机制#xff0c;并且是从下游到上游的反馈#xff0c;一般发生在上游节点的生产速度大于下游节点的消费速度的情况。
数据如何传输
在了解反压的细节…今天来聊在 Flink 运维过程中比较常见的一个问题反压。什么是反压反压是流式系统中关于数据处理能力的动态反馈机制并且是从下游到上游的反馈一般发生在上游节点的生产速度大于下游节点的消费速度的情况。数据如何传输在了解反压的细节之前首先要知道 Flink 中数据是如何传输的。在 Flink 中两个算子之间的关系分为三种部署在同一个 TaskManager 上且属于同一算子链。部署在同一个 TaskManager 上但不是同一个算子链。部署在不同的 TaskManager 上。三种不同的关系对应的算子间的数据传输方式也不同。先说第一种。同一线程数据传输同一线程中的两个算子共享内存因此数据传输非常简单上游产出好数据后直接调用下游的 processElement 方法即可。本地线程数据传输对于第二种关系两个算子不在同一线程但是部署在同一个 TaskManager 上也就是算子之间的数据传输是跨线程的。我们通过一个图来解释。图中Flat Map Task 是上游算子sum 是下游的算子。它们共享一块 Buffer 内存。当 Buffer 中没有数据可以消费时sum 所在的线程会阻塞步骤1。随着数据的流入Flat Map Task 会将处理好的数据写入到 ResultSubpartition步骤2然后 flush 到 Buffer 中步骤3。此时会唤醒 sum 所在的线程步骤4它就可以从 Buffer 中读取数据了步骤5。远程数据传输第三种跨 TaskManager 的数据传输与第二种类似不过也有些区别。我们还是通过一张图来解释。从图中可以看到当 sum 所在线程没有 Buffer 可以消费时会通过 PartitionRequestClient 向 Flat Map Task 所在的进程发送请求。Flat Map Task 所在进程接收到请求后会读取 Buffer 中的数据并返回。Flink 的反压了解了 Flink 的数据传输方式之后我们再来看下 Flink 是如何感知反压的。上图是一个数据传输的简图。当 Task1 有 Buffer 空间时记录 A 被序列化并写入 LocalBufferPool 中接着发送到 Task2 的 LocalBufferPool 中Task2 读取并反序列化后交由程序处理。这里我们也分两个场景讨论。本地传输Task1 和 Task2 在同一个 TaskManager 节点Task1 和 Task2 共用 Buffer一旦 Task2 消费了 Buffer该 Buffer 就会被回收。如果 Task2 的处理速度比 Task1 慢那么 Buffer 的回收速度就赶不上 Task1 取 Buffer 的速度这样会导致无 Buffer 可用最终 Task1 就会降速。远程传输Task1 和 Task2 运行在不同的 TaskManager 上那 Buffer 会发送到网络后等接收端消费完再回收。在发送端会通过 Netty 水位机制来保证不往网络中写太多数据如果网络中的数据超过了高水位值就会等其下降到低水位值以下才会继续写数据。如果网络有堆积发送端就会暂停发送Buffer 也不会被回收这就会阻塞 writer 往 ResultSubPartition 中写数据。反压监控在 Flink Web UI 中可以找到反压的监控它有三种状态OK: 0% 反压比例 10%此时一般不用处理。LOW: 10% 反压比例 50%这种状态需要关注。HIGH: 50% 反压比例 100%已经反压需要赶快处理。总结今天我们聊了什么是反压以及 Flink 中数据传输方法和 Flink 任务是如何感知反压的。Flink 的传输方式分为三种分别是同线程传输、本地跨线程传输以及远程传输。Flink 任务在感知反压时也分别针对本地传输和远程传输做了讨论。