Exactly-once:谁在存储历史数据,flink 还是数据源
Exactly-once: who is storing the historical data, flink or the data source
我知道Apache Flink有Exactly once能力,依赖checkpoint机制和可重发数据源
按照我的理解,如果Flink的一个算子出现了一些错误,需要将上次的操作重新运行,所以肯定需要获取历史数据。在这种情况下,should/could历史数据存储在哪里?
说数据源是Apache Kafka,那么可以让Kafka存储历史数据吗?可以让Flink存储历史数据吗?或者我可以让他们两个都这样做吗?如果他们两个能一起做这件事情,是不是意味着我可以让Kafka存储一部分历史数据,让Flink存储另一部分历史数据,这样我就可以保存更多的历史数据?
Flink 遵循数据流的方式进行流处理。每个操作员处理一些元素,并在处理完后立即将它们发送到下游。
在源中生成特殊标记,称为检查点标记。当他们到达操作员时,它会检查状态并将标记发送到下游。
用于在运营商之间发送数据的通道也是耐用的。因此,每当操作员失败时,它只需要重播通道中最后一个操作员从最后一个成功检查点发送的记录。由于运营商间渠道是持久的(按设计存储记录)并保证 FIFO,因此您无需在任何地方手动存储它们。 (我还没有找到他们如何做的细节。)
如果您使用 Kafka 作为源,Flink 也会处理那里的恰好一次语义。 (由于Kafka的持久性,记录被存储并可以再次读取。)
您只需要保证您的接收器是幂等的或支持恰好一次语义的两阶段提交。
我知道Apache Flink有Exactly once能力,依赖checkpoint机制和可重发数据源
按照我的理解,如果Flink的一个算子出现了一些错误,需要将上次的操作重新运行,所以肯定需要获取历史数据。在这种情况下,should/could历史数据存储在哪里?
说数据源是Apache Kafka,那么可以让Kafka存储历史数据吗?可以让Flink存储历史数据吗?或者我可以让他们两个都这样做吗?如果他们两个能一起做这件事情,是不是意味着我可以让Kafka存储一部分历史数据,让Flink存储另一部分历史数据,这样我就可以保存更多的历史数据?
Flink 遵循数据流的方式进行流处理。每个操作员处理一些元素,并在处理完后立即将它们发送到下游。
在源中生成特殊标记,称为检查点标记。当他们到达操作员时,它会检查状态并将标记发送到下游。
用于在运营商之间发送数据的通道也是耐用的。因此,每当操作员失败时,它只需要重播通道中最后一个操作员从最后一个成功检查点发送的记录。由于运营商间渠道是持久的(按设计存储记录)并保证 FIFO,因此您无需在任何地方手动存储它们。 (我还没有找到他们如何做的细节。)
如果您使用 Kafka 作为源,Flink 也会处理那里的恰好一次语义。 (由于Kafka的持久性,记录被存储并可以再次读取。)
您只需要保证您的接收器是幂等的或支持恰好一次语义的两阶段提交。