1 Flink的背压(Backpressure)是指当下游算子处理数据的速度不及上游算子传递数据的速度时,会导致数据始终堆积在网络层或内存中,会导致系统效率下降,出现背压现象。
背压的危害:
- 系统性能下降:数据阻塞,导致系统吞吐量降低和延迟增大。
- 内存压力增大:大量未处理的数据会占用计算节点的内存,可能导致内存溢出。
- 系统稳定性下降:严重的背压可能导致任务执行过程中节点由于内存溢出等问题导致崩溃,影响任务的正常运行。
解决方法:
- 增加下游算子的并行度,可以投入更多的资源去处理数据,提高数据处理速度。
- 对数据进行预处理、过滤不必要的数据,减少数据处理的压力。
- 可通过配置backpressure.interval、backpressure.num-samples、backpressure.request-backoff等参数优化对背压的处理策略。
- 调整Flink的配置,例如调整缓冲数据的时间,开启反压机制等。
2 Flink通过一套精确的一次性(Exactly-Once)的计算状态管理维持端到端数据的一致性,其关键技术如下:
在source阶段,source源要有数据数据精确处理一次性的机制 , 比如kafka可以,网络流本身不可以 !
检查点(Checkpoint)机制:通过在流式数据处理中的不同位置设定检查点,能够记录系统的状态,当有故障产生时,系统可以从最近的检查点恢复,保证了一致性。
事务写入机制:与外部系统进行交互时,Flink提供了二阶段提交协议(Two-Phase Commit)来保证数据的一致性。在输出结果到外部系统时,首先进行预提交,然后在提交成功之后再进行确认。
精确一次处理语义:Flink可以保证在故障情况下,每条数据仅仅被处理一次,从而保证数据的一致性。
链路的乱序解决:Flink可以通过Watermark机制处理乱序数据,保证事件时间的一致性。
重放机制:Flink的事件源(Source)需要提供重放数据的能力,这样在故障恢复时,可以重新处理原始数据。