关于flink重新提交任务,重复消费kafka的坑

kafka分区与Flink并行度设置 如果Flink的并行度小于Kafka分区数,可能会出现一个Flink并行实例处理多个Kafka分区的情况,这可能导致数据消费不均衡。综上所述,为了确保数据的高效和正确处理,建议将Flink的并行度设置为与Kafka分区数相同,这样可以保证每个Flink子任务都能处理一个Kafka分区,实现最佳的负载均衡和数据处理效率。:如果Kafka分区数大于Flink的并行度,并且存在任务重新调度等因素,可能会出现某些Kafka分区被多个Flink子任务消费的情况,导致重复消费的风险。 阅读详情
AI摘要

本文解决Flink任务重启过程中遇到的问题,如重复消费Kafka数据、checkpoint与savepoint的区别及使用方法,确保状态数据稳定。

异常现象1

按照以下方式设置backend目录和checkpoint目录,fsbackend目录有数据,checkpoint目录没数据

env.getCheckpointConfig().setCheckpointStorage(PropUtils.getValueStr(Constant.ENV_FLINK_CHECKPOINT_PATH));
env.setStateBackend(new FsStateBackend(PropUtils.getValueStr(Constant.ENV_FLINK_STATEBACKEND_PATH)));

原因

我以为checkpoint和fsbackend要同时设置,其实,1.14.3版本,setCheckpointStorage和stateBackend改成了分着设置

我上边代码这样设置,相当于首先指定了以下checkpoint按照默认的backend存储,然后又指定了按照fsbackend存储,因此首先指定的checkpoint目录没有数据。

正解

env.setStateBackend(new HashMapStateBackend());
env.getCheckpointConfig().setCheckpointStorage(PropUtils.getValueStr(Constant.ENV_FLINK_CHECKPOINT_PATH));

State Backends | Apache Flink

异常现象2

开启checkpoint eos,开启容错,每次任务重新提交都会重新消费kafka已经完成了checkpoint的数据

原因

我以为只要开启这两个配置就可以保证已经checkpoint的kafka数据不会被重复消费,其实不然

checkpoint是flink内部的容错机制,他能保证在设置了失败重启策略之后(setRestartStrategy),如果发生异常导致失败重试之后自动从最新checkpoint恢复。不是手动重启。。。手动重启默认不会进行加载状态数据,所以每次都会从头消费

正解

flink任务 -s 指定恢复点提交,这个恢复点可以是checkpoint也可以时savepoint。

# 启动
/home/cuadmin/flink-1.14.3/bin/flink run -d  \
-c cn.flink.ApplicationMaster \
 /home/cuadmin/portal-flink-2021.0.1-SNAPSHOT-shaded.jar

# 备份,创建savepoint
/home/cuadmin/flink-1.14.3/bin/flink savepoint 19f4bb5d103ea8695712d4d1a797893f /home/cuadmin/flink-1.14.3/savepoint

# 指定savepoint启动
/home/cuadmin/flink-1.14.3/bin/flink run -d  \
-c cn.flink.ApplicationMaster \
-s  file:/home/cuadmin/flink-1.14.3/savepoint/savepoint-033556-251a9e55ed25  \
/home/cuadmin/portal-flink-2021.0.1-SNAPSHOT-shaded.jar

异常现象3

这是错误的

# 指定savepoint启动
/home/cuadmin/flink-1.14.3/bin/flink run -d  \
-c cn.flink.ApplicationMaster \

/home/cuadmin/portal-flink-2021.0.1-SNAPSHOT-shaded.jar
-s  file:/home/cuadmin/flink-1.14.3/savepoint/savepoint-033556-251a9e55ed25  \

按照上述命令执行,这个地方显示恢复点的加载情况,这里没显示,代表恢复点没有执行成功

原因

-s的位置有问题,我之前以为没有顺序,把-s 放到了命令最后,结果没报错,也没识别。。

正解

-s 位置要正确

# 指定savepoint启动
/home/cuadmin/flink-1.14.3/bin/flink run -d  \
-c cn.flink.ApplicationMaster \
-s  file:/home/cuadmin/flink-1.14.3/savepoint/savepoint-033556-251a9e55ed25  \
/home/cuadmin/portal-flink-2021.0.1-SNAPSHOT-shaded.jar

异常现象4

我记得savepoint和checkpoint是都可以用来flink -s 进行恢复点恢复的。但是每次都提示恢复失败,提示文件找不到,savepoint就可以。。。

原因

cancel job会将 checkpoint的数据删掉。。。

正解

测试的时候,直接stop-cluster,这样checkpoint数据就不会被删除了

保留 Checkpoint 

Checkpoint 在默认的情况下仅用于恢复失败的作业,并不保留,当程序取消时 checkpoint 就会被删除。当然,你可以通过配置来保留 checkpoint,这些被保留的 checkpoint 在作业失败或取消时不会被清除。这样,你就可以使用该 checkpoint 来恢复失败的作业。

CheckpointConfig config = env.getCheckpointConfig();
config.enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

ExternalizedCheckpointCleanup 配置项定义了当作业取消时,对作业 checkpoint 的操作:

  • ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION:当作业取消时,保留作业的 checkpoint。注意,这种情况下,需要手动清除该作业保留的 checkpoint。
  • ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION:当作业取消时,删除作业的 checkpoint。仅当作业失败时,作业的 checkpoint 才会被保留。

总结

1、savepoint的数据要比checkpoint更加稳定,比如你可以通过移动(拷贝)savepoint 目录到任意地方,然后再进行恢复。checkpoint就不可以,因为他有很多相对路径配置。

2、savepoint和checkpoint一般都能作为恢复点使用,例外情况是使用 RocksDB 状态后端的增量 Checkpoint。他们使用了一些 RocksDB 内部格式,而不是 Flink 的本机 Savepoint 格式。这使他们成为了与 Savepoint 相比,更轻量级的 Checkpoint 机制的第一个实例。

3、任务因为偶然原因内部重启(task级别),通过失败重试机制+checkpoint自动进行重放,任务因重启、断电、死机等外部因素(cluster级别),通过-s 指定checkpoint/savepoint恢复点进行手动重放。这样就可以保证状态数据的稳定

flink读写kafka保证端到端exactly-once flink读写kafka保证exactly-once 阅读详情

相关推荐

Flink消费Kafka消费组中的协调器死亡导致数据重复消费问题的解决方法

然而,如果协调器发生故障,比如死亡或重启,会导致消费组重新选举新的协调器,而新的协调器可能会从之前的偏移量(offset)处开始重新消费消息,从而导致数据重复消费的问题。通过使用Flink的外部状态功能,我们可以有效解决消费组中协调器死亡导致数据重复消费的问题。通过跟踪每个消费者已经处理过的偏移量,并与当前消息的偏移量进行对比,我们可以避免重复消费相同的消息。在处理消息时,我们首先从外部状态存储(如Redis)中获取消费者已经处理过的偏移量,并与当前消息的偏移量进行对比。否则,说明是重复消息,可以忽略。

PixelInk的博客 596

Flink Task重启之后重复消费Kafka消息问题解决

我的项目是从Kafka消费消息,计算之后发送到elasticsearch存储。 现象:每次重启Flink Task,都会往elasticsearch发送已经计算过的数据。比如本来elasticsearch有3条记录,在不往Kafka生产新消息的情况下,重新启动Flink Task之后有6条,再重启是12条,说明数据重复。 初步怀疑是重复消费Kafka的消息,可能是offset没有提交。于是在Fli...

qq_35939417的博客 7363

Idea本地跑flink任务时,总是重复消费kafka的数据(kafka->mysql)

Idea中执行任务时,没法看到JobManager的错误,以至于我以为是什么特殊的原因导致任务总是反复消费。在close方法中,增加日志,发现jdbc连接被关闭了。重新消费,jdbc连接又启动了。注意,在Flink的函数中,open和close方法只在任务启动和结束的时候执行一次。反之,可以推理出,如果close方法被执行了,那么说明任务挂了。在本地任务中增加本地Flink UI,很明显可以看到任务在不断的重启。JobManager中有明显的Exception,就是。

打工日常 2303

Flink 容错机制 保存点和检查点

Flink 容错机制 保存点和检查点 启用与恢复

Mogeko1的博客 2400

Flink消费Kafka中的重试机制及其引起的问题

当配置了较长的"retry.backoff.ms"值时,Flink在处理失败的消息之前会等待更长的时间。因此,在配置"retry.backoff.ms"时,需要考虑到实时性的要求,避免过长的等待时间。可以选择一个合适的等待时间,以确保消息在失败后有足够的时间恢复,同时避免过长的处理延迟。使用这些配置选项可以确保在出现故障或错误的情况下,Flink能够尽力处理并重试消息,从而提高数据处理的可靠性。在实际应用中,需要根据具体的业务需求和系统情况进行配置,并进行充分的测试和优化,以获得最佳的性能和可靠性。

JieLun_C的博客 695

源码解读 | Flink Kafka Connector Source 如何提交 Offset

本文深入解析了Apache Flink 1.13.6中FlinkKafkaConsumer的Offset提交机制。

SmartSi 1214

解决Flink消费Kafka信息,结果存储在Mysql的重复消费问题

背景 最近项目中使用Flink消费kafka消息,并将消费的消息存储到mysql中,看似一个很简单的需求,在网上也有很多flink消费kafka的例子,但看了一圈也没看到能解决重复消费的问题的文章,于是在flink官网中搜索此类场景的处理方式,发现官网也没有实现flink到mysql的Exactly-Once例子,但是官网却有类似的例子来解决端到端的仅一次消费问题。这个现成的例子就是FlinkK...

lukabruce的博客 8262

Android应用隐私合规自动化检测:Frida与Camille实战指南

在移动应用安全与隐私合规领域,动态代码插桩技术已成为核心检测手段。其原理是通过运行时注入,实时监控和修改应用行为,从而绕过传统静态分析的局限。这项技术的核心价值在于能够精准捕获应用在运行时的敏感数据调用与网络传输行为,为隐私合规审计、安全测试提供直接证据。在实际应用场景中,它尤其适用于自动化检测违规收集个人信息、追踪数据流向等任务。本文聚焦于利用Frida这一动态插桩框架,结合Camille隐私合规检测工具集,构建自动化监控环境。通过注入JavaScript代码,实现对Android敏感API(如获取设备标

weixin_34254464的博客 389

flink重复读取mysql_解决Flink消费Kafka信息,结果存储在Mysql的重复消费问题

背景最近项目中使用Flink消费kafka消息,并将消费的消息存储到mysql中,看似一个很简单的需求,在网上也有很多flink消费kafka的例子,但看了一圈也没看到能解决重复消费的问题的文章,于是在flink官网中搜索此类场景的处理方式,发现官网也没有实现flink到mysql的Exactly-Once例子,但是官网却有类似的例子来解决端到端的仅一次消费问题。这个现成的例子就是FlinkKaf...

weixin_26879037的博客 1641

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

本文介绍如何使用KRobot图形化编程工具快速搭建Arduino巡线小车,无需编写代码。从硬件准备到逻辑构建,详细讲解传感器数据处理、电机控制优化及高级功能扩展,帮助教育工作者和创客爱好者10分钟内完成项目。

weixin_30632089的博客 395

STM32H750实战:如何用CubeMX配置NAND Flash时序(附常见问题排查)

本文详细解析了STM32H750通过CubeMX配置NAND Flash时序的实战技巧,包括硬件连接、时序参数计算与优化策略,以及常见问题如RGB屏幕干扰、多片选冲突的解决方案。特别针对NAND Flash的时序配置和抗干扰设计提供了实用代码示例和优化建议,帮助开发者提升系统稳定性和性能。

weixin_29176179的博客 365

Kafka学习笔记: 自动提交&手动提交.

Consumer 需要向 Kafka 汇报自己的位移数据,这个汇报过程被称为提交位移(Committing Offsets)。因为 Consumer 能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,即 Consumer 需要为分配给它的每个分区提交各自的位移数据。 提交位移主要是为了表征 Consumer 的消费进度,这样当 Consumer 发生故障重启之后,就能够...

张伯毅的专栏 1万+

Grafana企业版vs开源版:从安装到插件管理的完整对比实测(含离线部署技巧)

本文深入对比Grafana企业版与开源版在安装流程、插件管理和功能限制等方面的差异,特别针对离线部署场景提供实用技巧。通过实测数据源支持、权限管理等核心功能,帮助企业用户做出明智选择,同时详细介绍离线安装和插件签名验证等关键操作。

weixin_29313817的博客 107

消费MySQL数据 不重复消费_解决Flink消费Kafka信息,结果存储在Mysql的重复消费问题...

背景最近项目中使用Flink消费kafka消息,并将消费的消息存储到mysql中,看似一个很简单的需求,在网上也有很多flink消费kafka的例子,但看了一圈也没看到能解决重复消费的问题的文章,于是在flink官网中搜索此类场景的处理方式,发现官网也没有实现flink到mysql的Exactly-Once例子,但是官网却有类似的例子来解决端到端的仅一次消费问题。这个现成的例子就是FlinkKaf...

weixin_36296864的博客 987

一文读懂 MAVLink、PPM、SBUS:无人机通信协议的工作原理与适用场景

本文系统对比无人机领域三大核心通信协议:MAVLink作为全链路数据协议,支持飞控与地面站的双向通信,适合航拍测绘等专业场景;SBUS是数字化的高效控制协议,具备16通道、抗干扰特性,成为中高端设备标配;PPM作为传统模拟协议,成本低廉但性能有限,适合入门级应用。文章深入解析各协议的工作原理、帧结构、适用场景及调试技巧,指出MAVLink侧重状态监控、SBUS/PPM专注控制指令的互补关系,并给出新手选型建议:入门选PPM,进阶用SBUS,开发必备M

bother3000的博客 7127

OnePose++: Keypoint-Free One-Shot Object Pose Estimation without CAD Models

算法:首先采用LoFTR的细匹配模块,将粗匹配点周围的小窗口内,通过对比特征找到最相似的位置,细化当前特征点的位置。算法:PnP算法,利用3D点和2D投影点的对应关系,计算相机相对于物体的6D姿态(位置朝向)。算法:使用COLMAP,对2D粗匹配对(不依赖传统关键点匹配)进行特征轨迹计算并生成半稠密点云,每个3D点包含坐标和对应的2D投影点。算法:LoFTR粗匹配模块,将每一个像素点视为伪关键点,生成半稠密的2D匹配对。输入:优化后的3D、当前视图的2D特征点。输出:粗半稠密点云以及物体的特征轨迹。

雨落倾城的博客 888

flink循环读取mysql数据增量循环_解决Flink消费Kafka信息,结果存储在Mysql的重复消费问题...

来源于https://blog.youkuaiyun.com/lukabruce/article/details/100737292背景最近项目中使用Flink消费kafka消息,并将消费的消息存储到mysql中,看似一个很简单的需求,在网上也有很多flink消费kafka的例子,但看了一圈也没看到能解决重复消费的问题的文章,于是在flink官网中搜索此类场景的处理方式,发现官网也没有实现flink到my...

weixin_34585343的博客 1163

YOLO26训练自己的数据集,从代码下载到实例测试 (含YOLO26网络结构图)

在Windows10上配置CUDA环境教程2026年1月14日,YOLO26是最新发布的计算机视觉模型。支持多种任务,包括目标检测、实例分割、图像分类、姿态估计、有向目标检测以及物体跟踪等。以上就是YOLO26训练自己数据集的全部过程啦,欢迎大家在评论区交流~

Limiiiing的博客 6546

kafka自动提交 offset

Kafka 的自动提交偏移量机制为开发者提供了便利,但它以牺牲一定的消息处理可靠性为代价。它适合对消息丢失容忍度较高的场景。对于需要确保“至少一次”(At-Least-Once)或“精确一次”(Exactly-Once)语义的关键业务场景,建议关闭自动提交,并实现可靠的手动偏移量提交策略。

2301_80954266的博客 1177

Xilinx平台SRIO介绍(五)示例工程Example Design介绍

理解IP的使用,少不了Example Design的学习。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Flink+kafka端到端状态一致性保证

Flink+kafka端到端状态一致性保证 什么是状态一致性 有状态的流处理,内部每个算子任务都有自己的状态 对于流处理器内部来说,所谓的状态一致性,其实就是我们所说的计算结果要保证准确 一条数据不用改丢失,也不应该重复计算 在遇到故障时可以恢复状态,恢复以后的重新计算,结果也是完全正确的 Flink内部状态一致性分类 AT-LEAST-ONCE(至少一次) 大多数真是应用场景,我们希望不...

shufangreal的博客 3709

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

kafka offset & flink & spark structured streaming

前言 Kafka有offset的概念,offset记录每个groupId对于每个topic的每个partition里已经提交的读取位置。当comsumer程序失败重启时,可以从这个位置重新读取数据。 可以通过如下方法查看一个groupId的offset: root@h2:~# /opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server h2...

civil的专栏 3798

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Flink避坑指南】别再混淆了!真正防止数据重复的不是Flink,而是你的设计

摘要:Flink的"精确一次"语义常被误解为完全避免数据重复消费,实则其核心在于通过状态回滚和事务/幂等机制消除重复消费的负面影响。当任务从Checkpoint恢复时,已处理数据会被重新消费,但Flink通过状态后端保证内部状态一致性,并借助两阶段提交或幂等写入确保外部输出不重复。关键启示在于:优秀系统设计不是追求绝对无故障,而是通过容错机制实现最终一致性。最佳实践包括合理配置Checkpoint、选择高效状态后端和使用支持事务的Sink连接器。

JacksonKing的专栏 1195

Flink 重启后事件被重复消费的原因与解决方案

Flink 是一个强大但“状态驱动”的系统,一切幂等、容错、精确语义的背后,都依赖 checkpoint 的精确控制和 Source/Sink 的协同。Flink 重启后并不是“理所当然”地继续执行,而是带着上一次 checkpoint 的记忆“穿越回来”继续工作。如果中间没有状态标记,事件自然可能被重复读取和处理。因此我们在实际使用 Flink 时,应从以下几个方面着手提高系统的鲁棒性:明确语义需求(Exactly-Once vs At-Least-Once);

长河的博客 1590

Flink Checkpoint是否支持Kafka 数据消费状态的维护?

作者:闻乃松 使用Flink实时消费kafka数据时候,涉及到offset的状态维护,为了保证Flink作业重启或者运行时的Operator级别的失败重试,如果要做到“断点续跑”,需要Flink的Checkpoint的支持。问题是,如果简单的开启Flink的Checkpoint机制,而不需要额外的编码工作,是否能达到目的?为回答该问题,本文首先要研究Flink的Checkpoint的处理机制,然后再看Flink是否支持Kafka的状态存储,于是本文分以下四个部分: Flink Checkpoint 状态快

Deepexi_Date的博客 1400
上一篇: 分布式程序中YARN中的角色
下一篇: Flink中jobmanager、taskmanager、slot、task、subtask、Parallelism的概念
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值