Flink 数据传输及反压详解

本文深入解析Flink中的反压机制,包括基于TCP的反压传播及Credit-based反压机制,探讨Flink如何通过网络流控在上下游速度不匹配时防止下游过载。同时,分析Flink在网络传输中如何平衡吞吐量和延迟,以及如何监控反压状态。

 

 

 

IntermediateDataset

IntermediateDataset 是在 JobGraph 中对中间结果的抽象。我们知道,JobGraph 是对 StreamGraph 进一步进行优化后得到的逻辑图,它尽量把可以 chain 到一起 operator 合并为一个 JobVertex,而 IntermediateDataset 就表示一个 JobVertex 的输出结果。JobVertex 的输入是 JobEdge,而 JobEdge 可以看作是 IntermediateDataset 的消费者。一个 JobVertex 也可能产生多个 IntermediateDataset。需要说明的一点是,目前一个 IntermediateDataset 实际上只会有一个 JobEdge 作为消费者,也就是说,一个 JobVertex 的下游有多少 JobVertex 需要依赖当前节点的数据,那么当前节点就有对应数量的 IntermediateDataset

19-幻灯片26-1568x882.png

 

这时候还没有向集群去提交任务,在 Client 端会将 StreamGraph 生成 JobGraph,JobGraph 就是做为向集群提交的最基本的单元。在生成 JobGrap 的时候会做一些优化,将一些没有 Shuffle 机制的节点进行合并。有了 JobGraph 后就会向集群进行提交,进入运行阶段。

Jobvertex->Intermedia Dateset->JobEage

20-幻灯片27-1-1568x882.png

 

然后我们概念化这样一张物理执行图,可以看到每个 Task 在接收数据时都会通过这样一个InputGate 可以认为是负责接收数据的,再往前有这样一个 ResultPartition 负责发送数据,在 ResultPartition 又会去做分区跟下游的 Task 保持一致,就形成了 ResultSubPartition 和 InputChannel 的对应关系。这就是从逻辑层上来看的网络传输的通道,基于这么一个概念我们可以将反压的问题进行拆解。
ExecutionGraph -> Intermedia ATA
task ->ResultPartion->InputGate
ResultSubParition-->InputChannel 一一对应

问题拆解:反压传播两个阶段

image.png

假设最下游的 Task (Sink)出现了问题,处理速度降了下来这时候是如何将这个压力反向传播回去呢?这时候就分为两种情况:

跨 TaskManager ,反压如何从 InputGate 传播到 ResultPartition

TaskManager 内,反压如何从 ResultPartition 传播到 InputGate

TaskManager 只有一个 Network BufferPool 被所有的 Task 共享,初始化时会从 Off-heap Memory 中申请内存,申请后内存管理通过 Network BufferPool 来进行,不需要依赖 JVM GC 的机制去释放。有了 Network BufferPool 之后可以为每一个 ResultSubPartition 创建 Local BufferPool

反压过程:

  1. 首先InputChannel 的 Buffer 被用尽于
  2. 会向 Local BufferPool 申请新的 Buffer
  3. 如果 Local BufferPool没有可用的,或是 Local BufferPool 的最大可用 Buffer 到了上限 无法向 Network BufferPool 申请,没有办法去读取新的数据
  4. 这时 Netty AutoRead
### Flink 中背机制详解 在流处理框架中,Flink 的背(BackPressure)和机制是一个复杂但重要的概念。它直接影响到数据流的吞吐量、延迟以及系统的稳定性。 #### 背的基本概念 背是指在分布式流处理系统中,当某个任务或节点无法以足够快的速度处理接收到的数据时,会向上游传播力信号,从而限制上游任务发送数据的速度[^1]。这种机制可以避免数据积导致内存溢出等问题,确保整个数据流管道的稳定运行。 是背的一种具体实现方式,通常用于描述下游节点对上游节点的馈机制。例如,在 Flink 中,如果某个算子(Operator)处理速度较慢,则会通过机制通知其上游算子降低数据发送速率[^4]。 #### 背的成因 Flink 的背问题可能由多种因素引起,包括但不限于以下几点: - **硬件资源限制**:如 CPU、内存或磁盘 I/O 不足。 - **任务逻辑复杂性**:某些算子执行复杂计算或阻塞操作,导致处理能力下降。 - **数据分布不均**:数据倾斜(Data Skew)会导致部分任务负载过高。 - **外部系统瓶颈**:如 Sink 端连接的外部存储系统(如 Kafka、Elasticsearch)性能不足[^2]。 #### 背的检测 Flink 提供了内置的监控工具来帮助用户检测背情况。通过 Flink Web UI 或者 Prometheus 等监控系统,可以查看每个任务的背状态。需要注意的是,面板显示的是发送端的状态,因此性能瓶颈节点本身可能不会直接表现出高,而是其上游节点会受到影响。 #### 背的处理方法 解决 Flink 的背问题需要从多个角度入手: 1. **优化硬件资源** 增加集群的计算资源(如 CPU、内存),或者调整并行度(Parallelism)以提高任务的并发处理能力。 2. **简化任务逻辑** 优化算子的实现逻辑,减少不必要的计算开销。例如,避免在算子中使用阻塞操作或耗时较长的外部调用。 3. **均衡数据分布** 针对数据倾斜问题,可以通过重新设计数据分区策略(如自定义 Key Selector)来平衡各任务的负载。 4. **提升外部系统性能** 如果 Sink 端的外部存储成为瓶颈,可以考虑优化其配置或升级版本。例如,对于 Kafka,可以通过增加分区数或调整消费者组配置来提高吞吐量;而对于 Elasticsearch,可以引入批量写入或静态限速机制[^3]。 5. **合理配置 Flink 参数** 调整 Flink 的缓冲区大小、网络 Shuffle 策略等参数,以适应不同的工作负载需求。 #### 动态与静态限速的关系 动态是一种自动化的馈机制,能够实时调整数据流的传输速率。然而,它并非万能解决方案。在某些场景下,例如目标存储系统无法有效传播信号(如 Elasticsearch),静态限速则显得尤为重要。静态限速可以通过预设规则限制数据流入速率,从而保护下游系统免受过载影响。 ```python # 示例:Flink 中通过设置并行度优化任务性能 env = StreamExecutionEnvironment.get_execution_environment() env.set_parallelism(4) # 设置全局并行度为 4 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值