为什么需要checkpoint
有状态算子一些状态的保存是在内存中,当job出现异常或者某些算子有问题的时候,内存中就没有历史数据.要保证可以恢复之前的状态的话,就需要有checkpoint的存在.
checkpoint也依赖于可重新发送数据的数据源的配合,例如kafka.
checkpoint的执行过程
1 checkpoint coordinator向所有source节点发送trigger checkpoint,并注入checkpoint barrier
2 当task收到所有的checkpoint barrier之后(对齐),会执行snapshot,并向自己的下游发送checkpoint barrier,并将自己的状态异步的写入到持久化存储中.
3 当sink 的task完成备份,会把备份的地址 (state handle) 通知给checkpoint coordinator ,checkpoint coordinator会把自己的checkpoint meta数据发送到外围的持久化系统中,完成一次完成的checkpoint
checkpoint的基本配置
这里的配置是指checkpoint coordinator多久向source节点发送trigger checkpoint 以及注入checkpoint barrier事件
//默认是500ms
StreamExecutionEnvironment enableCheckpoint()
//自定义触发周期
StreamExecutionEnvironment enableCheckpoint(long interval)
//指定checkpoint的模式 EXACTLY_ONCE,AT_LEAST_ONCE
StreamExecutionEnvironment enableCheckpoint(long interval ,CheckpointMode mode)
checkpoint的高级配置
//默认是EXACTLY_ONCE
env.getCheckpointConfig().setCheckpointMode(CheckpointingMode.AT_LEAST_ONCE)
//修改checkpoint间隔
env.getCheckpointConfig().setCheckpointInterval(60000)
//设置checkpoint的timeout,默认10分钟,如果超时,本次checkpoint终止
env.getCheckpointConfig().setCheckpointTimeout(60000)
//设置checkpoint的并行度
//如果设置为n,则n个线程同时进行checkpoint,其中只要有一个线程写入成功,才会进行下一个checkpoint
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
//如果设置的并发度为1的时候,使用此设置可提高效率
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(60000);
//ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION
//当cancel时,会保留checkpoint数据以便回复
//ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION
//当cancel时,会删除checkpoint数据,只有当job执行失败时才会保存checkpoint数据
env.getCheckpointConfig().enableExternalizedCheckpoints(Externalized-CheckpointCleanup.RETAIN_ON_CANCELLATION);
checkpoint的有些配置是设置在fink-conf.yaml中配置
其中的state.checkpoint.num-retained是设置checkpoint的保存个数.默认是只保留最近一个的checkpoint
state.checkpoints.num-retained:20
state.backend: filesystem
state.checkpoints.dir: hdfs://master:9000/flink/checkpoint
当从某个checkpoint开始恢复程序的话,就要指定
bin/flink run -s hdfs://master:9000/flink/checkpoint/3231asjda23/chk-56/_metadata flink-job.jar