00:00
刚才我们简单的解释了一下啊,咱们这个嗯阶段呀,嗯分区啊,以及任务他们之间的关系啊,那么接下来我们来看一看,就是我们这个阶段到底是怎么划分的,因为咱们前面分析过了啊,你不同的阶段,它必须要保证里面的task可能要全部都执行完毕,才能够执行下一个阶段,对不对啊,为什么呢?因为他们的任务要结束嘛,你不结束的话,你走下个阶段是有问题的,为什么呢?数据不完整嘛,那么在这种情况下,那么你到底分几个阶段呢?这个呢,我们来看看它的源码,其实我们上节课已经讲过了啊,就是我们的阶段其实跟我们的杀否是不是有一定的关系啊,就是因为你需要打乱,重新组合,我才需要等待,而这个等待,它就会划分成一个阶段,对不对,但是我们光这么说还不行,我们需要去看一看啊。在咱们的源码当中,咱们这里呢,一块儿来看一看,首先把它关掉,那么我们这里面会有一个叫做什么呢?叫collect,它会触发咱们作业的执行,所以呢,我们点一下,点完以后再点这个叫run job,然后再点run job运行作业。
01:09
然后呢,运行作业到了我们的这个位置的时候,有一个叫dag schedule,咱们前面讲过了啊,叫做有向无环图的调度器,然后呢,有一个叫做wrong job,这个wrong job当中啊,其中它会有一个叫提交job,提交作业,咱们点一下,点完之后往下看,它里面会发出一个事件叫job submitter的啊,这个咱们还没有去详细讲,这个咱们说过了,在内核融会去讲这一块,所以呢,我们先搜索一下,它下面呢,会有一个处理这个事件的一个方法,这个叫做handle,那么在这个handle当中,大家看一下,它里面其中就有一个这个东西叫create result stage,这个就叫阶段,它就叫阶段,那么这个阶段其实就是这个代码,其实就是划分阶段的代码,那么好,我们来看看我们阶段是如何划分的,我们来点它一下点,点完以后大家往下看,其中它里面干嘛了,会new。
02:09
一个我们的result stage,这就意味着啊,在源码当中,它会什么都不干的情况下,就是你什么都没有的情况下,它会直接创建一个叫result stage,这个呢,我们可以呢,来咱们给它拿过来啊,咱们写上咱们叫做什么呢?源码啊,咱们叫源码解析,那这个源码解析当中,首先大家会发现就是我们这个叫做什么呢?叫阶段啊,咱们叫阶段划分,咱们叫阶段划分,诶就意味着在我们当前情况下,你什么都没干,干嘛呢,我就划分成了一个叫stage,这就是一个叫结果阶段,记住啊,什么我都没干呢,我还什么都没干呢,就出现了这么一个啊咱们的阶段,那么你什么都没有干的情况下,那么咱们接着往下来啊。那么你new之前他有这么一句话叫get or create parent stage,从字面寒碜来讲,就问你了,你有没有上一级的阶段呢?对不对,什么意思叫获取嘛,获取parent上一级,咱们的stage叫阶段或者创建,那这句话什么意思呢?其实呀,咱们回过头来看之前那个图,之前这个图当中是不是有两个阶段,那这两个阶段它就属于下一级,它就属于上一级,所以啊,他就问你了,你当前的阶段有没有上级的阶段?
03:27
为什么要这么干?是因为我担心啊,你上一级的阶段还没有执行完毕,你下一阶段就开始执行了,那不行,我得首先得判断你分几个阶段,这样的话我好调度咱们的task来执行对不对?所以啊,我们先来分析它的阶段,所以啊,首先这个阶段没有任何问题。好了,咱们接着呢往下看,他说了叫get or create parent stage,那么这里面会传一个叫RDD,这个RDD是哪来的呢?给大家解释一下,在咱们这个叫collect当中,它会怎么办?会把当前的RDD对象给他传进去,这个对象一直传,一直传,一直传就传到了什么我们的这个地方就是它,那么这个当前的RDD是哪个RDD呢?大家看一下是谁?
04:15
这个RDD是不是我们reduce by key之后的那个RDD,所以啊,大家看在这个图形当中啊,记住了,我们这边都有一个RDD了,在这边啊,它会出现一个我们的RDD,诶,放过来,这就是记住啊,来触发咱们的collect,所以我们的箭头啊,咱们这里箭头它来触发我们的这个叫做collect,那么我们现在呢,这个就是触发我们的collect啊,它就是触发咱们的collect,嗯,就是它了啊OK,行,那我现在的这个RDD呢,它来触发我们的collect,嗯,行,放到这里,然后呢,我们再回过头来干嘛呢?我们来看一看咱们刚才的代码,那么这里呢,叫get or create parent啊我们的stage,那我们点进去,点点进去以后大家会发现它把RDD往里面传,这个时候它有这么三行代码,这三行代码当中,首先第一个干嘛了呢?把你传进来的RDD获取。
05:15
它的shuffle dependcies,从字面还是来讲,就是获取你RDD的依赖,诶,那你这个地方就会有问题了,什么呢?RDD的依赖,它依赖于谁呀?它不依赖于前面的吗?所以它依赖于前面的啊,记住啊,这个是咱们之前讲的那个reduce,我简写了啊,简写了那这个RDD是谁呀?这个RDD不就应该是我们的这个reduce by key之前那个吗?应该是我们的map的吧,所以我们来这边我们就写上那个map啊,咱们写上一个map,那我这里还是写上那个叫by key吧,啊来。把这个放过来啊,放过来之后给它拉长一些,把这个呢,给它放过来啊,这个位置让大家能够明白,放到这边好,那么我们这两个依赖,大家想想我们的reduce backy是不是就有沙uffle,所以这个地方其实应该是一个我们的shuffle的依赖,对不对?诶,所以啊,它这个地我们箭头呢,反过来,因为我们的依赖关系应该是这么来画啊来,嗯,好了,然后呢,我们再来啊,咱们就是意思意思啊,咱们就意思意思告诉你有这么一个打散数据啊,打乱重新组合的概念,嗯。
06:20
好了,那我们这么画完了以后,那么大家想一想,那我们回过头来,从字面含义上来讲的话,他就说了叫get sle dependies,那我们来看到底怎么回事,点点完以后大家看看啊,它里面会有哈希set,会有哈希set会有个叫list buffer,然后呢,会把当前那个RDD给你放进来,然后呢,接下来呢,它的这个地方是什么呢?是我们的RDD,大家想一想,我们的这个RDD是不是应该放进去,那这个RD是谁啊,是不是就是我们这儿啊,就是它对不对,所以呢,我们这里把它标红啊,标红就是把这个RDD放到了咱们的这个位置,放进来以后他就问你了,这个我们是不是空,那我刚刚把RDB放进去,它怎么可能为空呢?不可能为空,不可能为空的话,它会把它取出来,这个目啊是删除集合中的元素,把它取出来,那么这个取出来以后,判断你是不是之前曾经访问过,咱们之前怎么可能访问过呢,对不对,不可能,所以。
07:21
没有访问过的情况下,那么就继续往下走了,往下走就是获取你RDD的依赖,然后呢,挨个变利利以后模式匹配,判断你是不是shuffle依赖,大家看一下咱们这是不是,是吧,如果是的情况下,它会在parent这个集合当中增加一个杀Le的依赖,如果要是不是的话,它就走别的,诶就是这样,所以大家可以看到在我们当前的这个情况下,大家看这个叫dependency.rdd,那么它就会把你依赖当中,就是这个依赖中的它啊,把它的RDD传进来吧,就等于把这个RD传进来,你把这个RDD传进来的情况下,大家看一下,但是我们说了这是有。
08:06
条件呢,就是你看看是不是沙佛一赖咱们这是不是,那如果是的话就走不到下面吧,所以咱们到了这儿其实就结束了,结束了以后大家想想往下走,它返回的parent恰恰是你刚才增加sale依赖的那么一个我们的集合吧,所以咱们后退后退后退后退后退以后这个地方是不是就获取了。咱们的杀Le的依赖啊,诶一个,然后呢,Map map什么意思,这个map呢,表述的概念呢,其实就是说我们要去映射,那么它有几个,咱们就去转换几个,把每一个uffle干嘛要create shle map stage就意味着呀,一个shuffle的依赖,那么它就会转换成一个新的阶段啊,那我们来看看,我们点点完以后,在这个地方它会有一个叫createle map stage,叫创建Le map stage,点点完以后,这边不就有个new吗?诶会创建一个新的阶段,所以大家看一下,只要有一个沙uffle,它会创建一个新的阶段,所以这样的话呢,我们的这块来咱们拿过来。
09:18
拿过来以后,大家会发现在这个时候啊,我们就可以来了,变成我们的紫色吧,好把它放过来啊,然后这个呢,我们给它拉大一些,这个紫色呢,就是一个阶段了,咱们叫做suffle map stagech啊,咱们来放到这边就可以了,呃,为什么是这个样子的呢?为什么呢?是因为大家看一下我们这个沙Le map stage啊,它在这边也会传个RDD,而这个RDD是哪来的,是你沙uffle依赖当中的RDD,就是你杀否所依赖的这个RDD就是它,所以这个RDD就进到了这个阶段当中,而这个RDD呢,是在我们这个阶段当中,他们是不一样的,所以从这个角度来讲的话,我们源码当中就做了这么一个操作,什么样操作呢?就是说当我们的RDD中啊,它存在中,它存在我们的shuffle依赖时啊,Sale依赖时,我们的阶段它会自动啊,咱们会自动。
10:18
会自动啊,咱们叫增加一个,所以那这样的话,如果你想判断一下我们的阶段的数量,那怎么判断就很简单了,所以来咱们这里说一下啊,来咱们叫做阶段的数量啊,数量它就什么呢?等于就是我们的杀否,咱们依赖的数量,依赖的数量再加上一,为什么要加一呢?是因为你即使没有杀uffle依赖的话,这个stage是不是肯定会出现对吧?所以这个一表示这个意思,但是你只要有个沙Le的话,这个Le map stage就会出现啊,咱们源码当中其实就是这样的,那么但是有一个问题,什么问题呢?就是这个的stage啊,它其实只会出现一次,就是最后这一次是他啊,所以呢,我们这里再描述一下。
11:04
咱们的result stage啊,它只有一个啊,它是最后啊执行需要执行的什么阶段啊,就最后才会执行,它前面都跟他无关,前面都是不同的沙uffle maps景,因为在我们当前的执行过程当中,我们是不是有可能会有多个沙Le啊,诶恰恰就会有多个这个阶段,所以啊这个阶段的划分咱们这么来理解就可以了。
我来说两句