00:01
接下来我们看一个DB,最常规的一个优化就是开启它的增量检查点。另外呢,同时也可以开启一个本地恢复啊,那么挨个来介绍啊,第一个增量检查点,相信基本上大家应该都知道啊。它而且呢,增量检查点目前只支持一个RODB啊,如果你是内存的状态后端,那不好意思,那不行,每一次都是全量,那什么叫增量呢?很简单,咱们举个例子啊,比如说你是一个list的状态。是不是要存多条数据啊,那可能比如说第一次你存了一个一,后面你又存了个二,再后面存了个三,好假设这个时候这是。本地状态里的数据啊。现在你要切个将它。备份到远程存储,比如说HDFS。那这时候123好备份上来了。好,那么接下来就是程序也在不断的执行处理新的数据,那可能后面还有什么呢?来咱们用其他颜色。
01:04
后面又来了一个456。那正常来讲。咱们如果是全量,就是内存的状态,后端也好,或者没开增量的话,他会再存一份什么。123456,也就是说你现在状态是什么,我所有的都再备份一次,这是第二次备份,第二次checkpoint对吧,这种是属于全量,那如果增量它是怎么回事呢。增量的话,像第一次你已经备份了123,后面呢,呃,在第二次check point的时候又多了456,它只会把不一样的新增的修改的删除了这些情况把它给。同步到远程存储上面,也就是说他只需要备份456就可以了,那回头你需要用到状态的时候,它就是把前面这些加起来就是全量的,对吧,那大家可可想而知,这个增量是不是很省啊,对吧?尤其是你状态特别特别大的时候,你想想如果你的状态达到了好几个G,比如说一个G的状态。
02:08
假设啊,这么大的状态,你每次都全量,每次间隔都要备份一个多,每次都要呃同步一个多G的数据,可想而知,性能肯定是特别差的。那如果你是增量,比如说每次只同步100兆就行了,那是不是就效率提高了很多,对吧?来废话少说。咱们直接看啊,那这个参数很简单,你在代码里面去new not DB的时候,你传个参true就表示开启,或者说由参数来指定,指定为处也可以,或者你在配置文件默认就指定,都是打开的就OK了。另外一个功能叫本地恢复,什么意思呢?咱们flink登录失败,是不是要从checkpoint恢复那个状态啊?那这个时候可能如果你开启的话,不需要从HDFS拉,因为咱们Rose DB是不是还要落盘呢,落盘是不是在本地磁盘也其实也算是有持久化,对吧,那如果他再重新启动,还在本节点执行,那它可能。
03:11
就在本地去读取一部分数据,不需要完全从HDFS拉了,这个是一个本地恢复的功能。另外大家注意这个功能同样指质是什么落DB,如果是内存级别的状态后端不好意思不行,因为它没落盘嘛。所以一般咱们是把这两个功能给打开,那第三一个就题外话,咱们如果是lost DB的话,咱们可以设置一个多目录。但是这个多目录有前提,一定要是什么多磁盘,这个道理也很好理解,比如说这是一块磁盘。它的IO上限,也就是他最大的读写速率,比如说咱们随便给个数啊,不是实际数字啊,当然没这么低,对吧。不一定这么低,也不一定这么高,比如说是100兆每秒。
04:00
那假设其他所有的程序都没有在读写,都没有产生IO,只有lost DB在用的话,啊,你你一个目录啊,好说我达到上限是100兆每秒,那你设两个目录,它对两个目录读写,它的上限合起来是不是也是100兆啊啊所以你设置多目录的前提是什么都很磁盘。如果比如说你设两个目录分别在不同的磁盘上面,假设每块磁盘上限都是100兆,又假设呃,全部给你用这个IO。那你是不是理论上当然没那么理论的话,你是不是可以是两个的叠加对不对。这种的话效率才会提高它的一个读写效率。也就是说其实咱们在指定这个loss DB本地路径,大家注意这个不是咱们创建状态后端指定的那个路径,那个是check po影路径,这个是lost DB的本地路径啊,本地磁盘路径,呃,这个路径里面你可以用逗号分隔写多个目录啊,那如比如说这边有三块磁盘,我就写三个啊,那这样的话啊,对于咱们的。
05:05
读写是有一定提升的。是咱们基础的,应该大家众所周知的几个参数啊,那当然这个呢,就不掩饰的,因为我也没那么多块磁盘啊,在虚拟机上面。这个也很好理解对吧,那这个增量跟这个本地恢复,咱们重点看一下增量的效果来咱们这样呃。咱们先开。这个吧。先这个UV,就原来这个。嗯,然后这个金控。加不加呢,加不加都行,我看我后面加了没有。那就加吧啊。还是刚才那个案例啊,还是那个UV的案例,然后什么也没干,就开了一个状态的监控而已。这个时候咱们观察一个它的状态的大小改变,咱们知道checkpoint里面存储了除了原数据之外。
06:06
是不是应该还有各个算子各个task的状态啊,对吧。那么。好,这个是刚才页面刷新。现在是running,然后我点开我们UI。点开之后点进来作业,这里是不是有一个切个泡。对吧。好。刷新,咱们看历史就好了,历史的这里刷新。因为我这边间隔射的比较短啊,几秒,因为是为了快速看效果。所以我间隔射的短。你看。咱们看前十次,十次就好了,现在六次,咱们做一个对比。这不明显,咱们多多几次吧啊。
07:03
但至少我们从这个状态大小啊,其他咱们先不用关注啊。这个状态大小是不是一直在增大,一直在增大,一直在增大。对吧,因为咱们要需要存储的状态越来越大,越来越大,每次呢,它默认都是全量。所以肯定是越来越大。好,咱们弄到20次就好了,差不多一分钟嘛啊。好,就这样吧啊,咱们截个图啊。然后取消。取消完成之后,咱们再来重新提交,提交一个什么呢?那个那个开启增量检查点的。
08:02
我现在设为开启,另外呢,本地恢复也开启了。就是这样而已,仅此而已啊,咱们可以提交参数指定,也可以代码里面写死,但我建议还是提交参数吧啊,这样比较灵活一点。呃,另外大家看到我提交类不再是那个UVDEMO,那是因为我是不是得用RODB啊。对吧,真DB,嗯,那给大家看一下这个类啊DB tening这个的逻辑跟那个UV是一模一样的,没有改代码。啊,就是还是什么呢?呃,读取数据,过滤数据,然后呢。去重去重完之后统计啊,这个代码是没变的,唯一变的地方就一个地方这里。这边我选择用的状态后端是RODB啊。那我们说开启增量可以直接在这里传参传了一个处,你看是不是开启增量对吧,但我这边没写死啊没写死。
09:02
废话少说,咱们提交再来观察一下。等他提交上来。什么资源并行度都没改啊。都一样的。好,打开web UI,咱们做对比。看check point,看看历史统计,好,等一会。
10:00
好,其实现在已经有现象了。大家注意看啊。它的状态大小,前面几次看起来还是由小到大对吧,但是呢,你看这里。上一次还是接近400K,下一次只有200K。说明它不是全量的对吧,也就是说这个切po大小代表的是一次切poon间隔里面的新增的状态而已啊,并不是全量的,那我们再刷。你看这里又很明显了。有一次间隔内是接近一兆,在下一次只有200K,而之前呢,是一直在往上增加的,不可能减少,它是不可能减少。那我们一样的等他十几次呗,啊,差不多了吧。19。20、好。现在也是11次到20次对吧,差不多嘛,你看他们的大小,我每次差不多也就几百K啊,平均就2300K,结果之前那个呢,是一直在增加,甚至开始往底照底照了。
11:02
这个就是咱们一个区别,另外一个呢,大家可以看看它的一个效率。代码没变,资源并行度,内存都没变,唯独状态后端改了,增量开启了,你看原先做一次checkpoint,虽然原先是不是基于内存呢?不是说好的快吗,对不对。但是你看。平均你一秒了600多毫秒,900多毫秒。就大几百接近一秒,那你再看我现在是不是小几百而已啊,对吧,平均就两三百,呃,300左右吧。对吧,所以DB做CHECK1定比内存慢嘛,不一定对吧,你只要开启增量功能,其实也还好。好,这是给大家演示了一下这个增量检查点啊,本地恢复就呃,要等到任务故障的时候再去做啊。
我来说两句