微信公众号:大数据开发运维架构
关注可了解更多大数据相关的资讯。问题或建议,请公众号留言;
如果您觉得“大数据开发运维架构”对你有帮助,欢迎转发朋友圈
从微信公众号拷贝过来,格式有些错乱,建议直接去公众号阅读
一、Checkpoint概念
上篇文章我们已经讲了Flink的状态管理,对于这些状态如何保存,我们一起学习一下Flink的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对齐流程图:
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 ms
env.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 discarded
env.getCheckpointConfig().setCheckpointTimeout(60000);
// make sure 500 ms of progress happen between checkpoints
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
// allow only one checkpoint to be in progress at the same time
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
// enable externalized checkpoints which are retained after job cancellation
env.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
# <class-name-of-factory>.
#
# 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机制介绍完毕,感谢关注!!!
如果觉得我的文章能帮到您,请关注微信公众号“大数据开发运维架构”,并转发朋友圈,谢谢支持!!!