00:00
好同学们,我们刚才呢,给大家把RDD的这个阶段划分呢,咱们通过源码呢,咱们看了一下对吧?呃,接下来我们要讲一下RDD的任务划分啊,其实RDD的任务呢,对于我们来非常重要,因为咱们在整个执行的过程,执行就是咱们的一个一个的计任务,对不对?那么到底划分成多少个,诶这个就尤其重要了,那么在我们划分的过程当中,需要了解几个概念,第一个叫application,第二个叫job,第三个叫stage,第四个就是task本身了,首先第一个叫obli,叫应用啊,那么我们说初始化一个Spark content上下文环境对象,它就会生成一个我们的application对象,对不对啊,也不叫application对象了,就是一个应用。那么所以在我们之前写程序的时候,咱们都会有一个方法叫做site name对不对,哎,就是这样啊,然后呢,我们的job呢,它是一个action算子,就会生成一个job,这个咱们之前也说过了。
01:00
咱们的行动算子呀,它底层呢,其实就是run job,然后呢,会创建那个叫active job,这个咱们之前说过了吧,那如果你再来执行一个collect,那不又会创建一个job吗?诶,所以啊,它这里面一个行动算子就会产生一个啊,然后呢,Stage呢,他说了它等于宽依赖的个数加一,这个正好是我们之前刚刚讲过的,对吧?诶,我们的阶段数量就是sale的数沙Le依赖的数量再增加一个一,那个一表述的是叫stage,对不对?诶,这个咱们讲过了啊,然后呢,Task一个阶段当中最后一个RDD的分区个数就是task的个数。诶,这个是什么意思呢?记住啊,我们总共的作业的task其实不是这个,它强调的是一个阶段当中你最后的一个RDD的分区个数,就是当前阶段当中任务的个数,那么如果你把所有的阶段都任务统计在一块儿,那就是完整的作业的任务数量了。啊咱们这里呢,可能没那么细啊,那这里呢,我们来看一看他怎么理解这句话,这个呢,咱们假设,咱们假设现在呢,我们就只有一个阶段,我们没有那么多阶段,同学们我们只有一个阶段,对不对,也可也可以吧,你没有沙漠的话,那不就一个阶段吗?那如果一个阶段的话,它的任务数量到底怎么来的呢?我们要看一看,咱们回过去啊,咱们回过去,咱们来从这个地方开始啊,把别的地方咱们先去掉,那么我们这边大家看一下,我们点,我们点,点完run job run job到了咱们这个地方呢,叫做dad schedule run job点然后呢,我们往下有个叫job。
02:43
然后呢,我们说过了,它里面会有个什么东西呢?会有一个事件啊,咱们要处理这个事件,所以呢,我们搜索一下,在咱们这个地方叫handle,那么在这个位置的话,大家会发现我们这是之前讲那个阶段划分的代码啊,在我们的这个地方是我们的dad schedule 982行代码,对不对,在这个位置,然后呢,我们接着往下,往下里面有一个叫submit stage,什么叫做submit,叫提交阶段,它会把最后这个阶段给你提交过来,大家看一下,因为我就一个阶段嘛,所以他就把这个阶段给你提交到这里面去了,好,我们点一下。
03:21
点完以后,那么这个阶段就会传过来,传过来以后啊,其实它底层有这么一个判断问你啊,叫get missing parent,就是丢失上一级的意思,说的简单的就是你有没有上一级的阶段,咱们前面分析过了,我们如果有好几个阶段的话,那么当提交的时候,他必须要保证这个阶段被先提交,为什么?因为他要先执行完,他先执行完才会走这个阶段,咱们之前说过吧,对不对?那好,回到咱们现在的这个位置,你就一个阶段,你哪有上一级啊,那如果你没有上一级的情况下,那么大家想想,那它不就是空吗?他如果为空的话怎么了?Submit missing tasks,就是提交没有上一级阶段的任务,那其实就是当前阶段的任务,对不对?所以他会把当前阶段给他传过去,所以点点完以后在这个地方跟我的task就有关系了,好,咱们继续啊,同学。
04:21
我们看关键性的点,多余的代码,咱们暂时先不看它,咱们往后来,往后来往后来跟任务相关的,在咱们当前的这个位置,大家看这个就是任务,然后加了一个SEQ,咱们叫做序列,所以啊,它是当前这个阶段中我们的所有的任务啊,就是在这儿产生的,那这个产生它是怎么来的呢?它在这个地方匹配了你当前的阶段的类型,说明说明啊,不同的阶段它的任务啊是不太一样的,大家看我们这个地方叫Le map stage,它所创建的任务呢,叫Le map task,而我们的stage呢,它创建的task呢,叫task,所以任务它不太一样,但是这个还好吧,为什么呢?因为对于我们来讲,咱们现在关心的是它的数量是怎么计算出来的,那么好,大家看一下这个地方是不是new啊,这个地方是不是也是new啊,那咱们现在是不是就是一个阶段就是reor stage,那么。
05:21
你就要看他拗了几个呗。那么六几个跟什么有关系,大家看一下这个东西。这叫map。那么我们学过那个map的方法,Map呀,它可以把A变成B,但是有个关键的点。他会把数据减少或增多吗?他不会,你原来的集合当中有五条数据,当你map之后,你应该还是五条,对吗?诶,就是这样啊,那如果你的这个map,那它是我们的十条的话,你在转换之后应该还剩下十条,所以说你到底有多少个我们的任务,其实它取决于你map之前的这个操作。
06:01
能明白吗?同学们啊,这就是我们对方法的理解,那就是你到底有多少个new,它取决于这个结果呀,这个结果里面有多少个元素,那么它就会new几个对象,那这个是啥东西啊,它叫做partans to compute,顾名思义是计算分区嘛,所以我们点一下,点点完以后大家会发现它叫stage.found missing partitions,那么这个stage呢,我们就叫做stage,所以呢,我们来啊,咱们把这个拷贝,拷贝以后咱们后退,后退以后不是叫redo stage吗?点点完以后咱们来给它搜索一下,你看到没有,它就在这儿,它在这个地方的时候,他就说了啊,我们这里干嘛呢?要零,然后until,然后job.number partans,这个跟大家说一下,就是我们的job的其实就来自于咱们最后一个R的分区数量,所以比方说我有三个区。
07:02
什么零到三,但是不包含三,就是012吧,然后呢,它field叫过滤,过滤的话它是想判断那个job有没有结束,哎,是这样的,那咱们肯定没结束嘛,那所以呢,就是0123个我们的元素,那如果三个元素的话,那么做map的话是不是就三个new,那所以任务的数量是不是就是三个,所以啊,咱们默认情况下,我们的分区当中的啊,或者说我们阶段当中的任务数量应该跟分区相同吧,所以啊,咱们这里说一下来,咱们这个地方不是有一个我们的RDD吗?然后它里面不就是有我们的分区嘛,对不对?所以呀,诶把这个拿过来,比方说它有我们的三个分区,那这个时候在并行计算当中,它就会产生什么咱们的三个task,所以啊,那么三个task就出来了啊,所以把这个呢,我们来把它去掉,或者说咱们写个task吧,嗯,好写个task啊,然后这边也写个task,这个大家明白就行了。
08:02
啊,咱们不画那么细了,放到这边,所以task就是这么来的,好,我们这里加个文字吧,嗯呃,咱们的这个任务啊,来写上任务的数量,它等于当前阶段中我们叫最后一个RDD的什么分区数量,哎,就是这样,这个我们是通过源代码是能够看得到的,应该没有问题啊,那老师那不对呀,你刚才其实看到的只是一个我们的阶段呢,因为它还有另外一个阶段呢,对不对?同学们回过头来,咱们还有上面这个阶段呢,上面这个阶段我们点一下点咱们来搜索一下,叫fund missing parts,点点完以后你会发现什么东西还是这个0UNTIL,咱们叫number partition,是是不是一回事,同学们其实没有什么太大的区别啊,没有什么太大区别,所以啊,这个结论应该是准确的啊,OK,咱们说到这里。
我来说两句