00:00
接下来呢,我们要给大家讲一讲在具体项目当中,代码里边做的一些配置啊,就因为关于这个检查点大家会发现,呃,我们刚之前讲到的其实都是它的一些原理性的东西,那你像我们具体使用的过程当中,在这个代码里边,诶,难道难道说它它自动就有这样的一个检查点去保存了吗?好像我们没有看到任何的保存啊啊,所以这个大家要稍微注意一下啊,在代码里边,我们如果要想要开启这个检查点的话,那是需要在代码里面直接去做配置的。啊,就是默认情况下,其实检查点是不开启的,因为大家知道不管怎么样,你即使是异步,即使我们用那个分布式快照啊,基于昌低兰波特算法的这个分布式快照,它最终也是会影响一下我们的这个执行任务的性能,对吧?啊你如果要快的话,那其实啊,它这个多多少少还是受到一些影响的,所以这里边默认是不开启,你如果要开启那就得去做配置,所以接下来我们再。这个代码里边,呃,就还是放到跟这个状态相关吧,因为当前是跟这个,呃,容错这里边都是相关的,对吧?之前我们是已经做过了一个状态后端的配置,那接下来呢,我们来做一些检查点的配置。
01:19
检查点配置,呃,然后这里面首先我们就得知道是不是可以启动当前的这个检查检查点的这个操作啊,对吧?啊,这个大家看到就叫做enable checkpointing,如果要是你没有把它手动启动的话啊,我们当前的这个代码提交之后,它其实是没有拆跑你的,对吧,默认是没有的。大家看到这个方法其实已经被弃用了,是吧,它其实推荐的是什么呢?推荐的是里边你要直接调用一个方法。大家看这里边调用的时候啊,就是。Enable对吧,Enable checkpoint,然后里边呢,至少要传一个参数,当然也可以传多个参数啊,这一个参数其实就是一个时间间隔,大家知道这个时间间隔代表的就是周期性的去触发checkpoint的检查点保存啊,那所以这里边是不是就是一个时间间隔长整形的一个毫秒数啊啊,所以大家可以去做这样的一个设置啊,当然刚才大家通过这样一一个一个一个这个调用的时候,其实已经看到源码里边了,你如果不设的话,默认是多少啊。
02:30
500毫秒做一次checkpoint对吧?啊,你这里边可以去手动设置啊,这个都是没有问题的,所以在这里边我可以直接给一个比方说我觉得这个500毫秒时间,时间这个太长了,我我想让他这个做的再快一点,对吧,比方说我给一个300毫秒,这也完全可以,对不对,那另外后面大家看到还有另一个参数可选的参数啊。是不是可以给一个。Checkpointing mode啊,什么叫做checkpointing mode呢?哎,这个mode其实这是一个枚举类型,然后里边可以选择的这个东西呢,大家看exactly one。
03:10
At least once,这就是所谓的状态一致性的级别对吧?呃,这里边可以设置这个你到底是精确一次还是这个at least ones叫做至少一次对吧?至少一次的概念其实就是我要处理这个数据,是不是至少处理一次啊,那意思就是说是不是也有可能处理多次啊,所以它就不如那个精确一次的这个一致性的级别高,对吧?所以这里边你可以去对应的做一些配置啊,但是这个后边后边的这个checkpoint mode也不是必须的啊啊,那另外就是说我也可以怎么样呢?可以在这个enable之后还可以做一些其他的配置选项的定义。这里面比方说我们给一些这个高级选项啊。呃,首先就是这里边你要做这个checkpoint的配置的话,必须首先是要env get checkpoint config,然后就可以做一些设置了。
04:08
Set对吧?哎,那首先这里面大家看到这里边有两个是大家已经知道的,就最下面这两个啊,一个叫做set checkpoint inter,这是不是就是设置它的那个时间间隔啊,上面是不是我们这个enable时候已经设过了啊,所以这个可以不设啊,另外还有一个是set checkpoint mode,这是不是也是我们可以在上面直接入射啊。或者你在下边这里单独设一次也是没问题的,这里要传的是一个checkpoint mode,比方说我用这个exactly ones对吧?啊,你可以做这样一个一致性级别的选择,当前的这个模式的选择啊,检查点模式的选择,那另外除了这个基本的配置之外啊,这个其实不算高级配置啊,我们再看一下其他还可以有什么,另外还有set checkpoint checkpoint timeout。一个长整型的时间时间段对吧,时间间隔,那这个是不是就是一个超时时间啊,所谓的超时时间指的就是。
05:09
我当前这个checkpoint,大家想如果说这个保存太耗时间的话,有可能是什么问题啊。是不是可能不是我们这里面检查点的这个状态的问题,是不是有可能是我们那个远程状态后端对吧,比方说那个那边文件系统存满了对吧,磁盘存满了,或者是其他的一些状态网络连接有问题,是不是有可能是这些问题啊啊所以在这种情况下就是一定要设置一个超时时间,因为我们默认情况下是不是应该是同步执行checkpoint的呀。你如果这里边一直等待,一直等待,那是不是相当于把我们当前的任务任务阻塞住了,对吧?别的任务是可以并行的,但是当前任务它就一直处理不了了,所以我们要设置一个超市时间,比方说我这里给一个,大家看给个6万,那是说明超市时间是什么,一分钟对吧?啊,一分钟内必须完成,否则的话就把它丢掉,然后后边还可以get checkpoint,然后去set,大家看下边还有set啊,首先我们看这个max concurrent checkpoint,这个是什么意思呢?
06:15
当前的max concurrent checkpoint,这说的是最大的同时,Conrr,就是同时,对吧,同时进行的checkpoint。哎,那有同学可能会觉得奇怪,这个比方说我给一个二,它这个拆包,它还可以同时进行吗?大家注意这个同时进行,不是说我这里面同一个任务同时做两个checkpoint的保存,这不可能对吧,因为它是流式的嘛,一个来一个处理一个,那我们这里说的是什么呢?是不是有可能。大家想前一个checkpoint还没保存完,但是下一个checkpoint又开始触发,又开始去做操作了,有没有这种可能?大家想是不是有这种可能啊,因为我当前拆point是不是当前这是一个分布式的快照吗?所以我前面的那个触发的话,他只要招manager给S任务发起这样的一个指令就可以了,那S任务那边是不是很快就保存完了,但是后边马上就能保存完吗?这没准对吧,有可能后面还在处理数据呢,数据没处理完还还没等到be对齐呢,也有可能保存的时候又要因为状态太大了,保存要好长时间,等到所有的任务都保存完之后,那是不是这个拆point你的真正完成要可能要很。
07:31
就是隔很长时间也不一定很长啊,就是要隔一段时间之后才能够保证这个checkpoint正式完成啊,诶那这就会有问题,假如说这个checkpoint做的时间,你像这个超时时间不是6万吗?对吧。那大家看它是不是比这个间隔要大多了呀。那有可能是不是就是前一个checkpoint还没做完呢,也没超时呢,那是不是下个下个checkpoint就应该要出发呀,诶所以这里边你可以去做一个设置啊,就是说我最大允许现在同时在保存的有同时在在已经开启的对吧,执行的有几个checkpoint,那大家想如果这里边我设成一的话。
08:12
是不是就相当于?对,当前默认就是一对吧,就是默认我当前只能有正在处理的一个拆框,前一个保存完了,你再开始存下一个时间点的那个存盘,对吧?那你想你前一个都没存完,你下一个就又开始触发,你这不是浪费吗?对吧?我把钱一个存完了之后再去做,这是一个想法啊,当然你也可以给一个大一点的数,那就相当于可以并行,呃,这这个并行是同时有两个checkpoint的那个ID对应的那个barrier进来了,对吧?至于说这个be传递到哪,这个是没准的啊。然后接下来我们继续往后看,还有一个配置项,这个叫与之对应的啊,叫mean POS between check points,这个又是什么意思呢?大家看里边传的又是一个长整形对吧?长整形的话,那就应该是一个又是一个时间了啊啊比方说这里边我给一个100。
09:05
大家想一下,这样的一个时间又代表什么意思呢?它说的是最小的pose,就是间歇,呃,时间间隔对吧,类似于这个暂停嘛,最小的间歇时间在两个checkpoint之间。这是什么意思呢?之前我们不是说了隔300毫秒触发一次checkpoint吗?那它的间隔时间不就是300吗?哎,这里大家理解一下啊,这个所谓的between,它并不是触发时间点的那个时间间隔,而指的是什么呢?来给大家画一下啊,当前我们的数据流数据啊,一个一个来,比方说我在这里触发这里有一个barrier,这是不是要触发一次这个checkpoint的操作啊,那大家想到这个barrier在在做这个呃,Checkpoint的检查点保存的时候,它是不是有可能要占据一段时间啊。
10:01
大家想到是不是它要占据一段时间去保存,对吧,这个是可以想到的啊,然后比方说我隔300毫秒,是不是后面又有一次这个拆方的保存啊,对吧,隔300毫秒一次嘛,所以大家知道当前的这个时间段,这个叫做checkpoint interval,这是我们定义的300毫秒。那大家想一下,我这里面定义的这个100指的是什么呢?就是正常来讲,我这儿再来一个这个拆point,是不是接下来又可以保存一次了,大家看它俩之间是不是有一段暂歇的这个时间啊,所以这里边的这个最小暂歇时间,最小的这个暂停时间指的就是说两次checkpoint的前一次checkpoint保存完成结束到下一次checkpoint触发开始,这之间的这个时间不能小于多少。如果说我这里设置了这个,呃,这个100的话,大家看,假如说啊,我当前的这个拆的保存就用了250毫秒。
11:06
250毫秒。那你说按照我这个配置,下一个拆你从这儿。直接到这个300毫秒之后就可以出发这一次了吗。注意不行对吧,当前还不能直接触发它的这个保存,而是必须当前的这个时间间隔是不是要达到100毫秒最小的这个时间间隔。接下来才能去做下一次的这个保存啊。所以大家看这个配置项是不是就相当于限制了checkpoint之间必须留下一段空闲时间,大家知道这个时间是要用来干什么。我是不是得正常处理数据啊,啊,因为你假如说这里边是同步做拆po的话,每一次做完之后,我马上下一次就又来了,那中间你还有时间给我处理数据吗?对吧,那一直在等着啊,一直在做checkpoint了,所以他至少要留出一段时间来,他主要是要保证这个。
12:00
啊,所以呢,大家会发现这个数据是不是相当于可以覆盖掉上一个的配置啊。如果说我这里面设置了这一个最小的间隔时间,那你说我同时同时在做的这个checkpoint能有几个?是不是只能有一个?我是不是必须一个结束了之后,而且还要等一段时间才能开启下一个啊,哎,所以这就是这个对应的这些配置的一些要求啊,那当然正常情况下啊,就假如说我这个做拆point的时候,你比方说这儿啊啊这儿这儿这个隔着可能又又不够100毫秒了,对吧,那下一次是不是也必须要隔100毫秒之后才能做这个触发呀,对吧,这又是100毫秒,然后比方说下一个这个拆棒里头我做的很快啊,一下就刚好一下就就保存了。那大家想下一次这又是300毫秒之后,对吧。就是大家看我的这个这个时间点啊,本来bar瑞尔来的那个时间点应该是300毫秒一次啊,正常来讲那个时间间隔300毫秒一次,那大家会看到,如果说这个时候我这儿已经空开了这个100毫秒的这个最小间隔了。
13:08
那是不是接下来我就可以等到满足300毫秒时间间隔的这个这个点上,再去触发下一次的那个checkpoint呀,哎,所以大家看到就是中间我不一定一定要隔100毫秒,为什么叫最小间隔呢。是不是就是就是如果小于100毫秒的话就不行了,我必须把它拉大到100,那至于说你有空空下的那个时间的话,那没关系,对吧,控制就控制,我还是按照300毫秒触发一次,那那个来就完事了啊,这是这个啊,这个概念啊,大家可以下来之后自己再稍微的比划比划,琢磨琢磨,就知道这个到底是什么含义了啊,那另外还有一些可能不是特别常见的一些配置项啊,大家看到就还有就是set prefer checkpoint for recovery,这是什么意思呢?大家看一下这里边它的含义是传一个传一个布尔类型的指出false对吧,那这里面的这个含义就是说大家看它叫做prefer checkpoint for recovery对吧。
14:10
意思就是我更倾向于偏向于用检查点来做当前的这个保存,哎,那这是啥意思呢。那你不用,呃做做这个恢复对吧,做状态的恢复,那难道还有不用检查点做恢复的吗。呃,还真有,因为我们还有手动的存盘点save point对不对啊,所以它的含义主要就是说你看上面注释啊,就是如果你设置这个是true的话,那就是我这里边呢,就要倾向于用一个检查点来做恢复,而不是用。更近的更接近的一个save point啊,所以这个含义意思就是说,本来默认情况下,大家知道这个应该是false对吧?False意思的话就是我不管检查点还是c point,我不管是呃这个手动存盘还是自动存盘,只要发生故障之后,我就找最近的离当前最近的那一次存盘点去恢复,对吧?那大家想是不是如果这个保存点c point更近,是不是应该从它来恢复啊,那你这儿如果要是单独设置了一个处的话,那就是即使c point更近我也不用,我就是要用checkpoint对吧,我只用它来做恢复c point,可能我有有别的功能啊。
15:27
啊,当然这个也也不常用对吧,你说谁那么奇怪呢,就就非要不让用那个c po的对吧,如果更近的话,当然用它更好嘛,所以这里边你如果要是默认是处啊,呃,默认是false啊,你如果想设成处也是可以的。啊,另外还有一个最后一个啊,大家看这个叫做tolerable checkpoint failure number,大家想这个按照字面意思就非常好理解了,它指的就是允许容忍checkpoint失败多少次,对吧?诶大家想一下这个什么叫容忍失败多少次呢?
16:03
就是说如果我这里边checkpoint保存的过程当中挂了。那大家想这个算是我们当前任务挂了吗?诶,这就是另外一个问题了,对吧,正常处理的时候任务挂了的话,那我们应该要重启,那你要保存任务,任务是正常执行的,保存这个检查点的时候挂了,这个算是任务挂了吗。啊,默认情况下,大家注意啊,默认的这个number是零零的话,那就是是不是就是不容忍啊不容忍,呃,这个拆point失败,那就是拆point挂了,也代表当前任务挂了对吧?啊就整个就都要重启了,那如果说你容忍的话,可以设置一个容忍的次数,对吧?呃,你随便给一个想要的那个次数,直接放到这儿都是没问题的。好,这就是关于呃,我们这里边检查点的一些基本的配置,然后关于容错这一部分呢,除了检查点的配置,大家其实想到了我这里边是不是还应该有一个重启策略的配置啊,重启策略配置,所谓的重重启策略就是说这里面检查点已经保存了之后,那我们发生故障的时候,当然就是要从这个检查点里面去读取数据,要要恢复出来了,但是大家想到有时候我们可能当前的这个故障呢,它不是马上就能就能解决掉的,因为我们现在一旦发生故障,是不是它就应该要自动去尝试重启啊,呃,排除那些异常的那种情况,对吧,我就直接就自动重启就完事儿了,这个就呃相当于免维护嘛,你自己就可以搞定,但是有时候发生故障,你可能不是马上就能排查掉,马上就能搞定的,那这个时候我是不是就要给一些策略啊啊,你可能在一段时间内尝试去启动几次对吧,然后可能每一次重启之间再隔一段时间啊,你不要说马上重启完了。
17:48
之后就马上又去重启,那肯定故障还没排查完嘛,所以这里面我们可以指定一些重启策略,指定重启策略的时候也是en取set,大家看有一个之前我们也见过了啊set。
18:03
Restart strateg,这就是设置重重启策略对吧?里面要传的呢,就是一个restart,大家看strategies,这是一个枚举类型,呃,这这个大家看到本身这是一个class啊,不是枚举类型,里边它有对应的那些方法,就表示当前到底是什么样的一个重启策略的配置,对吧?这里边我们关键就是这边要传的这个参数啊,是一个restart strategies里边的AR strateg的配置对吧?Configuration重启策略配置,所以这里边看一下有哪些方法。大家看有一个failure rate restart,然后还有fallback restart,还有fixed delay restart,最后还有一个no restart no restart,那就是不重启对吧?啊,这个最简单啊,然后那个fallback restart呢,这个就是就是回滚,回滚重启,这这意思就是说我当前不做重启策略的一个定定义,把这个选择权交给谁了呢?交给上级的那些资源管理平台,对吧?假如说我是基于这个雅安有容器的话啊,基于这个,呃,K8S docker的话,那就是它那边怎么重启,我这边就怎么重启,对吧?啊,那这两个我们就都不说了,主要要给大家说的就是有这样的两个选项,一个叫做fixed delay restart,这个是一个翻译过来就是固定延迟重启,顾名思义,它就是有一个固定的延迟时间。
19:38
大家看一下里边写的它这个参数是什么参数,是不是就是一个int类型的尝试重启的次数,另外还有一个就是。两次重启的延迟时间对吧?啊,这是一个长整型时间戳,那所以这里边就非常简单,比方说我这里边可以直接给一个三,是不是我就要尝试重启三次三次啊对吧?然后接下来啊,后面我给一个比方说给一个1万,那大家想这是不是就是每隔十秒钟尝试做一次重启,但是这个可能时间有点短啊,每隔十秒钟做一次重启,然后尝试三次就完事了,对吧?重启不出来的话,我就报错,就是起起起不来没办法啊,这就是固定延迟重启,那另外还有一个就是我们看到的那个。
20:27
所谓的呃,就是failure rate对吧,就是失败率重启啊。失败率重启,那这个设置setet strategy,我们设一个这个就叫做failure rate result里边的参数比刚才大家看到多了一个对吧?诶,它是首先有一个int类型的failure rate,这是指什么呢?它这个含义其实说的是既然失败率嘛,所以它代表的含义是在定的时间内,我去统计到底这个就是重启了几次,就是我只允许它在一定的时间范围内失败到达几次,我就不能重启了,对吧?所以这里边也有一个失败的次数,所以这里边有一个failure rate,这个int其实就代表这一段时间内的那个次数啊,尝试的次数,然后后面有一个time是失败的时间间隔,这指的其实就是说,呃,就是当前你测量的这个时间段内啊,到底在多长的时间段内去让他允许失败这么几次,连续尝试这么几次?
21:34
然后呢,连续的这这几次重启之间,它是不是还应该有一个时间间隔啊,哎,那所以这几次的时间间隔是用最后的这个time叫叫叫做这个delay in inter来去指定啊,所以这个在实际生产当中可能应用也会稍微的多一点啊,那比方说这里边我还是重启三次,但是这个呢,大家看前面那个固定时间重启的话,它就不管你一次重启要花多长时间,然后然后没启起来对吧?啊,他就不管这个啊,我这里边呃,这里边就是只要做三次尝试重启就完了,而这里边呢,我要后面限定一个时间,比方说这里边,诶大家看我这要的就是API common下边的这个,呃,给给一个这个of对吧。
22:20
给一个这个时间字段啊,我可以或者你也可以直接这个time,直接直接点对应的这个时间就可以了,比方说我在十分钟之内统计它的这个重启对吧?啊,然后每隔多少时间呢。呃,我可以比方说每隔一分钟重启一次,所以就是超过十分钟的话,我当前重启就失败了,我就不管了,对吧,我就看十分钟之内,然后十分钟之内呢,最多就尝试三次重启,然后每一次尝试之间间隔一分钟。这就是重启策略的一个配置啊,这样的话我们就把所有的容错机制里边的配置项都给大家讲了一遍啊,涉及到状态后端的配置,检查点的配置,另外还有重启策略的配置。
我来说两句