1

我知道 Apache Flink 有 Exactly once 的能力,它依赖于 checkpoint 机制和可重发的数据源。

按照我的理解,如果 Flink 的一个算子出现错误,它需要重新运行它的最后一个操作,所以它必须需要获取历史数据。在这种情况下,历史数据应该/可以存储在哪里?

说数据源是Apache Kafka,那我可以让Kafka存储历史数据吗?我可以让 Flink 存储历史数据吗?或者我可以让他们两个都这样做吗?如果他们两个可以一起做这件事,是不是我可以让Kafka存储一部分历史数据,让Flink存储另一部分历史数据,这样我就可以保存更多的历史数据?

4

1 回答 1

2

Flink 遵循数据流方法进行流处理。每个操作员处理一些元素并在处理后立即将它们发送到下游。

有在源处生成的特殊标记,称为检查点标记。当它们到达操作员时,它会检查状态并将标记发送到下游。

用于在运营商之间发送数据的通道也是持久的。因此,每当操作员失败时,它只需要重播通道中的记录,这些记录是最后一个操作员从最后一个成功的检查点发送的。由于跨运营商通道是持久的(按设计存储记录)并保证 FIFO,因此您无需在任何地方手动存储它们。(我还没有找到他们如何做到这一点的细节。)

如果你使用 Kafka 作为源,Flink 也会处理其中的一次性语义。(由于 Kafka 的持久性,记录被存储并且可以再次读取。)

您只需要保证您的接收器是幂等的或支持精确一次语义的两阶段提交。

于 2020-05-11T19:29:12.237 回答