00:00
然后接下来我们来看一下一个具体的例子,就是从检查点里边到底是怎么样去恢复状态,前面我们已经知道了,怎么样保存啊,就是当前所有的任务都处理完同一个数据之后,那个状态保存下来,我们就接着前面这个例子,这个检查点保存的是569对吧,然后接下来继续往后走。接下来是不是继续读取数据啊,六跟七继续进来,大家看现在处理的这个状态,六是不是已经正常叠加进来了,之前我的那个状态不是上面这个是六吗?现在变12,那大家知道是不是把六偶数求和叠加在这个sum基础上了,而大家看读完七这个数据之后。七还在路上的时候,萨奥的奇数求和这里直接挂掉了。那如果挂掉之后,接下来怎么办呢?哦,接下来那很简单嘛,既然已经挂掉了的话,接下来我是不是需要重新启动应用,然后从检查点里边加载状态啊,恢复之前的状态对吧?那中间这段时间做的操作,你既然没保存吧,那是不是中间这段我就先丢掉了啊,就相当于我要恢复之前的状态啊,所以首先第一步是重启应用。
01:13
当然了,这里边我们是把所有的这个任务全部重启了,大家也知道,就是1.9之后,我们那个配置项不是有区域重启的那个,呃,那个选项嘛,对吧,就可以分析判断啊,不受影响的那些,呃,那些任务就可以继续继续做,该怎么做继续做,我只把受影响相关的那些任务重启就可以了。那重启之后,大家知道这里面的状态是不是一开始应该没有啊。大家知道就是状态,比方说k state,我们可以设初始值,你如果设初始值的话,那里面应该是那个初始值对吧?如果没设的话,是不是当前状态是none啊?还记得之前我们那个kind state吧,定义的时候可以在那个script后面不是给一个初始值吗?那现在大家看它啥都没有,那是不是相当于没设初始事时都是闹啊,所以这个是正常的啊,重新启动之后都是这样的一个状态。
02:03
然后接下来怎么办呢?啊,接下来当然是从之前保存的那个check point里边读取数据,是不是恢复状态,因为job manager是知道当前的这个拓结构的,那我就找到SS任务对应的那个状态是五,我是不是把那个五解析出来填到填在这儿啊。哎,如果是六填在这儿,九填在这儿,另外大家其实还知道,如果我出现并行度调整的那种情况的话,我是不是还可以把当时保存的那个状态再做一个拆分合并啊,呃,之前那个list拆方器的大家还记得吗?对吧?它是有这样的一个过程的啊,就是k state,其实也有这个过程,只不过因为它已经已经是按照K分散开的嘛,就底层会帮我们直接做这件事,我们就不用去关心了,如果是我们定义那个算子状态operator state的话,那需要去自己定义出这个过程来啊,所以我从那个里边直接把它恢复出来啊,大家还记得那个有一个方法叫restore state,对吧?啊,从当前的那个状态里面去恢复我们那个变量啊。
03:07
那现在如果我把这个状态都恢复之后,另外还需要有一个操作就是。诶,大家看是不是这是跟我们的SS任务相关了,因为前面这里是不是六和七都已经都已经读取完消费完了呀,那你现在如果要想恢复到跟之前一模一样的话,那大家想之前我这个状态是处理完五之后的状态啊,那六和七是不是还应该重放一遍啊,你如果这里还是八和九的话,那我相当于中间六和七就丢了嘛,这个最后结果就不对了,所以这里有一个要求,就是SS任务要按照自己当前保存的那个偏移量去做一个重新提交重置偏移量,然后重新从之前这个六和七接下来开始读取数据,对吧。这就是为什么我们说SS任务这里面也需要有一个状态,它要保存现在的偏移量,不保存的话丢数了吧。然后接下来那是不是就是继续正常的去消费,就是发生故障之前的那些数据,六和七是不是正常读取啊,哎,现在的话不发生意外的话,那就六叠加七也叠加变成十二十六,再往后那是不是就跟之前我们就是发生故障的那个那个时刻状态就一样了,后边的那个八和九就继续往后处理就完事了,对吧。
04:23
这就是恢复状态,然后呃去做这个处理的过程,大家看我们通过这样一个状态一致性检查点,它就保证了。我们应用状态内部的精确一次的一个状态一致性,什么叫精确一次呢?这个概念英文叫做exactly one,大家从字面上就能看到,它其实说的就是就是刚好一次exactly嘛,对吧?呃,有时候也翻译成就是恰好一次,就是说我们当前所有的数据啊,本来这里边来了的数据,我后边的任务呢,处理一次,而且只处理一次,对吧?哎,大家看是不是最后我这个状态结果里边啊,我说的是状态一致性啊,所以大家看这个偶数求和12是不是前面到目前为止是截止到七之前的,对吧?七之前的所有偶数246加起来是不是12。
05:20
是不是加了一次,而且只加了一次没有问题对吧?那那奇数求和七之前1357,那是不是都是16啊,加起来16对吧,加一次,而且只加一次数据没有丢,也没有重复加。大家发现这这就是保证我们最后结果是正确的,对吧,这就是所谓的这个状态一致性啊,啊,因为你如果要是在具体的这个项目应用当中,这个就是比较明显啊,比方说我们要做的这个计算就是一个比方说统计啊,这个一周之内或者一个月之内的销量,呃,销售额啊,我们是算那个钱的,那大家可能会想到这里边一个订单啊,这里面可能来的数据是一笔一笔订单对不对,一个订单的那个销售额那个那个数值可能就很大,那你想你发生故障之后,如果这个数据。
06:08
直接丢掉的话,对我们最后的结果是不是影响可能很大呀,前面我们如果做count的话,这个无所谓,但是你如果做这个求和啊,这个可能影响就比较大了啊,那另外如果说你这个数如果要是没丢,但是呢,我重放之后是重新加了一次。大家想那是不是就会引发的这个结果也是结果不正确啊,加两次对吧,哎,这这个就是这都是最终没有实现精确一次,而我们这里边用checkpoint实现了最终结果的精确一次。
我来说两句