Flink如何确保数据准确性和一致性

tamoadmin 热门赛事 2024-04-25 18 0

Flink确保数据准确性和一致性的方式主要包括以下几个方面:

1.一致性级别的保证

在分布式系统中引入状态时,自然也引入了一致性问题。一致性实际上是“正确性级别”的另一种说法,即在成功处理故障并恢复之后得到的结果,与没有发生任何故障时得到的结果相比。在流处理中,一致性分为3个级别:atmostonce、atleastonce和exactlyonce。

atmostonce:数据最多被处理一次。这其实是没有正确性保障的委婉说法——故障发生之后,计数结果可能丢失。

atleastonce:数据最少被处理一次。这表示计数结果可能大于正确值,但绝不会小于正确值。也就是说,计数程序在发生故障后可能多算,但是绝不会少。

exactlyonce:数据只被处理一次(最优)。这指的是系统保证在发生故障后得到的计数结果与正确值一致。Flink的一个重大价值在于,它既保证了exactlyonce,也具有低延迟和高吞吐的处理能力。

2.检查点机制

Flink使用一种被称为“检查点”的特性,在出现故障时将系统重置回正确状态。Flink检查点的核心作用是确保状态正确,即使遇到程序中断,也要正确。通过确保备份的状态和位置指向同一个逻辑时间点,从而保证exactlyonce。

检查点屏障和普通记录类似。它们由算子处理,但并不参与计算,而是会触发与检查点相关的行为。当读取输入流的数据源(在本例中与keyBy算子内联)遇到检查点屏障时,它将其在输入流中的位置保存到稳定存储中。如果输入流来自消息传输系统(Kafka或MapRStreams),这个位置就是偏移量。

当map算子处理完前3条记录并收到检查点屏障时,它们会将状态以异步的方式写入稳定存储。当map算子的状态备份和检查点屏障的位置备份被确认之后,该检查点操作就可以被标记为完成。

3.数据验证

在实时计算开发的过程中,如何保证数据的正确性是一个比较棘手的问题。保证数据正确性的第一步就是对数据进行验证。大致的思路就是将Flink写入的结果数据和明细数据或离线数据进行比对。以Flink实时计算中的数据漂移的代码为例,讲解整个比对流程。

4.两阶段提交协议

Flink如何确保数据准确性和一致性

Flink的设计了两阶段提交协议,提供了框架级别的支持,即TwoPhaseCommitSinkFunction。这样就有可能构建一个从数据源到数据输出的端到端严格一次即EndtoEndExactlyOnce的管道。

以上就是Flink确保数据准确性和一致性的方式的主要内容。