Flink之状态一致性

一、状态一致性分类

  • 最多一次(at most once)
    当故障发生,什么都不干,既不恢复丢失状态,也不重播丢失的数据。
  • 至少一次(at least once)
    所有事件都处理了,有的事件可能被处理多次
  • 精确一次(exactly once)
    所有事件仅仅被处理一次

二、端到端的状态一致性

(1)内部保证(checkpoint)
(2)source端(可重设数据的读取位置)
(3)sink端(从故障恢复时数据不会重复写入外部系统,比如幂等写入,事务写入)

事务写入的实现思想:构建的事务对应着checkpoint,等到checkpoint真正完成的时候,才把所有对应的结果写入sink中
实现方式有两种:预写日志,两阶段提交

1)预写日志
把结果数据先当成状态保存,然后在收到的checkpoint完成通知时一次性写入sink
DataStream API提供了一个模板类,GenericWriteAheadSink,来实现事务性sink
注意:checkpoint完成了,但是写入sink只有一半写入成功,则不能保证一致性

2)两阶段提交
i)每个checkpoint,sink任务会启动一个事务,并将接下来的所有接受的数据添加到事务里
ii)然后将这些数据写入外部sink系统,但不是提交,这次是预提交
iii)当收到checkpoint完成通知时,它才会正式提交事务,实现结果的真正写入
Flink提供了TwoPhaseCommitSinkFunction接口
注意:这种机制需要外部sink系统支持事务
Flink之状态一致性_第1张图片

三、kafka+Flink端到端状态一致性保证

  • 内部:利用checkpoint机制,把状态存盘,发生故障的时候可以恢复,保证内部的状态一致性
  • source:kafka consumer作为source,可以将偏移量保存下来,故障恢复时可以由连接器重置偏移量,重新消费数据,保证一致性
  • sink:kafka producer作为sink,采用两阶段提交sink,需要实现一个TwoPhaseCommitSinkFunction
    FlinkKafkaProducer011已实现了exactlyonce支持
   val pro: FlinkKafkaProducer011[String] = new FlinkKafkaProducer011[String]("test-topic", new SimpleStringSchema(), prop)
   dataStream.addSink(pro)

你可能感兴趣的:(大数据,flink)