Apache flink 关于弗林克的一次特写

Apache flink 关于弗林克的一次特写,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我只阅读了一次有关flink功能的文档。有些句子我不太懂: 在成功的预提交之后,必须保证提交最终成功–我们的运营商和外部系统都需要做出这一保证。如果提交失败(例如,由于间歇性网络问题),则整个Flink应用程序将失败,并根据用户的重新启动策略重新启动,然后再次尝试提交。这个过程非常关键,因为如果提交最终没有成功,就会发生数据丢失 这表示如果提交最终没有成功,就会发生数据丢失。我将其解释为:提交可能会成功,但由于某些原因,每次重新启动都会失败。在这种情况下,Flink只能放弃属于此提交的数据。

我只阅读了一次有关flink功能的文档。有些句子我不太懂:

  • 在成功的预提交之后,必须保证提交最终成功–我们的运营商和外部系统都需要做出这一保证。如果提交失败(例如,由于间歇性网络问题),则整个Flink应用程序将失败,并根据用户的重新启动策略重新启动,然后再次尝试提交。这个过程非常关键,因为如果提交最终没有成功,就会发生数据丢失

  • 这表示如果提交最终没有成功,就会发生数据丢失。我将其解释为:提交可能会成功,但由于某些原因,每次重新启动都会失败。在这种情况下,Flink只能放弃属于此提交的数据。那么,如果数据丢失是不可接受的,应用程序应该重新启动,直到提交成功

  • 我们知道,如果出现任何故障,Flink会将应用程序的状态恢复到最新的成功检查点。一个潜在的陷阱是在一个罕见的情况下,当失败发生在成功的预提交之后,但在该事实的通知(提交)到达我们的操作员之前。在这种情况下,Flink会将我们的操作符恢复到已预提交但尚未提交的状态

  • 我在这里也不太明白。这个通知是关于什么的,上面没有提到?那么,上述操作员是指水槽操作员吗?另外,根据我的解释,如果提交成功,而只有所谓的通知失败,那么在恢复到预提交状态后,会不会导致数据重复


    如果问题本身无效,请纠正我。感谢您的帮助

    Flink的端到端精确一次机制基于类似两阶段提交(2PC)的协议。该协议用于协调程序的所有接收器或所有接收器将输出提交到外部系统

    当sink任务说“我准备好提交”(pre-commit)时,它保证它能够执行提交。然后,接收器任务等待从协调器接收提交通知,该通知仅在所有接收器任务都同意准备提交时发送。如果在收到通知之前申请失败,担保也必须有效。在这种情况下,接收器任务必须能够恢复打开(尚未提交)的事务,并在收到下一个通知时执行它。在多次失败的情况下,接收器必须继续尝试,直到提交成功。但是,即使发生一次(或多次)故障,事务也只能执行一次

    这就是我的意思

    成功预提交后,必须保证提交最终成功


    如果接收器任务最终无法提交其预先提交的数据,则数据将丢失

    很抱歉这么晚才给你回电话。如果接收器任务的并行度大于1,则这些任务提交相同的事务(例如Kafka事务)或分别提交不同的事务?每个接收器任务启动并提交一个单独的事务。2PC协议可以确保一个检查点的所有或所有事务都被提交。非常感谢。我还有一个问题。文档说明,外部系统必须提供提交或回滚写操作的方法,以与Flink的检查点相协调。我想知道这是否适用于键值存储(例如HBase)或具有自定义id的Elasticsearch。根据我自己的理解,在出现故障时始终重试可以保证不会丢失数据,并且由于它们是键值存储,因此不会发生重复。是否正确?如果输出数据具有唯一的键,并且数据存储支持upserts(如果存在,则插入或更新),则如果您对暂时过时的或跨键不一致的数据没有问题,则不需要事务来保证只写入一次。有点困惑。在按键写入的情况下,数据是否总是暂时过时?因为数据更新在将来总是可能的。此外,accross key CONSTRAINCE是否意味着两个检查点之间生成的数据不会一起写入外部系统,因为有些写入在第一次成功,而另一些写入在恢复后完成?