Flink非对齐checkpoint踩坑记
使用flink非对齐checkpoint的背景
作业配置如下
jobmanager 配置:2个 1cpu, 8g内存, 10g磁盘
taskmanager配置:250个,每个2slot,8cpu,20g,80g磁盘



在当前flink任务拓扑如下:

所有的流处理最后都汇聚到A算子,导致A算子cpu busy 100%,且持续将不下去,引起上游算子背压严重。导致checkpoint的 barrier不能对其,进而导致checkpoint 超时失败。
- 刚开始的处理思路:在不扩容,不增加资源开销的情况下解决问题,于是就想到了使用flink 非对齐checkpoint。踩了很多坑,引起下面一系列问题。
- 最后的解决思路:增加当前算子的并行度,扩展到原来的3~5倍,并配置独享槽。在这个过程需要抛弃状态,重置kafka的位点到最早,尽量保证数据的正确性,重启作业。这样配置以后整个作业的健康度就好很多,如下:

flink使用非对齐checkpoint的坑
- 虽然是flink1.11引入的,但直到flink1.18以后才成熟,
在flink1.18之前使用,不能扩展并行度,否则会报错如下:
at org.apache.flink.streaming.runtime.io.recovery.DemultiplexingRecordDeserializer.select(DemultiplexingRecordDeserializer.java:121)at org.apache.flink.streaming.runtime.io.recovery.RescalingStreamTaskNetworkInput.processEvent(RescalingStreamTaskNetworkInput.java:181)at org.apache.flink.streaming.runtime.io.AbstractStreamTaskNetworkInput.emitNext(AbstractStreamTaskNetworkInput.java:128)at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:65)at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:498)at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:203)at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:809)at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:761)at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:1066)at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:1045)at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:858)at org.apache.flink.runtime.taskmanager.Task.run(Task.java:644)at java.lang.Thread.run(Thread.java:748)
这是flink在1.18之前的bug,官网说明
- flink1.18之后虽然可以进行并行度扩展,但是in-flihgt中间态的数据会在checkpoint是保存下来,使得整个checkpoint的数据量剧增几倍到几十倍。
并且,对其checkpoint可以切换到非对齐checkpoint,但非对齐checkpoint不能切换到对其checkpoint。
极端情况下使用flink非对齐checkpoint的场景
只有在上游被压特别严重,扩容解决不了的情况下;并且substask之前的数据传数数据量(inflight)可控,使得checkpoint可控不至于巨大而引起新的问题,例如:如果checkpoint数据量巨大可能上传到远程分布式文件系统时过慢,或者远程文件系统磁盘性能查导致读写盘时间过长,从而导致checkpoint超时,checkpoint失败。
使用非对齐checkpoint是的配置
#是否启用非对齐检查点,风险巨大,非极端情况下不建议用,flink1.18之后才成熟# 仅当 execution.checkpointing.mode 为 EXACTLY_ONCE 且 execution.checkpointing.max-concurrent-checkpoints 为 1 时,才能启用非对齐检查点。execution.checkpointing.unaligned: trueexecution.checkpointing.max-concurrent-checkpoints:1execution.checkpointing.mode: EXACTLY_ONCE
