当前位置: 首页 > 知识库问答 >
问题:

Flink精确一次消息处理

姬博瀚
2023-03-14

我已经设置了一个Flink 1.2独立集群,其中包含2个JobManager和3个TaskManager,我正在使用JMeter通过生成Kafka消息/事件对其进行负载测试,然后处理这些消息/事件。处理作业在TaskManager上运行,通常需要大约15K个事件/秒。
作业已设置EXACTLY_ONCE检查点,并将状态和检查点持久化到Amazon S3。如果我关闭运行作业的TaskManager需要一点时间,几秒钟,然后在不同的TaskManager上恢复作业。
当我在TaskManager上检查输出时,我关闭了最后一个计数,例如500000,然后当我在另一个TaskManager上检查恢复的作业的输出时,它以~400000开始。这意味着重复事件的100K。这个数字取决于测试的速度,可以更高或更低。
不确定我是否错过了什么,但我希望作业在不同的TaskManager上恢复后显示下一个连续数字(如500001)。
有人知道为什么会发生这种情况/我必须配置额外设置才能获得一次吗?

共有1个答案

闾丘炫明
2023-03-14

您将看到精确一次的预期行为。Flink通过检查点和失败情况下的重播相结合来实现容错。保证不是每个事件将被准确地发送到管道中一次,而是每个事件将仅影响管道的状态一次。

检查点在整个集群中创建一致的快照。在恢复期间,将恢复操作员状态,并从最近的检查点重播源。

有关更全面的解释,请参阅Artisans博客文章:使用Apache Flink™或Flink文档进行高吞吐量、低延迟和精确一次流处理

 类似资料:
  • Apache Flink通过从检查点恢复作业,确保故障和恢复时只进行一次处理,检查点是分布式数据流和操作员状态的一致快照(分布式快照的Chandy Lamport算法)。这保证了故障切换时只需一次。 在正常集群操作的情况下,Flink如何保证只进行一次处理,例如给定一个从外部源读取的Flink源(例如Kafka),Flink如何保证从源读取一次事件?事件源和Flink源之间是否有任何类型的应用程序

  • 一、 我正试图用Kafka信源和信宿测试Flink一次语义: 运行flink应用程序,只需将消息从一个主题传输到另一个主题,并行度=1,检查点间隔20秒 每2秒使用Python脚本生成具有递增整数的消息。 使用read_committed隔离级别的控制台使用者读取输出主题。 手动杀死TaskManager 我希望在输出主题中看到单调递增的整数,而不考虑TaskManager的终止和恢复。 但实际上

  • 我有一个Flink工作,负责将数据写入MongoDB的接收器。接收器是RichSinkFunction的实现。 已启用外部化检查点。间隔为5000 mills,方案为一次。 Flink版本1.3, kafka(源话题)0.9.0 我无法升级到Flink 1.4的。 我没有什么疑问 在调用函数开始时或调用完成时,接收器在哪个时间点确认检查点屏障?表示它在确认障碍之前等待持久(保存在MongoDB中)

  • 在下面的示例中,我有两个正在处理来自kafka的消息的服务实例,但我希望确保只在之后处理。 显然,通过将一个实例配置为仅从特定分区消费,可以很容易地解决这种情况,该分区将存储带有公共标识符的消息: 现在顺序得到了保证,将永远不会在之前处理。 但是,我在想这个问题是否可以用另一种方式来解决,直接在代码中而不是依赖基础设施?这看起来可能是微服务架构中的一个标准问题,但我不确定哪种方法是解决它的首选方法

  • 我正在使用Spring Cloud Stream(Edgware.SR5)和Spring Boot(1.5.10.RELEASE)。我的@StreamListener正在处理收到的每条消息两次。 该示例的思想是在队列中发布消息并对其进行处理。 服务: 绑定: application.properties: 配置(用于在测试中注入代理服务): 测试: 我得到了以下输出: 我不知道我的配置有什么问题,

  • 我正在寻找Python的第n个根函数/算法,但在发布之前:没有整数根,见鬼 我从哪里至少可以获得一个指南,指导如何编程生成精确的/ 对于(第一个参数是数字,第二个参数是根深度(或其他内容))不返回或的函数。 编辑:所以,你给了我这个解决方案:,当我问这个问题时,我就知道了,但它不适用于,例如,。你不能用有理数来表示,因此给出了不正确的结果