Flink非对齐checkpoint踩坑记

使用flink非对齐checkpoint的背景

作业配置如下

jobmanager 配置:2个 1cpu, 8g内存, 10g磁盘

taskmanager配置:250个,每个2slot,8cpu,20g,80g磁盘


在当前flink任务拓扑如下:

所有的流处理最后都汇聚到A算子,导致A算子cpu busy 100%,且持续将不下去,引起上游算子背压严重。导致checkpoint的 barrier不能对其,进而导致checkpoint 超时失败。

  1. 刚开始的处理思路:在不扩容,不增加资源开销的情况下解决问题,于是就想到了使用flink 非对齐checkpoint。踩了很多坑,引起下面一系列问题。
  2. 最后的解决思路:增加当前算子的并行度,扩展到原来的3~5倍,并配置独享槽。在这个过程需要抛弃状态,重置kafka的位点到最早,尽量保证数据的正确性,重启作业。这样配置以后整个作业的健康度就好很多,如下:

flink使用非对齐checkpoint的坑

  1. 虽然是flink1.11引入的,但直到flink1.18以后才成熟,
    在flink1.18之前使用,不能扩展并行度,否则会报错如下:
javajava.lang.IllegalStateException: 复制代码
	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,官网说明

  1. flink1.18之后虽然可以进行并行度扩展,但是in-flihgt中间态的数据会在checkpoint是保存下来,使得整个checkpoint的数据量剧增几倍到几十倍。
    并且,对其checkpoint可以切换到非对齐checkpoint,但非对齐checkpoint不能切换到对其checkpoint。

极端情况下使用flink非对齐checkpoint的场景

只有在上游被压特别严重,扩容解决不了的情况下;并且substask之前的数据传数数据量(inflight)可控,使得checkpoint可控不至于巨大而引起新的问题,例如:如果checkpoint数据量巨大可能上传到远程分布式文件系统时过慢,或者远程文件系统磁盘性能查导致读写盘时间过长,从而导致checkpoint超时,checkpoint失败。

使用非对齐checkpoint是的配置

bash 复制代码
#是否启用非对齐检查点,风险巨大,非极端情况下不建议用,flink1.18之后才成熟
        # 仅当 execution.checkpointing.mode 为 EXACTLY_ONCE 且 execution.checkpointing.max-concurrent-checkpoints 为 1 时,才能启用非对齐检查点。
        execution.checkpointing.unaligned: true
        execution.checkpointing.max-concurrent-checkpoints:1
        execution.checkpointing.mode: EXACTLY_ONCE
相关推荐
学传打活3 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活8 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16816 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心18 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552724 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552724 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝1 个月前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055271 个月前
Java图像处理实战指南
人工智能·1024程序员节
u0103055271 个月前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055271 个月前
Java实用类应用精讲
人工智能·1024程序员节