山东 网站备案,中国建设银行网站会员可以改名,wordpress建群站,怎样建设一个购物网站检查点和状态后端的区别 检查点 就是某个时间点下的所有算子的状态快照。这个时间点就是等所有任务将“同一个数据”处理完毕的时候。 状态后端#xff1a;是一个管理状态的组件#xff0c;还负责将本地状态#xff08;检查点#xff09;持久化到远程文件存储系统中。
分…检查点和状态后端的区别 检查点 就是某个时间点下的所有算子的状态快照。这个时间点就是等所有任务将“同一个数据”处理完毕的时候。 状态后端是一个管理状态的组件还负责将本地状态检查点持久化到远程文件存储系统中。
分类
(1) 基于内存的hashmap状态后端。性能高但是有内存资源耗尽的风险
(2) 基于rocksdb持久化存储的状态后端。适用于状态大窗口长的情况下因为会序列化和反序列化访问状态的性能会差点。
我们用就是rocksdb状态后端。
检查点的存储 jobManager的堆heap内存中 文件系统
具体实现接口
(1) 大状态持久化保FileSystemCheckpointStorage
(2) 性能考虑jobManagerCheckpintStorage
检查点的工作流程
保存source 算子的数据偏移量一般保存在hdfs外部文件存储
同时向数据流中插入一种特殊数据: 分界线当遇到keyby这种分区算子保存状态同时会将分界线以广播形式分发给下游并行的算子如果遇到sum这种会接收上游多个分区的分界线数据会进行分界线对齐详细来讲Sum算子接收两个不同的子任务的数据收到了第一子任务的分界线数据但是没收到第二个子任务的分界线数据这时候如果第二个子任务传来正常的数据需要正常处理的但是如果是第一个分界线已经到达的子任务再来数据就需要等待写入缓存只有第二子任务的分界线数据到达然后状态保存再做处理。
现在版本的flink已经支持不对齐的检查点会降低反压时候的checkpoint的执行时间不过需要保存分界线来之前的数据所以会增大单个checkpoint的大小。
然后故障重启后flink 会读取最近一次的checkpint中的状态使得各算子恢复到故障前最近一次保存成功的状态。同时source算子会重置数据偏移量重新消费一遍数据。
精准一次性保证就是不会重复消费数据也不会丢失数据。Flink 是通过检查点保证的。
输出端的精准一次如何保证 幂等写入无论执行多少次最终结果都一样如果写入redis 这种键值对存储数据重复写入对结果不影响。还有写入mysql 按主键更新数据。 还有就是事务写入将事务与检查点绑定在一起通过检查点是否成功来提交或者回滚事务。具体来说就是对不同的外部存储系统有两种实现方式 对于不支持事务的外部存储系统可通过预写日志的方式实现GenericWriteAheadSink就是将结果数据作为日志保存起来检查点保存后将日志也临时持久化存储一下等jobmanager收到所有任务成功checkpoint完成消息后再将结果数据批处理写入外部系统。缺陷数据写入外部系统时flink会确认保存成功的消息如果就在确认返回消息时发生故障时这时checkpoint都成功了但是数据也写入外部存储系统了且不支持事务所以等故障重启时会造成数据重复写入。对于支持事务外部存储系统可用两阶段提交two phase commit ; 2pc的方式twoPhaseCommitSinkFunction接口例如flinkKafkaProducer实现了这个接口可以真正保证精准一次。具体来说sink任务会在两种情况下开启一个新事务对外部存储系统1. 第一条数据来到2. 分界线数据来到。开启后所有的结果数据都会通过事务写入到这个外部系统虽然已经写入到外部存储但是以为事务的原因这些数据不可用也就是预提交的状态。当所有的算子的快照都保存好后jobmanger会发出确认完成的通知给sink任务这时候sink任务会正式提交事务。两阶段提交完成。假如任何时候发生故障可通过这个未提交的事务对已写入的数据进行回滚。