我正在阅读有关flink一次功能here的文档。而且我不太理解其中的一些句子:
在成功进行预提交之后,必须保证提交最终成功–我们的运营商和我们的外部系统都需要做出此保证。如果提交失败(例如,由于间歇性的网络问题),则整个Flink应用程序都会失败,并根据用户的重新启动策略重新启动,并且还会进行另一次提交尝试。此过程至关重要,因为如果提交最终未能成功,则会发生数据丢失。
这表示如果提交最终未成功,则会发生数据丢失。我将其解释为:提交可以成功,但是由于某些原因,每次重新启动时都会失败。在这种情况下,Flink只能放弃属于该提交的数据。因此,如果数据丢失是不可接受的,则应重新启动应用程序,直到提交成功?
我们知道,如果出现任何故障,Flink会将应用程序的状态还原到最新的成功检查点。在极少数情况下,如果失败发生在成功的预提交之后但在该事实(提交)的通知到达我们的操作员之前发生,则是一个潜在的陷阱。在这种情况下,Flink会将我们的操作员还原到已经预先提交但尚未提交的状态。
我在这里也不太了解。这是什么通知,上面没有提到?所说的算子是水槽算子吗?另外,按照我的解释,如果提交成功并且只有所谓的通知失败,那么还原到预提交状态后是否会导致数据重复?
如果问题本身无效,请纠正我。任何帮助表示赞赏。
答案 0 :(得分:1)
Flink的端到端精确一次机制基于类似协议的两阶段提交(2PC)。该协议用于协调程序是否没有接收器或所有接收器将输出提交到外部系统。
当接收器任务显示“ 我准备提交”(预提交)时,它保证可以执行提交。然后,接收器任务等待接收来自协调器的提交通知,仅当所有接收器任务都同意准备提交时才发送该通知。如果在收到通知之前应用程序失败,则保证也必须成立。在这种情况下,接收器任务必须能够恢复打开的(尚未提交)事务,并在收到下一个通知时执行该事务。万一发生多次失败,接收器必须继续尝试直到提交成功。但是,即使一个(或多个)失败,事务也只能执行一次。
这就是
的意思。预提交成功后,必须保证提交最终成功
如果接收器任务最终无法提交其预先提交的数据,则数据将丢失。