Flink的Checkpoint机制是什么

这篇文章主要讲解了“Flink的Checkpoint机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flink的Checkpoint机制是什么”吧!

创新互联建站专注于中大型企业的成都网站制作、网站建设和网站改版、网站营销服务,追求商业策划与数据分析、创意艺术与技术开发的融合,累计客户1000+,服务满意度达97%。帮助广大客户顺利对接上互联网浪潮,准确优选出符合自己需要的互联网运用,我们将一直专注品牌网站制作和互联网程序开发,在前进的路上,与客户一起成长!

一、Checkpoint概念

Flink本身为了保证其高可用的特性,以及保证作用的Exactly Once的快速恢复,进而提供了一套强大的Checkpoint机制。

    Checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保 证应用流图状态的一致性。Flink的Checkpoint机制原理来自“Chandy-Lamport algorithm”算法(分布式快照)。

二、Checkpoint核心元素Barriers

    Flink分布式快照中的核心元素是 stream barriers。这些barriers将注入到数据流中,并与记录一起作为数据流的一部分流动。barriers从不超越记录,它们严格按照顺序排列。barriers将数据流中的记录分为进入当前快照的记录集和进入下一个快照的记录集。每个barriers都包含快照的ID,快照的记录已推送到快照的前面。屏障不会中断流的流动,因此非常轻便。来自不同快照的多个barriers可以同时出现在流中,这意味着各种快照可能同时发生。

    stream barriers被注入到流数据源的并行数据流中。快照n的barriers被注入的位置(我们称之为Sn)是流数据源中快照覆盖数据的位置。例如,在Apache Kafka中,这个位置是分区中最后一条记录的偏移量。这个位置的Sn被报告给checkpoint coordinator (Flink的JobManager)。

    这些barriers随后会顺流而下。当中间操作符从它的所有输入流接收到快照n的barriers时,它将快照n的barriers发送到它的所有输出流。一旦接收操作符(流DAG的末端)从其所有输入流接收到barrier n,它就向checkpoint coordinator 确认快照n。在所有接收确认了快照之后,就认为完成了快照。

Barriers对齐

    接收多个输入流的Operators需要在快照屏障上对齐输入流,下面是Flink官网的Barrier对齐流程图:


Flink的Checkpoint机制是什么

a.Operators一旦从传入流中接收到快照barriers n,就无法处理该流中的任何其他记录,直到它也从其他输入接收到barriers n为止。否则,它将混合属于快照n的记录和属于快照n + 1的记录。

b.报告barriers n的流被暂时搁置。从这些流接收的记录不会被处理,而是放入输入缓冲区中。

c.一旦最后一个流接收到barriers n,Operators将发出所有未决的传出记录,然后自身发出barriers n屏障。

d.之后,它将恢复处理所有输入流中的记录,处理输入缓冲中的记录,然后再处理流中的记录。

    当一个operator接收到所有上游发送的 checkpoint n barrier 向下游发送之前,会对状态进行一次快照,将offset state 等值保存起来,默认情况下是保存在JobManager的内存中,由于可能会比较大,可以存在状态后端中,生成中建议放hdfs;

    Operators在从输入流接收到所有快照barriers的时间点,以及向输出流发出barriers之前,对其状态进行快照。届时,将对进行barriers 之前的记录进行状态的所有更新,并且不应用依赖于应用barriers 后的记录进行的任何更新。由于快照的状态可能很大,因此将其存储在可配置state backend中。默认情况下,这是JobManager的内存,但对于生产用途,应配置分布式可靠存储(例如HDFS)。在存储状态之后,操作员确认检查点,将快照barriers发送到输出流中,然后继续。

三、Checkpoint设置

1.代码中一些相关配置

    默认checkpoint功能是disabled的,想要使用的时候需要先启用checkpoint开启之后,默认的checkPointMode是Exactly-once。下面是官网一些默认配置:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();// start a checkpoint every 1000 msenv.enableCheckpointing(1000);
// advanced options:
// set mode to exactly-once (this is the default)env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// checkpoints have to complete within one minute, or are discardedenv.getCheckpointConfig().setCheckpointTimeout(60000);
// make sure 500 ms of progress happen between checkpointsenv.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
// allow only one checkpoint to be in progress at the same timeenv.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
// enable externalized checkpoints which are retained after job cancellationenv.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// This determines if a task will be failed if an error occurs in the execution of the task’s checkpoint procedure.env.getCheckpointConfig().setFailOnCheckpointingErrors(true);

1).Checkpoint默认是是disabled,通过enableCheckpointing方法来开启;两种函数实现:

    enableCheckpointing(long interval),

   enableCheckpointing(long interval, CheckpointingMode mode);

    interval用于指定checkpoint的触发间隔(单位milliseconds);

   CheckpointingMode默认是CheckpointingMode.EXACTLY_ONCE,也可以指定为CheckpointingMode.AT_LEAST_ONCE。

2).也可以通过setCheckpointingMode方法设置CheckpointingMode;

3).checkpointTimeout 指定checkpoint执行的超时时间(单位milliseconds),超时没完成就会被abort掉;

4).minPauseBetweenCheckpoints 指定checkpoint coordinator上一个checkpoint完成之后最小等多久可以出发另一个checkpoint,当指定这个参数时,maxConcurrentCheckpoints的值为1;

5).maxConcurrentCheckpoints 指定运行中的checkpoint最多可以有多少个,当4)指定minPauseBetweenCheckpoints后,则其就不起作用了,需要将其设置为1;

6).enableExternalizedCheckpoints 指定开启checkpoints的外部持久化,但是在job失败的时候不会自动清理,需要自己手工清理state;

7).ExternalizedCheckpointCleanup 指定当job canceled的时候externalized checkpoint该如何清理,DELETE_ON_CANCELLATION的话,在job canceled的时候会自动删除externalized state,但是如果是FAILED的状态则会保留;RETAIN_ON_CANCELLATION则在job canceled的时候会保留externalized checkpoint state;

8).failOnCheckpointingErrors 指定在checkpoint发生异常的时候,是否应该fail该task,默认为true,如果设置为false,则task会拒绝checkpoint然后继续运行;

2.flink-conf.yaml中一些相关配置

#==============================================================================# Fault tolerance and checkpointing#==============================================================================
# The backend that will be used to store operator state checkpoints if# checkpointing is enabled.## Supported backends are 'jobmanager', 'filesystem', 'rocksdb', or the# .## state.backend: filesystem
# Directory for checkpoints filesystem, when using any of the default bundled# state backends.## state.checkpoints.dir: hdfs://namenode-host:port/flink-checkpoints
# Default target directory for savepoints, optional.## state.savepoints.dir: hdfs://namenode-host:port/flink-checkpoints
# Flag to enable/disable incremental checkpoints for backends that# support incremental checkpoints (like the RocksDB state backend). ## state.backend.incremental: false

1).state.backend用于指定checkpoint state存储后端,默认为none,state会保存在taskmanager的内存中,checkpoint会存储在JobManager的内存中;

state.backend的值可以是下面几种:

    jobmanager(MemoryStateBackend), 

    filesystem(FsStateBackend), 

    rocksdb(RocksDBStateBackend)

2).state.backend.async用于指定backend是否使用异步snapshot(默认为true),有些不支持async或者只支持async的state backend可能会忽略这个参数;

3).state.backend.fs.memory-threshold,默认为1024,用于指定存储于files的state大小阈值,如果小于该值则会存储在root checkpoint metadata file;

4).state.backend.incremental,默认为false,用于指定是否采用增量checkpoint,有些不支持增量checkpoint的backend会忽略该配置;

5).state.backend.local-recovery,默认为false,此选项配置此状态后端的本地恢复。默认情况下,本地恢复是不可用的。本地恢复目前只有键状态后端可用。目前,memorystateback不支持本地恢复,并忽略此选项;

6).state.checkpoints.dir,默认为none,用于指定checkpoint的data files和meta data存储的目录,该目录必须对所有参与的TaskManagers及JobManagers可见;

7).state.checkpoints.num-retained,默认为1,用于指定保留的已完成的checkpoints个数;

8).state.savepoints.dir,默认为none,保存点的默认目录。用于将保存点写入文件系统的状态后端(memorystate后端、fsstate后端、rocksdbstate后端);

9).taskmanager.state.local.root-dirs,默认为none;配置参数定义根目录,用于存储本地恢复的基于文件的状态。本地恢复目前只覆盖键状态后端。目前,memorystateback不支持本地恢复,并忽略此选项;

感谢各位的阅读,以上就是“Flink的Checkpoint机制是什么”的内容了,经过本文的学习后,相信大家对Flink的Checkpoint机制是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


名称栏目:Flink的Checkpoint机制是什么
文章位置:http://azwzsj.com/article/gpisoe.html