00:00
好,那接下来呢,我们任务已经完成了,解析编译优化对吧?好,那最后一步是什么叫执行,也就是第四个叫执行器,嗯,那大家我不知道大家还记不记得,之前我们在聊解析编译优化之前说了它跟执行是平级的,哎,在这个地方源码当中呢,我们就告诉大家了,在2.3.8run internal呢,这个方法继续往下有第二步,那我们点到这个,那这是哪个类里边的,大家还记得吗?好,对了,应该是我们的drive这个类对吧?好,那我们就回到drive这个类啊来呃,看这driver这个类,Drive这个类里边呢,我们找到它叫run的一个方法是不是,那我们来搜一下啊。Run,好,那这边呢,点进去,点到这个方法里边,呃,那在这个方法当中呢,我们就能够看到第一个。编译的过程就是刚才我们进去那个方法,再往底下走,它有一个XQ的方法,对吧,叫执行器啊,叫执行器,其实到了这块为止,对于大家来说已经不难了啊,因为这里的代码大家其实自己都去写到过,好那我们先看一下文档当中啊,那这个里边呢,呃,点进来之后大家就能看到构建Mr job,然后job呢,获取你是不是这个T子任务,以及是不是这个Spark任务,对吧,都可以做,如果说job大于零应该怎么做?启动任务not task,好,其实就比较简单了,OK吧,好,那我们来看一下在这个过程当中呢?呃,Excu,然后接下来我们先走的是构建任务,对吧?啊构建任务那我们往上走啊呃,找到构建MR任务在这。
01:45
啊,用到工击类去获取我们MR任务,然后呢,对MR任务当中,哎,获许你除了任务有没有太子任务啊,有没有Spark任务啊,都是有可能的啊,那继续走啊,这个下面呢,不用多说,呃,然后呢,从根目录开始遍历,然后呢去对它进行一个序列化,这个不用多聊,对吧?因为你任务要发送,最后呢,真正的我们去看到啊,往下走啊,走到哪块呢,我们就可以看到,呃,我们要去执行咱们的任务,这个里边也是比较多的,因为正常它在封装这些任务就比较麻烦嘛,对吧?所以呢,我们继续往后走啊,这块东西非常多啊,那我们继续往后走,看一下它里边呢,会有这个,嗯。
02:26
运行我们的任务啊,Launch task,或者说我们直接搜一下吧,因为这个方法呢比较多对吧?诶在这块啊。在这个,呃,那么呢,去运行我们的任务这边啊,Task runner对吧,然后呢,这边是执行任务啊,那我们往上走啊,在这块,这是我们刚才打的一个包,哎,刚才是点过了对吧?好,那我们进到这个launch task当中啊,运行任务,那那这个里边呢,其实就比较简单了,真正的去运行我们的任务。Launching。
03:00
对吧,Launching啊,当然呢,这个当中如果说还有一些其他的情况之后,我们可以调用这个wrong方法啊wrong方法,那我们可以看一下这个launching方法啊,当然这个里边呢,它还是一个同步方法啊,一个一个去提交running a,那这个时候呢,其实就是说添加一个什么正在运行的任务,那接下来呢,真正运行任务的时候是这两个方法。啊,那第一个呢,是以并行的方式来运行的,对吧?那就是说这个地方告诉我们是否可并行啊,可并行对吧?那如果说是下面一种方式,单个线程的方式,只能应用于MR任务啊,当然了,我们在生产环境当中肯定都是并行的方式,所以我们就看这个start这个方法对吧?在这里边,那这个当中呢,我们就能够看得到,哎,它真正的去启动了啊,去启动了这个地方,如果说他失败了怎么做对吧?啊,把这个组呢放进去,这是编任务,但是我们调用一个现成的start方法,呃,实际上呢,调用的应该是什么东西。
04:03
是这个里边这个类型里边的。它是个里边的。Wrong方法对不对,那边叫start,因为刚才我们看到我们点start它是一个线程,因为这个东西呢,它继承了一个线程啊,所以呢,其实真正的走到的是这个wrong方法啊,Run方法,那这边呢,有一个run shift啊点进去,点进去好以后呢,这边我们照样可以看到,诶真正任务的执行它比较绕是不是啊,一层一层的,然后呢,Q的task啊,任务执行,在任务执行当中呢,我们继续往后看,它又绕了一步叫什么?Ex啊,继续好,那到了一个抽象方法里边,那CTRLCCTRLH我们搜一下,好,那么这个里边来看一下,它就有很多的任务了,Spark任务啊,DDL的,然后呢。Condition选择的t function啊等等q driver,那我们要找的就是q driver,因为它是用付来启动的,那其他的任务呢,都一个一个的去执行,对吧,被执行,所以呢,我们找到XQ的啊,CTRLFCTRLV,诶找到我们的XQ的方法也就这个方法啊,在这个当中呢,我们继续往后走啊,这个里边其实呃,就是它比较绕而已啊,比较绕而已,那这个当中呢,就我们来看一看啊,就比较简单了,对于这个当前job呢,设置输出的类型,设置map是什么类型,设置它的分区器对吧?Partition呢啊,设置它的一个内容,OK,那之后呢,设置reducer的类型,设置reducer的个数啊,也就是说正常的我们以前写mmr任务的时候呢,我们能看到在mmr任务的。
05:40
这个程序当中我们确实有写到这些内容,呃,那继续set output key对吧?啊,不光有output class,也有它这个key value的类型,还是在给我们这个任务呢,继续设置一些参数,那到最后什么时候才去真正的提交呢?这边用了一个job客户端,因为呢,他要去提交,远程提交给。
06:04
延安嘛,对吧,那默认呢,我们肯定mmr任务呢,呃,跑到延安上面,那到这边来submit的job提交我们的任务,到这块为止,我们整个的过程就结束了,因为接下来如果你继续往里看的话,那接下来应该是源码讨论的事情,那如果说大家对MR源码有兴趣,可以看我们MR那块的一个源码,在我们上硅谷呢,也是有讲到整个哈杜op源码的一个课程的,对吧,包括B站,包括在我们上硅谷的官网都是有的啊,因为接下来提交就是远程提交啊,到我们的一个,呃,延安刚才我们说了,这是一个job客户端,通过客户端呢,远程连接到雅安服务,最后呢,把任务做了一个真正的提交,那么到这块为止,相当于我们的代码整个就看完了。源代码啊,其实就这些,那我们总结起来就是大家主要把我画的那张PPT对吧,如果能记住其实就OK了,但是细节的方法这些东西你如果能记住那更好,如果记不住,那你就把那张图记住,呃,当然有的同学说那有很多细节我们可能没有去看,那这个需要大家在工作的时候,假如说你对这种优化器需要专门的去做深入了解,那专门的去看,因为我们刚才看到优化器那么多。
07:22
对吧,而且呢,我们不是debug的模式,那优化器放在那儿,你光看那个代码是看不太懂的啊,因为这个时候必须要求有呃一个业务的驱动,所以呃,各位同学在生产环境当中去看会更合适一些,对吧?我们主要是把这个整个流程串了一下啊好。
我来说两句