00:00
那接下来我们了解一下查看执行计划的一个基本语法,其实很简单,就是加个spring,那么从3.0开始呢,它支持不同的展示啊选项,那我们大概有这么多种啊,像simple extend等等,那这个咱们一会呢,直接用代码来看一下它的打印信息,对每一种咱们都做一个了解。那现在咱们。最重要的是先把整个流程理解一下,那下面呢,咱们给大家画了一张图啊。这是一个执行计划,就从一个circle怎么最终转转换成一个RDD的一个过程,这个咱们是需要基本了解的,那比来我们来看一下啊,那一开始呢,我们写了一个circle,然后呢,有或者你用DF去操作,那最终呢。它首先会给它转换成一个逻辑执行计划,但这时候它是叫问决断的,也就是说他这边会做一些circle口语法的校验,比如说你的语法有问题了,在这一步他就能呃给你报错抛出来了。但是呢,为什么叫未决断呢?这个时候他不会去校验你的表明跟列明是否存在。
01:10
它只是从语法角度看看,比如说你少写一个逗号啊,啊,关键词写from写错了呀,等等等等啊是这种语法的校验,那之后呢,他通过这个catalog进行一个分析,这边分析主要就是校验一下咱们所写的表明列名到底在不在,还是说是你瞎编的对吧?那这个时候就会生成一个叫逻辑执行计划,这是逻辑计划,那逻辑计划呃,正常来讲这个时候就可以拿去跑了。但是呢,咱们要实现同一个。功能和结果搜索写法是不是可以有多种啊,执行顺序是不一样啊,那这个时候呢,它会自动帮我们做一个逻辑优化。比如说咱们经常搜经常谈到的一个词叫位置下推对吧啊等等这种就在这个地方开始做优化,那会优化后生成一个叫优化后的逻辑执行计划。
02:06
那逻辑执行计划优化完之后,还会去转换成一个物理执行计划。在这里呢,还有一步就是。它会基于CBO,也就是一个代价选择,选择相对代价比较小的,那么简单了解一下什么叫CBO基于代价,比如说啊啊,你跟有一个人发生了矛盾。那你现在目的就是想让他不痛快,那你有几种选择,第一种你可以当场去跟他对骂,对吧,骂。第二种,你动手打他。第三种啊,可能你呃比较偏啊,可能你啊受不了对吧啊,你拿起刀就开始要弄他了对吧?那其实这三种都会对对方造成一定的伤害对吧?那为了达成目的,哪个代价最小啊,肯定是说你简简单单跟他,可能当场跟他骂对吧,骂代价还好,那如果你打他呢,你是不是打赢了坐牢打输了住院了对吧?代价还是有一定代价的,那如果你说拿刀行凶。
03:12
报复他,那这个时候可能你就真的就是要坐很长的牢了,那综合来看咱们的代价比较小的,是不是现场跟他骂两句就得了呗,对吧。那他就会选择类似的,选择一个代价较小的来帮你执行啊,帮你执行,那最后中呢,它会生成可执行的Java代码,之后呢,就去执行转成RDD去执行咱们的任务了,这就是一个整体的一个流程啊,也是很清晰,其实这个流程大家会发现,其实。不仅仅是Spark circle,你像hi也好,或者那个。Flink也好,Flink circle也好,还有买车的也也好,那像这些它通通都有一个执行计划,也都是有这种所谓的逻辑计划,还有物理计划。
04:00
啊,都是这这么一回事啊,这个都大差不差的。那如果你嫌这个流程有点长,不想记,你就记下面这个,那么它核心的过程就是几个计划之间的一个转换,对吧?第一步得到分析,就语法解析,SQ解析,嗯,然后呢。做了一个优化生成了之后。生成了一个物理执行计划之后呢,基于CPU啊,就是基于代价,评估一下代价之后呢,生成代码,就简简单单是这么一个过程。那具体详细的执行计划该怎么看?咱们直接通过代码来观察,来,我们打开代码,里面有一个spring DEMO,来我们看一下语法。这边呢,咱们就是初始化了一下环境,然后呢,这个circle是两张表进行一个join。之后做了一个分组聚合啊,逻辑还是比较简单的,那我们来观察一下它底层。
05:03
到底是怎么执行的,那这边咱们把所有的显示格式都做了一个打印,我们一起来看一看啊执行。那么现在我们都打印完了,来我们上往上拉看一下。首先是是一个啥也没传呢,那他这边打印的有一个标头叫什么物理执行计划,那这边。就有了啊,打印这么一些,我们先整体了解一下,再详细去看啊,那第二一个传一个sample,它就也是打印一个物理执行计划,跟上面这个是一模一样的,一模一样的啊,没有区别,大家也可以看到那第三一个extend extended。这就会展示更多一点,它的所有的逻辑计划跟物理执行计划都能够看到,就像前咱们前面那个转换流程那几张执行计划它都有啊,我们看一下它的标头叫什么,是不是解析的逻辑计划就对circle解析完之后生成的。
06:07
然后这个呢。是不是决断后的,也就是说加了一些列明表明校验的逻辑计划,对吧,在之后是不是要经过一个优化对吧?它会生成一个优化后的逻辑执行计划,再往后。就生成一个物理执行计划。那基本上这就是所有的计划,那我们再看看其他的打印,这是打印物理执行计划之后生成的一个可执行Java代码,那这个咱们简单搂一眼就行了,你看就这么多,它都显示出来了。这个是特别长的,你看这边拉下来全都是。那一般你也不会去看这个了,对吧,你你看我so后才写了几行,它代码生成这么多啊,没必要啊,说实话没必要啊,另外一个呢,就是format格式化来展示一个物理执行计划,那这个它会有两部分内容,第一部分也是物理执行计划,但是这边不会特别详细,这个是一个大纲。
07:11
那么在大纲之后第二部分,他对这每一步都做了详细的展开,你看他打印这么多啊。每一步都有。啊,这个就是咱们几种罗,呃,打印执行计划的API啊,打印的方式,那我们在实际应用里面哪一个会看的多一点呢?啊,那可能是简简单单看一个物理计划,或者说你把逻辑计划也打开对吧?那如果你觉得物理执行计划格式看着不太舒服,你就用格式化的啊基本上这这几个用的会多一点啊多一点。好了,那咱们来具体聊一聊,那到底怎么看对吧。咱们就看这个最多的这个extended就行啊,再往往上找。
08:08
啊,Extended来这个时候呢,咱们对着这个流程图给大家做一个介绍啊。来那第一步。说将circle解析完之后,得到了一个未决断的逻辑执行计划,那这里面我们看看这里有啥啊,看执行计划的时候是从下往上看啊,从下往上啊,这是它的一个顺序,那首先第一步是不是一个子查询,咱们把circle也截截取出来吧,啊,这样好理解。好,你看首先他第一个先执行的是不是。这两张表啊,对吧,那分别你看是不是对应这两张表啊。
09:04
这个是叫什么?未决断的对吧?未决断的未决断就是没有校验,它的这张表到底存不存在,它没有校验啊,他只是拿了一个名字,那然后接下来他做什么呢?把这两张表做了一个join,那join的关后面这个就是join的关联条件,对应于咱们circle的这一行。啊,就这行。那最后呢,咱们是不是做了一个group啊,分组聚合呀,那我们可以看到这里。又到这是一个aggregate聚合。那其中的聚合字段是不是有一个叫cos ID,一个叫cos内,那对应的就是这里。这个条件啊,他。得到说是根据这两个字段,那在逗号分隔开的就是咱们要查询出来的一个字段,那对应的就是这三个。我们可以看到还是一个ID,一个name,还有一个什么sum聚合,这个就是一个简简单单直接解析出来,很直白的,那在接下来它会生成一个。
10:08
决断后的逻辑计划,那其实就是在这里,是在这一块做了一个分析啊。那在这我们看看跟上面的区别在哪呢?首先第一个你一眼就能看到这里。这行是不是携带了列的一个类型信息啊,这是因为他已经对咱们的列啊进行了一个校验啊,不简简单单是哪个名字,甚至他还会多一些东西,大家可以看到井号。这个数字呢,井号后面的数字代表是第几个列表里面的第几个列,那这个L呢,就表示一个long类型长整形啊,就是big in,这个我数据放的是big int。那包括呢,他们咱们在上的时候,他会帮我们做一些什么,你看cast类型转换啊。
11:00
那再继续看。你看他在蚯蚓的时候,这些字段也都分别标出了第几列,第几列第几列啊。再往下。这个最开始的时候,你看是不是列的信息全都有啊,对比于上面是不是简简单单一个表明,还有呢,你往右拉。是不是全都有?而且还显示的是PA的格式,对吧。这个就是咱们分析后的决断后的一个逻辑执行计划,那接下来咱们还需要执行一个什么优化啊,优化就是这个。那这里有什么优化,我们简单直观的能看到是它这里是不是自动帮我们做了一个过滤啊。对吧,当然不仅仅是这个,还有类似什么位置下推啊等等这些都可以做啊,就是逻辑优化做的事啊。那逻辑计划生成之后,就来到了物理执行计划。物理执行计划才是真正回头咱们要执行的一个大概的顺序啊,这个还相对来讲是比较重要的,咱们最核心的就是分析它。
12:11
那这边给大家解读一下这个物理执行计划怎么来看啊,怎么来看,首先它前面有一些小括号,还有数字,这个就代表执行顺序啊,就是谁先执行啊后随后执行,那比如说他先开两个表示的是什么呢?他们的缩进量是一样,就说他们是同时执行的嘛,是并行的嘛,啊那这边做了一个什么呢?是不是文件扫描。对吧,扫描一个,然后哪张表哪些字段,然后。模式是P。再往后。还有一些它的文件的位置信息,这边全都有啊,这说白了就扫描文件啊,扫描文件下面这个也是一个扫描文件,那扫描完之后做了一个过滤对吧?这个是前面优化帮我们做的事,那接下来这个project是什么意思呢?你可以理解为是一个列裁剪。
13:05
啊,选择列嘛,说白了就是select,你会需要用到的是哪些列,那这边它只列出来四个列,大家看到没有,你结合circle来分析。为什么是这四个列呢?因为咱们每张表字段不仅仅是这些对吧,下面可以看到很长,那么。首先join是不是要用到这个I所谓的ID字段呢?啊,他就把ID保留了啊,就是说我要把它查出来,那还用到了DTDN这两个字字段,它是不是也要用啊,那为什么有一个内吗?因为它分析到咱们后面。是不是要用到这个cos内,所以他把这个字段也保留了,这个就是一个project啊。只选择出需要的字段,不需要的他没有查出来啊。那这个也一样的,那在之后这里我们可以看到做了一个什么呢。广播的沙。
14:00
Broadcast exchange,其实这个就是一个广播啊。因为这里会剩大小嘛。啊,这咱们下后面也会介绍到啊,别着急,这就是跟广播相关的啊,那之后呢,这个就是一个广播哈希join这两张表进行的是一个广播交运之后生成的一一张新的临时表,就这里吧。包含了这几个字段要用的,在之后咱们是不是分组聚合了呀,那聚合的话在物理执行计划体现为什么aggregate这种。这种就是聚合,那一般呢,大家可以看到它是不是出现了两个呀。是因为Spark circle呢,它会自动帮我们提前预聚合,就像MR或者have说的那个提前combine一样的,所以这第一个呢,就是单个reducer内部进行一个聚合,一是change呢,就是所谓的数据交换,也就是沙。Change咱们可以等同于理解为这里有一个沙否,那在这里呢,就是它的分区器嘛,它是通过哈希来分区啊,那这个就是沙否之后的reduce内部的一个。
15:13
聚合。这个就是一个物理执行计划。那后面这个代码呢,你感兴趣你可以去看看,咱们这里就不多去啰嗦了。那下面这种就是把它详细展开,把每一步都单独拎出来,把它展示出来,对吧,这个大家也可以去看一看啊。那还有其他,这里可能没有显示出来,咱们也可以看看哈希aregate,刚才提了,就是有聚合运算嘛,一般是成队出现,如果伴随着group的话,又有一个沙uffle啊,一是劝,就是沙Le。Project就是投影选择列啊列,裁剪。还有有的咱们现在是读文件嘛,它是如果是直接扫描have表的话,它是local table sc对吧。
16:06
好,这是一个执行计划啊,大家首先要看得明白。多看几遍。那我们看执行计划,其实还有一个更方便的,就是通过web UI来啊,通过web UI来,那这个时候就需要真正的去执行程序了啊,不能说explain。那我。嗯,这样我后面加一个死循环,因为我要在idea直接运行直接看嘛,如果你是提交到集群的话,就没必要你通过历史服务器就可以看了。哎,我。打开一个死循环,然后其他的都先不要啊,然后这个。然后考一个先做掉。删掉,也就是说咱们是实实际的去执行了一个搜Q语句,然后咱们这边展示一下结果啊,这样子就不是单纯的只看执行计划了,那这样的话,咱们沃BUI在执行的过程当中,他也会给我们生成一个呃,图图形式的一个。
17:17
执行计划也是非常的详细啊,那个的话可能会更舒服一点。来,我们重新执行一下。那我们尝试着来访问一下运行时的一个端口,4040。对吧,那我们点一下这个等他。执行。那大家可以看到上面这里是不是有一个circle模块啊,那我们点一下。这边有两个对吧,你点一个受这个。那这个应该说是在咱们工作当中用的比较多了,你可能是在观察已经执行的任务,执行计划是怎样的,那这个时候你就可以通过web UI来看啊,那你可以看看这边你看是不是一样的,先读取啊,扫描啊,扫描进来之后。
18:13
这里是不是还有一些数据统计啊,对吧。那这个什么code是那个生成代码嘛,啊生成代码那之后呢,帮我们做了一个过滤对吧。过滤完之后选择列就列映射列裁剪之后呢,这里有个exchange,是不是一个沙或者一个呃,交换数据啊啊,这是一个交换数据。那另一张表是不是也是一样的,读进来,然后有行列行的信息,对吧,有多少行。鼓励。过滤完之后选择D,选择完,然后这俩是不是就交到一起去了,对吧,有个数据交换,那之后呢,交完的结果表再取一个结果,再之后呢,大家注意看呢,这是什么本地聚合。
19:00
我们说了,哈希。Aggregate是不是成对出现了,这就第一次嘛,本地聚合在杀Le之前有就就咱们刚才讲类似于这样,比如说如果是MR这种思想是不是map reduce啊,这是reduce端,呃,那正常来讲,咱们的聚合如果是MR的话,它是放到reduce这一阶段,就把所有数据拿到,分完组拿到,然后再去聚合,那6OSSPA狗它会先在每一个map内部,哎,这里提前预聚合,这里提前预聚合,这里提前预聚合,然后他出去的数据量是不是就少了呀?啊然后数据比如说这三个的话,只有三个结果在这在同一个来讲啊,同一个组来讲,那是不是。同一个key是不是只需要聚合三条就行了啊,它就这么一个,呃,自动帮我们优化了,那接下来就是所谓的shuffle了,Change啊,那这边有详细的记录对吧。Right,对吧。接下来是。
20:00
录到reducer端啊的第二次聚合。啊,还有一些时间的统计啊,还有一些内存啊等等,那最后呢,Collect把它收集去,这个是咱们那个受啊受好,这个就是咱们通过握U2来看这个是不是更直观了,对吧,而且有一些详细的信息,那么大家未来呢,也可以主要来看这个,但你也要看得懂啊,每一个跟之前讲的都对应的啊,你要看懂每一个是干啥。
我来说两句