apache-flink - Flink 一次性消息处理

标签 apache-flink flink-streaming flink-cep

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

最佳答案

您将看到预期的行为恰好一次。 Flink 通过结合检查点和在发生故障时重放来实现容错。保证不是每个事件都会被发送到管道中一次,而是每个事件都会影响管道的状态一次。

检查点在整个​​集群中创建一致的快照。在恢复期间,运算符(operator)状态被恢复并且源从最近的检查点重放。

有关更详尽的解释,请参阅此数据工匠博客文章:High-throughput, low-latency, and exactly-once stream processing with Apache Flink™ , 或 the Flink docs .

关于apache-flink - Flink 一次性消息处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43435553/

相关文章:

java - 将自定义源的数据连续写入flink

java - FlinkCEP的执行时间

java - 如何从 Apache Flink 配置仪表板隐藏敏感配置数据?

java - 如何使用 sleep 时间在java中生成超过1000个事件/秒

apache-flink - Flink Jdbc 接收器

apache-flink - Flink - 用于一系列 API 调用的异步 IO 运算符

java - 弗林克 : How to pass a dynamic path while writing to files using writeFileAsText(path)?

java - flink SourceFunction<> 在 StreamExecutionEnvironment.addSource() 中被替换?

apache-kafka - 使用 Flink 自定义 avro 消息反序列化

apache-flink - 为什么 flink SplitStream 被标记为 deprecated