00:00
介绍完了检查点,那接下来呢,我们再来扩展去讲解一下另外一个跟检查点非常类似的进行状态快照保存的功能,那就是所谓的保存点c point啊那关于保存点其实我们并不陌生,在一开始我们去进行作业提交的时候,在web UI上啊,就看到有一个选项可以指定当前对应的保存点路径啊,那这又是一个什么样的功能呢?啊,其实我们看到从名称上就能看出来啊,保存点就是要做一个快照保存吧啊,所以它的功能其实整体来讲啊,跟检查点可以说是基本上一样,也是一个存盘备份。只不过呢,可能会多一些额外的原数据,那它跟检查点的区别到底在哪里呢?主要就是之前我们说检查点那是做了一个自动存盘周期性的,每隔一段时间就直接做一个存盘保存,发生故障之后自动的就去获取之前最近一次保存好的检查点去进行状态恢复,而保存点呢,保存点它的触发时机不是自动周期性触发的,而是。
01:13
手动进行保存,诶,所以往往就是我们涉及到一些重要的节点的时候啊,就像我们这个打游戏的时候,在打boss之前,诶,这个时候比较重要我们手动的把它保存一下啊,那往往就是我们在作业或者说应用啊,运行到某个特定时间点的时候,可能我们要做这样的一个保存。就是因为这样一个自动存盘和手动存盘的区别,哎,那么保存点它的用途跟检查点就完全不一样了,前面我们说检查点主要就是用来做自动故障恢复的,这是我们整个flink容错机制的核心,而保存点呢,因为它是手动存盘,所以它其实更加灵活。可以作为一个非常强大的运维工具来使用啊,这个就比较有趣啊,啊,当然首先这个保存点也可以做故障恢复啊,就是我们可以在设置这个容错机制的时候啊,去指定啊,我们可以假如说发生故障之后有一个临近的保存点的话,我们也可以去从保存点去做一个自动的恢复,这个也是完全可以把它当成一种特殊的检查点。
02:18
那另外呢,它还可以有非常多的应用场景,比如说我们可以做版本的管理和归档。这就是前面我们所说的啊啊,在打boss之前专门去做一个存档啊,对于针对一些比较重要的时间节点,单独的做一个手动备份,设置成某一个归档的版本。哎,那另外呢,我们还可以去基于它更新flink的版本,因为目前我们整个flink的底层架构已经非常稳定了,如果flink版本升级了,诶,我们现在用01:13,如果想要升级到01:14的话,其实我们没有必要去把之前的flink应用啊,我们写的代码重新写一遍,然后重新提交。
03:02
因为只要我们的代码核心逻辑没有变的话,哎,我们对于这个每一个算子,它的拓扑结构啊,先发生什么,后发生什么,以及里边每一个算子里边我们定义的那些状态,如果这些结构都是一致的话。这就完全可以迁移,哎,所以出现这种情况的时候,如果我们要升级flink版本怎么变啊,那当前的代码都不用改,只是需要我们先把当前的作业啊,先创建一个保存点,做一个手动存盘。然后接下来呢,就可以直接把这个作业停掉了。停掉之后,诶,那我们更新link的版本,换一个link集群,直接把它起提起来,然后从对应的保存点里去重启应用,把之前的状态都读出来恢复就可以了,所以这个过程我们会发现啊,就可以接着之前处理的那个所有的数据继续进行处理了,可能就只是一次暂停和重启的时间间隔,整个耽误的时间啊,这个实时性的影响其实是非常小的。
04:08
好,那除了更新flink版本之外,我们还可以对应的更新flink应用程序啊,之前我们说的是flink本身代码啊,这个程序不变,那假如说我们想要去修改代码,想要去修复一些bug,这个怎么办呢?诶,当然。我们能想到这个就肯定要停止整个作业啊,把这个代码要重构之后,重新打包,重新提交,这个肯定是没有问题的,但这里面有一个问题,就是说如果在重新开始去执行从头的那个操作的话,那相当于我们之前所有的数据还得重新处理一遍啊,那有时候往往我们更新这个应用程序的时候呢,核心的代码逻辑可能是不发生改变的,可能就是修复了一点小小的bug,那这种情况下。我们整个的处理逻辑以及状态的定义。状态。它的数据结构是什么样的,可能都没有更改,那这种情况下呢,完全就可以把之前的状态。
05:06
保存成一个保存点存盘。然后停掉应用。更新代码重新提交,然后从之前保存的这个保存点去恢复状态,就可以继续使用,所以这个过程其实跟更新link的过程也是完全一样的。啊,那除了这些更新的一些操作之外呢,另外还可以就是哎调整资源,调整并行度,如果说我们跑着跑着发现诶当前资源资源不够用了,我们可能需要把这个并行度调大,诶那这个时候怎么办呢?创建一个保存点,停掉应用,然后从保存点重启啊这样的话就实现了一个资源的扩展。另外还有一种应用场景,诶,那就是有时候呢,诶,可能我们也不是做各种各样的这种更新,或者说调整并行度,单纯的就是就是想把某一个应用先停掉啊,因为有可能现在这个应用啊,完全就没有数据到来,我们一直在等着它,还耗费系统资源,我们就想先释放一些资源去做更加重要的事情,那这个时候完全就可以把它先暂停,等到。
06:16
其他的这个重要的事情都做完了,然后再恢复当前的应用,再追上之前的进度就可以了,这些功能全部可以用保存点来进行实现。这里需要强调的一点就是在这个过程当中啊,啊,无论是更新应用程序,还是说调整并行度,还是说暂停重启,还是说更新flink的版本,这个关键能这么做的关键都在于我们去保存所有算子状态的时候,它的拓扑结构是不发生变化,这样的话,我们前后更新前后程序才是兼容的,哎,那所以如果说。我们当前的处理流程里边,别的都没有变。之前所有的步骤都没有变,但是呢,某两步之间现在追加了一个map操作,多做了一步转换,诶,那这样的话,我们整个这个程序处理的拓扑结构就变了,即使是其他的算子都没有发生改变啊,处理逻辑和状态的定义都是完全一样的,那这个时候我们也不能正确的恢复了。
07:18
诶,那我们就发现这种情况其实不太合适啊,就别的都没变,我只是新增了一个中间转换的处理啊,多加了一个map而已,那它其实本身也没有状态,那这种情况能不能直接从保存点恢复出来呢?啊其实也是可以的。这就需要我们手动的去指定之前有状态算子所有的ID到底是什么,单独的指定一个编号,那这样的话就相当于是一个K一个value,一个K一个value对应起来了,如果说我们之前不指定的话,Flink底层会默认给每一个算子设置一个ID啊,那它是自动生成的,那这个就不靠谱嘛,所以增加一个之后就有可能发生改变,所以为了实现这种灵活的应用升级,哎,那我们最好在代码当中去对每一个算子设置一个。
08:08
ID啊,那它的设置方式其实也非常简单啊,直接调用一个UID方法就可以了啊,那里边呢,给定的就是一个ID,其实就是一个字符串了,给个名称就可以指定当前这个算子是什么了,我们对应保存的那些状态,哎,这就一一对应上,不会搞错了。那设置了这些UID之后呢?呃,使用保存点的过程其实也非常的简单,主要就是用flink给我们提供的命令行工具去创建一个保存点,然后再从保存点去启动就可以了啊,那创建的时候这个命令就叫做flink,然后后边跟上save point啊,当然了,我们可以加上一个当前的作业ID,指定到底是。哪一个作业要去做镜像保存啊,那后面还有一个可选项,就是指定保存的目标路径。
09:02
如果这里不指定的话,默认使用的也是集群配置文件啊,Link com.ya里边的state c points.d啊,之前我们说那个默认的检查点的保存路径不是state.checkpoints.DR吗?这里只是变了一个单词而已。同样的啊,我们也可以针对单独的作业,在代码当中利用烟为当前的执行环境去调一个方法,Set default c point DR,调用这个方法去指定当前作业特定的一个。保存点存储路径啊,这这样的话就设置了我们当前这个保存点到底应该放到哪儿,然后创建了这样一个保存点之后,如果之后又要重启这个应用恢复状态的话,诶,那怎么样做呢。当然就是在web UI提交的时候,加上对应的那个c point参数啊,指定对应的路径就可以了啊,那我们也可以在命令行里边flink wrong后面加一个杠S参数,把对应的保存点的路径填在后边,从保存点读取状态去恢复就可以重新启动了。那另外还有一种创建保存点的方法呢,是在停掉作业的时候。
10:17
同时直接创建一个保存点啊,这样的话就省得我们单独先做一个保存点的保存,然后再去停当前作业了啊,那就是直接flink stop,后边跟上一个杠杠c point pass,然后指定。保存的路径,就可以在停掉作业的同时创建一个当前状态的保存点,然后接下来同样可以从这个保存点去重启应用link,提交作业,恢复之前的状态,继续进行处理啊,这就是关于保存点的用法。
我来说两句