00:00
嗯,在面试的时候啊,我们的这个cash啊,包括那个persist和这个checkpoint呢,经常会在一块来问问你他们的区别,他们都可以把数据保存起来,为了提高效率可以重用,那么他们的区别在哪里呢?所以接下来我们把它的区别我们一块儿来看一看啊来,首先我们拷贝啊拷贝,那么这里呢,我们写上一个我们叫做什么呢?零五,然后呢,拿过来啊,然后点击OK,嗯,放过来,那这里呢,我们现在呢,就简单的咱们先说一下这些文字的描述呢,咱们先给它去掉啊去掉嗯,去掉以后呢,我们首先咱们在这里呢,稍微的咱们说一下啊来。我们的这个cash啊,它顾名思义啊,它是将我们的数据它临时存储在我们的内存中啊,进行数据的什么,我们的重用,它的目的是在这个地方,所以你会感觉啊,什么它的这个数据就不安全,为什么呢?诶,比方说数据丢失啊,比方说内存溢出啊,对不对,或者说我们的数据给它移除了,对不对,也有可能数据呢,本身啊,出现点什么问题啊,你的内存可能重启了啊,重新分配了,是不都有可能出现问题啊,所以啊就明显就不安全,而我们那个persist啊,那么我们这个叫持久化,他们会有个存储级别,比方说磁盘,那么它可以干嘛呢?将我们的数据它临时存储啊,临时存储在我们的磁盘文件中啊,进行数据的重用,诶这个是完全可以的,那老师,那这个我们不是也挺好吗?你不放在内存当中了,那你放到磁盘文件当中是不是挺好的,诶没问题,但是呀。
01:39
首先它是落盘了,它的磁盘的IO就会比较多,性能会比那个memory,就是我们的cash要慢一些,对不对,这是肯定的啊,所以呢,我们这里说一下来,它涉及到啊,涉及到磁盘IO啊,IO所以性能较低啊,咱们叫性能较低,但是我们的数据安全啊,你像这个它确实快啊,它确实快,但是呢,它的数据它不够安全,对不对,所以persist其实也是不错的啊,但是有一个问题什么呢?就是我们的这个数据啊,你只能够在当前场合下去用,就意味着如果你的这个作业执行完了,你产生的那些临时文件就会删除啊,所以我们说一下,嗯。
02:21
如果作业执行完毕,那么临时保存啊的数据文件它就会丢失啊,就会丢失,那么这样的话呢,就麻烦了,为什么说麻烦了呢?因为你想要去取数据的情况下,你会发现诶我下个作业就没有办法去共享这个数据了,所以这样的话是不是很方便,所以呢,这时候就会出现那个叫checkpoint,就是它它可以将数据呢,咱们叫长久啊的,我们说保存啊,在我们的磁盘文件中啊,文件中进行我们叫数据的重用,那么就意味着你现在可不仅仅大家想想不仅仅是临时了,那么你是可以跨作业执行的啊,但是它肯定是涉及到磁盘IO了嘛,对不对,所以呢,它的这个地方诶,它的数据呢是安全的,但是呢,依然效率可能比较低,诶是这样,而且呀,有一个问题什么呢?就是我们的这个地方,咱们说一下他为了啊,为了保证啊。
03:21
它的数据安全啊数据安全,所以他一般情况下啊情况下,他会独立执行我们的作业,这句话是什么意思呢?就是意味着当你的行动算子触发执行的时候,我们的checkpoint其实会产生一个新的作业,所以你回过头来看咱们之前给大家执行的操作,你会发现这个圈A被执行了很多遍,为什么?就是因为你本身正常执行咱们的什么,我们的这个collect,它其实它就会走四遍啊,走四遍为什么呢?四个单词么,但是当你用了我们的checkpoint之后,就会导致什么问题,导致它会再走一次我们的作业就是再创建一个作业,那这样的话,无形当中他等同于走了两遍,所以啊,这个其实效率就更低了。
04:16
那该怎么办呀?诶这个我们说一下来,为了能够啊能够提高啊,咱们叫提高效率,所以一般情况下啊,一般情况下什么呢?我们是需要啊,是需要和我们的CA系联合使用的啊联合使用这个呢,我们给大家说一下,怎们看来我们这个地方不叫做我们的它嘛,然后呢,我们在这个地方,我看一看来把这个地方我们写上叫做点儿,我们叫做什么呢?叫做我们的cash,诶咱们叫cash,然后呢,再来写上一个咱们叫checkpoint,写完之后,现在呢,我们给它来运行啊,运行刚才记住了同学们刚才有八个啊打印了八个那个圈A,现在我们再来执行,看一看我们会打印多少个。
05:04
大家有没有发现这个时候还打印的是我们的八个吗?不是了,是我们的四个对不对,哎,就是这样的啊,所以这就是我们刚才说的先cash再做checkpoint,也可以提高我们的效率啊,那好我们来给大家看看源代码吧,因为我们光这么说的话,大家可能啊不太清楚,就是说它为什么会独立的啊来独立执行,所以我们点击这个叫collect,我点一下,点完以后点击这个叫做run job,诶再点wrong job,然后再点run job点击还点它点完之后大家有没有发现,当你的DA schedule的run job之后,这边的RDD干嘛呢?Do checkpoint是不是,大家想想是不是执行了检查点操作,所以我们点点完以后,它这里面会判断判断你需不需要去进行检查点操作,那咱们这个地方呢,就可以来,咱们叫do checkpoint,在do checkpoint当中啊,这里我们看看它这边我们的点一下,点完以后咱们往。
06:04
下走,它这边有一个叫做do checkpoint点点完之后啊,大家可以看到这是一个我们的抽象的操作,对不对?所以来咱们搜索一下,搜索以后它里面有两个,咱们随便找一个啊,咱们local,嗯,找一个本地的操作来搜索,搜索以后咱们往下来,往下来,往下来以后大家看怎么了,是不是有一个叫wrong job,这时候你就会发现它其实就会有什么触发这个诶作业执行的操作,但是由于你前面加了一个cash啊,它从缓存中取数据,它不需要从头走了,那么在这种情况下我们就可以什么呢?诶,直接跳过那个作业来完成一些处理,所以啊,这是我们需要联合使用的,好,这是它们之间的区别,但是其实他们还有一个更加重要的一个区别,这个我们再给大家看一看,来把它关掉。关掉以后来同学们看啊,我把这个量写上一个叫做零六,然后呢,我们来给它来拷贝一下,嗯,点击OK,然后放过来,放过来之后干嘛呢?我把这些东西啊,我为了给大家看的明白,这个咱们不要了啊,这个咱们这个保,嗯这个这个保留,然后呢,大家看我把这个checkpoint呢给它注掉,然后呢,我把这个cash呢,我留下来,这个咱不要了啊,不要了,把cash留下来以后干什么呢?我们拷贝,拷贝以后我们打印。
07:27
我们在执行真正的操作之前呀,我们给它来啊,我们写上叫做他点我们干嘛呢,写上一个叫to debug string,然后呢,在我们的下面这个地方,我们再来打印它的debug string,所以大家看啊,我的目的很简单,在我执行我的行动算子之前,我看一看他的这个血缘关系,然后呢,当我执行完以后,我再看看他的血缘关系,我们要给他进行一个判断啊来,我们现在运行一下,诶,对了,这个暂时用不上了,嗯,把它去掉,去掉以后我们运行以后看结果。
08:04
啊,在我们真正运行作业之前看血缘,在我运行之后看血缘啊是这样的。好啊,大家看一看,有没有发现我前面是1233个我们的依赖关系,但是到了我们的下面,执行完我们行动算子之后的这个血缘关系怎么了?多了一个叫cash的parts,有个叫memberized,什么368这个字节。什么意思啊,它在血缘关系当中,它会增加一段依赖关系,对不对,而且它会有缩进,就表示它不是一个正常的依赖,而是额外加的,所以在咱们前面的这个地方,咱们要说一下啊,来这个cash呢,会怎么办呢?其实不光是cash,包括这个process也是一样的,它会将啊我们的血缘关系中啊,血缘会在吧,会在血缘关系中啊,关系中我们叫添加新的啊,我们叫依赖。
09:07
诶,添加新的依赖,所以啊,这样的话,一旦出现错误的时候,比方说你的数据丢失了,你的缓存失效了,它会通过血缘关系回过头来找到咱们数据源,这是没有问题的,所以啊,它添加新的依赖,一旦啊,一旦我们叫做什么呢?出现了问题,它可以呢,什么呢?从头读取数据,从头啊来,咱们写上从头,咱们叫做什么呢?读取数据就是这个意思啊,数据并不会丢失啊,如果内存失效了,数据照样可以恢复的好,那我们回过头来看另外一个,把这个检查点咱们放开,放开以后这个cash呢,咱们不要了啊,不要了,不要了以后把这个放开,记住我现在看的还是我们的血缘关系,只不过换成另外一个了,叫checkpoint,现在我们来执行。你执行以后,我们看一看会发生什么事情好不好,同学们。
10:03
好,大家有没有发现我们的血缘关系当中,前面有三个,但是我执行完以后怎么了,只有两个了,那么这个两个当中,它有一个新的血缘叫做checkpoint r,这个是什么意思呢?这里我们就要告诉大家,我们的checkpoint啊来它在执行过程当中记住它的执行啊来执行过程中会怎么办呢?他会。咱们叫改变啊,或叫切断吧,咱们叫切断咱们的血缘关系啊,重新啊,重新建立咱们叫新的血缘啊,咱们的关系,诶这句话是什么意思呢?其实主要原因是这样的,因为啊,我们的checkpoint将你的计算结果它保存到分布式的存储当中,数据比较全,其实就等同你的数据源发生了改变,为什么呢?以前的数据源呢,得经过很多的步骤才能到现在的这个位置,那我反正我的目的就是为了从现在的新的数据源来取数据啊,所以呢,我们完全就可以干嘛呢?我们改变它的血缘,这是完全可以做到的啊,所以对于我们来讲,我们现在干嘛呢?我们只需要什么呢,这么做就行了,就是说我们重新建血缘关系,它会切断血缘关系,重新建立新的血缘关系,那这个时候我们要千万注意一件事情,同学们,就是说我们的check。
11:34
Point啊来它等同于它改变我们的数据源,诶就是这个意思啊,好了,它的区别就在这里了啊,就在这里了,嗯。
我来说两句