flink 写入数据到 kafka 后,数据过一段时间自动删除

版本

  • flink 1.16.0
  • kafka 2.3

流程描述:

flink利用KafkaSource ,读取kafka的数据,然后经过一系列的处理,通过KafkaSink ,采用 EXACTLY_ONCE 的模式,将处理后的数据再写入到新的topic中。

问题描述:

数据写入到新的topic后,过上几分钟的时间,利用工具offset explorer观察对应topic的数据量,显示为0。

刚写入没多久的数据消失了 ???大写的懵 ???

定位问题:

  • 首先查看kafka的日志:
  • 阅读flink 官方文档 kafkaSink的介绍:

DeliveryGuarantee.EXACTLY_ONCE: In this mode, the KafkaSink will write

all messages in a Kafka transaction that will be committed to Kafka on

a checkpoint. Thus, if the consumer reads only committed data (see

Kafka consumer config isolation.level), no duplicates will be seen in

case of a Flink restart. However, this delays record visibility

effectively until a checkpoint is written, so adjust the checkpoint

duration accordingly. Please ensure that you use unique

transactionalIdPrefix across your applications running on the same

Kafka cluster such that multiple running jobs do not interfere in

their transactions! Additionally, it is highly recommended to tweak

Kafka transaction timeout (see Kafka producer transaction.timeout.ms)>>

maximum checkpoint duration + maximum restart duration or data loss

may happen when Kafka expires an uncommitted transaction.

  • 翻译过来的意思大概就是:

在EXACTLY_ONCE这种模式下,KafkaSink在事务中写入所有的消息,这些消息在checkpoint上提交给kafka。因此,在flink重启的情况下,如果消费者值读取提交的数据,不会看到重复的数据。缺点就是延迟记录可见性,知道写入检查点为止。强烈建议调整kafka的事务超时时间(见Kafka producer transaction.timeout.ms),超时时间要大于【最大检查点持续时间+最大重启持续时间】,否则当Kafka过期未提交的事务时可能会发生数据丢失。

  • 阅读kafka的官网介绍:

Producer Configs:
transaction.timeout.ms:60000(默认值)

参数描述:

The maximum amount of time in ms that the transaction coordinator will

wait for a transaction status update from the producer before

proactively aborting the ongoing transaction.If this value is larger

than the transaction.max.timeout.ms setting in the broker, the request

will fail with a InvalidTransactionTimeout error.

Broker Configs
transaction.max.timeout.ms:900000(默认值)

参数描述:

The maximum allowed timeout for transactions. If a client's requested

transaction time exceed this, then the broker will return an error in

InitProducerIdRequest. This prevents a client from too large of a

timeout, which can stall consumers reading from topics included in the

transaction.

  • 最后排查
    在flink中设置的超时时间违反了kafka producer对应的参数规定。

解决问题

在kafkaSink的配置中,加入

java 复制代码
Properties properties = new Properties();
// 根据上面的介绍自己计算这边的超时时间,满足条件即可
properties.setProperty("transaction.timeout.ms","900000");

KafkaSink<String> sink = KafkaSink.<String>builder()
                .setBootstrapServers(bootstrapServers)
                .setRecordSerializer(KafkaRecordSerializationSchema.<String>builder()
                        .setTopic(sinkTopic)
                        .setValueSerializationSchema(new SimpleStringSchema())
                        .build()
                )
                .setKafkaProducerConfig(properties)
                .setDeliveryGuarantee(DeliveryGuarantee.EXACTLY_ONCE)
                .setTransactionalIdPrefix("flink-xhaodream-")
                .build();

总结

在使用现有框架和工具的时候,往往只是懂得怎么用,具体底层的逻辑、原理,了解的很少。往往只有真正理解了原理,遇到了问题,才会更快、更准确的定位问题、解决问题。

相关推荐
冷崖8 小时前
消息队列-kafka(一)
分布式·kafka
不光头强11 小时前
kafka学习要点
分布式·学习·kafka
编程彩机12 小时前
互联网大厂Java面试:从分布式缓存到消息队列的技术场景解析
java·redis·面试·kafka·消息队列·微服务架构·分布式缓存
CTO Plus技术服务中13 小时前
Flink运维与开发教程
大数据·运维·flink
indexsunny13 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa
Hello.Reader15 小时前
Flink CLI 从提交作业到 Savepoint/Checkpoint、再到 YARN/K8S 与 PyFlink
大数据·flink·kubernetes
Hello.Reader16 小时前
Flink 弹性伸缩(Elastic Scaling)Adaptive Scheduler、Reactive Mode 与外部资源声明
服务器·网络·flink
AC赳赳老秦1 天前
专利附图说明:DeepSeek生成的专业技术描述与权利要求书细化
大数据·人工智能·kafka·区块链·数据库开发·数据库架构·deepseek
zhangxl-jc1 天前
StreamPark2.1.7 添加Flink Home 报错 base64 character 2d 解决方法
大数据·flink
没有bug.的程序员2 天前
Spring Boot 与 Kafka:消息可靠性传输与幂等性设计的终极实战
java·spring boot·后端·kafka·幂等性·消息可靠