00:00
好的,那接下来呢,我们进入咱们第二章的一个学习,也就是说到我们整个文档最重要的一章了,也就是源码的详细解读啊,那我们就带家在源码当中去看一看,那首先呢,我们这边放了一张PPT,就是将我们接下来要阅读的源码当中的核心内容给大家摘出来了,我们可以稍微的去看一眼,OK啊,那我们点开,首先我们知道在我们正常写骇客程序的时候,呃,那么第一步呢,我们是不是先要启动一个客户端。对吧?然后在客户端当中去执行我们的S语句,当然也可以直接通过并have,通过杠E或者杠F的方式来提交一个任务,但杠E呢,可以跟着一个hike语句,杠F就可以跟着一个hike文件,对吧?这个大家是知道的,那么接下来呢,嗯,它就会调用我们的主程序进到我们的客户端,因为接下来这是客户端,它会把我们的SQL语句远程的发送给我们的服务端,对吧?那服务端接收到这个数据之后呢,就会响应我们的一个请求啊呃,那在这个过程当中主要做了这么三件事情,首先第一个,我们等会儿将会遇到第一个类叫climb driver。
01:18
啊,这个类,这就是说启动了一个驱动类客户端,一个驱动类对吧,它会解析我们客户端当中是否存在杠E-F等等这样的参数啊然后呢,定义标准的输入输出流,那干什么事呢?因为在此时我们在正常的输一个SQ,同时或者说我们开启了一个客户端的同时,他就会把这个内容给我们。做好啊,那如果说我们没有杠E-F这个参数,只是我们启动了一个客户端,接下来我们在客户端当中是不是要写一些hi格语句,所以他给我们定义了一个输入流,同时我们的骇客执行完以后,大家也能知道,它会在控制台给我们打印出来它所产生的一个结果,无论是报错还是呃,正常的一个结果,那总要输出,所以它会定义好我们的输入输出流,呃,那么第三块呢,它会去解析,它会不断的去读取我们所输入的内容,然后去解析我们输入的内容啊呃,解析的过程呢,最核心的就是按分号进行切割,所以大家能够知道在have当中,我们一个客户端当中呢,我们可以同时提交多个以分号隔开的一个ha,可它是可以执行的,而且它是按顺序一个一个执行,那是因为它在客户端做解析的时候呢,按照分号给我们隔开了啊,当然这个都是客户端一个程序还没到我们提交MR任务呢。
02:42
嗯,那接下来呢,我们看一下他需要做什么事,接下来他在这个里边呢,创建了一个drive类的对象,呃,拿着这个对象呢,调用我们driver里边内容,那就是最核心的编译执行的过程都在我们的driver这个类当中去所发生的,当然driver这个类能干这么多事情,也是依赖于其他的一些类,或者说叫组件,就是我们刚才带着大家所分析的核心组件这些内容,对吧?好,那么第一个呢,就是说将开课语句转化为ast,好,提一个小问题,大家可以思考一下,呃,那这个是我们核心组件当中谁去做的呢?谁所完成的工作啊,可以想一想对吧?然后呢,可以把答案,答案发在我们的这个公屏上面啊,可以给大家看到啊。呃,好的,那很多同学都应该已经作答了啊,那我们就揭晓答案,那其实就是我们的解析器对吧,我们知道解析。
03:42
题呢,嗯,它会将我们这个hacker做词法语法解析,把它翻译成我们的抽象语法数,好呃,那么接第二步,将我们整个的抽象语法数转成task string啊,当然这个过程当中我们是简写的,也就是说这个过程当中发生的事情比较多,我们稍微的回顾一下,大家呢也可以思考一下,因为刚才呢已经做过介绍了,对吧?首先将我们的抽象语法数第一步是不是转化成了叫。
04:16
Query block查询块对吧?然后接下来将我们的查询块呢,转化为逻辑执行单元啊,它就最小的执行单元,接下来对于我们的逻辑执行单元,或者说叫逻辑执行计划进行逻辑优化啊,逻辑优化当中一个非常典型的就可以去除掉不必要的reducer阶段,对吧?大家应该还有印象,我们这块慢一点,大家可以边回顾边跟上我们所讲的内容啊呃,那接下来呢,我们得到了一个优化后的逻辑执行计划,那我们就将逻辑执行计划呢翻译成task tree,最后呢,对于我们的task tree再继续进行物理层的优化,好,那物理层优化做好以后,就是我们真正意义上的一个任务数,也就是最终我们的一个task任务,那最后一步就比较简单了,只要提交任务去执行,那就OK了,对吧。
05:16
因为通过第二步,我们就已经将抽象语法数转换为可执行的一个一个的task,只不过最后做一个封装成MR任务就好了,对吧?好,那我们接下来看这里的核心的,那首先对于我们的hi客转化为ast叫解析过程,那么第一步呢,它用的是一个passl u这样的一个东西,也就是说是我们核心的解析器所完成的一个工作,那这个解析器passl这个方法当中呢,主要做了这么几件事情,第一个将ha转化为我们的token啊,就一个一个的token对象啊,那之后呢,对token进行解析,转化成我们的ast抽象语法数啊好,那第二块就是这个内容,那这个是最重要也是最重点的一个东西了啊,那它呢,其实。
06:06
用了一个分析器,其实就是我们的,刚才这个是解析器所完成的,那么这个里边就第二部里边就包括了我们其他的三个组件啊,那我们想一想叫编译器对吧?将我们的抽象语法数编译成能够去操作的叫查询块,Operator tree task tree啊,操作数,任务数查询块这样的东西,对吧?好,那接下来呢,还有整个的优化也是在这里边去做的,呃,那么第三点呢。最后的执行啊,最后的执行器对吧,也就是说将我们优化,当然大家注意一下,这个优化当中呢,包括两部分,一个呢是逻辑执行优化,另外一个是物理执行优化啊,这两个是不一样的一个点,好,那我们再详细的看一下这个当中所做的事情,那它对应的呢,是我们的一个。分析器对吧?这里边所做事情,那么第一步将ast,也就是我们的抽象语法数转为查询块,第二步呢,将查询块转化为我们的操执行数啊,Operator tree操作数啊呃,那接下来呢,对我们操作数进行一个逻辑优化,因为对于我们的操作数啊,我们可以把它认为是一个逻辑执行优化执行计划之后呢,我们进行逻辑优化,那么接下来呢,生成我们的任务数,在接下来对任务数呢,进行一个物理层的优化啊,那优化好以后,其实就可以做到提交任务去运行了,那最后就是我们提交任务,那在提交任务当中呢,其实它调用了一个task runner里边的一个wrong那的一个方法对吧?好,那在这个当中呢,第一步获取MR临时执行目录啊,第二步,定义自定义的一个partition分区器,第三步,定义map reducer的一个类型,同时输入输出类型都是会定义的,那写过MR程序的大家都知道。
07:57
当中呢,我们就在定义这些内容,写M8程序,大家知道我们要写三个核心类,Map类啊,呃,Reduce类,还有第三个叫driver驱动类,对吧?或者你把它称为叫excu类都可以,那在driver当中,我们需要去定义map类型,Reduce类型,分区器类型,输入输出类型,以及输出参数的地址,输入参数等等这一系列的,那么最后这个ex这个drive当中,其实就是在做我们自己之前写MR任务drive这个类里边的一些事情,对吧?那么今我看啊,最后呢,实例化我们的job,最后做提交啊,最后做提交,那也就是说详细的一个流程呢,是这样子的啊,其实又把我们之前所讲的东西再次细化了一点,展现给大家,那我们不断的去细化啊,不断的去细化,因为从首先我们从大的方向上面要知道四大核心组件,每一个人所做的。
08:57
事情我又再一次强调了,其实最重要的是对于刚才我们所聊的,对于大家来说啊,最重要的是四大核心组件,他每个人里边参与工作所做到的一系列的事情,这个是最重要的,OK,那我们又再次回顾了一下中间的内容,对吧,好。
我来说两句