大数据技术之Flink容错机制--检查点与保存点的比较(上)

#大数据技术之Flink–检查点与保存点的比较
在flink中有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。

检查点(checkPoint)

1.什么是检查点?

检查点就是将之前某个时间点的所有状态保存下来,做一份“存档”。
在遇到故障重启之后就可以从检查点中“读档”,恢复出之前的状态,这样就可以回到当时保存的一刻接着处理数据了。

2.检查点的保存?

1)检查点是周期性的触发保存
每隔一段时间检查点保存操作被触发,就把每个任务当前的状态复制一份,按照一定的逻辑结构放在一起持久化保存起来,就构成了检查点。
2)保存的时间点
在所有任务都恰好处理完一个相同的输入数据时 将他们的状态保存下来。这样既能避免除了状态之外的其他额外信息的存储,提高检查点保存效率;同时这样做的话一个数据要么就是被所有任务处理完要么就是没处理完,状态都没保存,相当于构建了一个事务。出现故障重启之后,故障时正在处理的数据全部都要被重新处理。
3)保存的具体流程
关键就是所有任务都处理完相同的输入数据。下面以一个图为例说明:

大数据技术之Flink容错机制--检查点与保存点的比较(上)_第1张图片

输入数据:“hello”,“world”,“hello”,“flink”...循环的
上图已经处理完3条数据“hello”,“world”,“hello”了,此时source源算子的偏移量为3,后面的sum算子处理完前三个数据之后,所有的任务都处理完了这前三个数据,我们可以把当前的状态保存成一个检查点,写入外部存储,存储的位置会在后面详细介绍。

3.从检查点恢复状态

在上图中,如果数据处理到第五个单词“hello”的时候,出现故障。此时source已经处理完5个数据,偏移量为5,Map任务也处理完5个数据,但是Sum任务在处理时发生故障,此时的状态并没有保存。
1)重启应用之后,所有任务的状态都会被清空,找到最近一次保存的检查点,从中读取出每个算子任务状态的快照分别填充到对应的状态中,这样flink内部所有任务的状态就恢复到了保存检查点的那一刻,也就是刚好处理完第三个数据“hello”的时候。
2)为了防止数据丢失,我们应该从保存检查点之后开始重新读取第4,5个数据,可以通过source任务向外部数据源重新提交偏移量来实现。
3)接下来就可以从最近一次检查点开始重新读取故障前未处理完的数据进行正常的数据处理了。首先重放4,5个数据,然后继续读取后面的数据。

4.检查点算法

1)Barrier
我们可以借鉴水位线的设计,在数据流中插入一个特殊的数据结构,专门用来标识触发检查点保存的时间点,我们称它为Barrier,barrier将一条流逻辑上分为两部分,barrier之前到来的数据导致状态的改变,都会被包含在当前分界线所表示的检查点中;在barrier之后的数据导致状态的更改,会包含在下一个检查点中。
2)分布式快照算法
flink使用基于Chandy-Lamport算法的“异步分界线快照”算法,当上游任务向多个下游发送barrier时,需要广播出去;当多个上游任务向同一个下游任务传递barrier时,需要在下游任务执行“分界线对齐”操作,也就是需要等到所有并行分区的barrier都到齐,才可以保存状态。

4.检查点配置

	 	//0.获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //1.启用检查点
        env.enableCheckpointing(1000);
        //2.检查点存储
        //配置存储检查点到jobManager堆内存
        env.getCheckpointConfig().setCheckpointStorage(new JobManagerCheckpointStorage());
        //配置存储检查点到文件系统
        env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("hdfs://namenode:40010/flink/checkpoints"));
        //3.检查点模式--Exactly_node 精确一次
        CheckpointConfig checkpointConfig = env.getCheckpointConfig();
        checkpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
        //4.设置最小间隔时间 500毫秒
        checkpointConfig.setMinPauseBetweenCheckpoints(500);
        //5.超时时间 1min
        checkpointConfig.setCheckpointTimeout(60000);
        //6.设置同时只能有一个检查点
        checkpointConfig.setMaxConcurrentCheckpoints(1);
        //7.开启检查点的外部持久化保存,作业取消后依然保留
        checkpointConfig.enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
        //8.启用不对齐的检查点保存方式
        checkpointConfig.enableUnalignedCheckpoints();
        //9.设置检查点存储,可以直接传入一个string,指定文件系统的路径
        checkpointConfig.setCheckpointStorage("hdfs://my/checkpoint/dir");

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