首页 > 其他分享 >Flink端到端的一致性

Flink端到端的一致性

时间:2022-12-07 15:23:10浏览次数:44  
标签:状态 快照 Flink pj 检查点 链路 一致性 端到

Flink端到端的一致性

- source端(kafka consumer)

 偏移量保存下来, 如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新 消费数据,保证一致性。

- 内部 (checkpoint 机制)

• 基于 Chandy-Lamport 算法的分布式快照算法
• 将检查点的保存和数据处理分离开,不暂停整个应用
检查点分界线(Checkpoint Barrier,检查点屏障)
• Flink 的检查点算法用到了一种称为分界线(barrier)的特殊 数据形式,用来把一条流上数据按照不同的检查点分开
• 分界线之前到来的数据导致的状态更改,都会被包含在当前 分界线所属的检查点中;而基于分界线之后的数据导致的所 有更改,就会被包含在之后的检查点中
过程:
1 某一个程序正常执行(2条输入流/两个并行度皆可),某一时刻,jobManger向每个Source 任务发送新的检查点id信息,启动最初的检查点。
2 数据源将它们的状态写入检查点,发出一个检查点的barrier,状态后端待状态存入检查点,通知Source任务,Source向jobManger确认检查点完成。
3 Barrier向下游发送,操作任务会等待所有的相同Barrier到达,先到达的等后到达的,此时数据缓存(后来者居上的数据),继续等其他分区的barrier到达。
4 到达后,任务将状态保存到状态后端,Barrier继续向下游转发,任务继续执行
5 Sink向jobmanger确认状态保存到checkpoint,所有任务到达,则检查点完成。

- sink(kafka producer)**

下级存储支持事务:Flink 可以通过实现两阶段提交和状态保存来实现端到端的一致性 语义。 分为以下几个步骤:

1)开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面
2)预提交(preCommit)将内存中缓存的数据写入文件并关闭
3)正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据 会有一些延迟
4)丢弃(abort)丢弃临时文件
5)若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删除预提交的数据。

如果下级存储不支持事务:
具体实现是幂等写入,需要下级存储具有幂等性写入特性。

附录:Chandy-Lamport算法

分布式快照(Flink 分布式数据流的轻量级异步快照)
每个进程记录的与自己相关的状态合并出全局状态

Chandy-Lamport算法基于如下前提:在每对进程pi、pj之间都存在两条单向的链路cij和cji,即对于pi来讲,cij是出边,cji是入边。链路的网络可靠,缓存无限大,并且先进先出,即链路上的消息会不重不漏地按序到达。
算法要达到如下的终极目标:

  1. 最终产生的快照必须保证一致性;
  2. 快照过程不能影响系统正常运行,更不能stop the world。

Initiating a Snapshot:

假设进程pi发起快照:

  1. pi记录自己的状态;
  2. pi通过所有出边链路cij向其他进程pj发送marker消息;
  3. pi通过所有入边链路cji开始监听所有流向自己的消息。

Propagating a Snapshot:

对于任意一个进程pj(包含发起快照的那个进程),考虑它的所有入边链路ckj。当在ckj上收到了marker消息时,有两种情况。
• 如果pj还没有记录自己的状态——

  1. pj记录自己的状态,并将ckj标记为空;
  2. pj通过所有出边链路向其他进程发送marker消息;
  3. 通过所有入边链路开始监听所有流向自己的消息。
    • 如果pj已经记录过自己的状态——
    记下入边链路上监听到的消息,直到收到marker消息为止。

Terminating a Snapshot:

若所有进程都成功地:
• 收到了marker消息;
• 记录下了自己的状态;
• 记录下了入边链路的状态(就是链路上的消息)
则快照成功,算法流程结束。然后就可以将所有这些状态传输到一个稳定的分布式存储中心,全局快照就产生了。

标签:状态,快照,Flink,pj,检查点,链路,一致性,端到
From: https://www.cnblogs.com/xieqisheng666/p/16963149.html

相关文章