00:00
那么结合咱们前面讲的那个执行计划的执行流程,相信大家还记得是不是有很多个执行计划,其中还有他帮我们做了一些优化,对吧?我们先来把这张图截下来啊,这张完整的图好再切到这,咱们第三章节Spark circle的语法优化呢,咱们就是来研究一下它这一块的过程,到底帮我们做的哪一些,分为两块,第一块呢,就是咱们这个逻辑。执行计划,生成一个优化后的逻辑执行计划,首先是这一块,那这一块它主要使用的就是一个叫r Bo。基于规则的优化,R就是ruler嘛,对吧,规则的单词嘛。那它呢,其实就是像咱们常见的经常说的啊,有什么位置下推啊,列裁剪啊,对吧,就是行列过滤这些事儿啊,减少数据集,还有一些常量替换啊,避免一些不必要的小计算啊,更高效,那其实他这边r Bo的规则里边,他给我们这边Spark搜的话,应该有80多个规则,那我们具体总结起来啊,它分的特别细啊,总结起来可以分为三大类,第一类就是能提前过滤的就提前过滤,第二类就是。
01:18
只选取需要的列,它体现在方方面面。还有一个。常量替换啊,把一些结果是固定值的,直接用它的结果值来代替,这一块就是咱们的一个r Bo啊,基于规则,或者有的叫做呢,基于启发式的,那还有一块呢,就是咱们在物理执行计划。生成之后,它会选择代价比较小的,就前面讲到了这一块,叫c b c Bo啊,基于代价的。优化啊,这两块咱们分两块来看,那咱们先来看这个RB啊r Bo。
02:07
那Spark呢,用的是一个catalyst啊,这么一个解析器啊,解析器完成咱们整个流程啊catalyst,嗯,行,那咱们先看一个位置下推,什么叫位词呢?位词呢,其实就是像咱们join on里面,比如说你写一个ID大于EID大于二,那这个就是位词了。这个就是位置,还有一个就是VR,比如说你写一个VRID大于一,这个也可以理解为是一个位位词,说白了就是过滤逻辑啊。那它位置下推的作用就在于提前执行一个过滤,减少咱们下游处理的数据量,这一点说起来简单,但其实是非常关键和重要,那其实在咱们的have里面也有这么一个位置下推的规则,对吧?像我前面也总结过啊,也给大家说过了这个事儿啊。
03:01
位置下推,或者说其他很多框只但凡涉及到circle,基本上都有涉及RB跟CPU这两个玩意儿,对吧,像flink circle它用的是不是一个。Cataly。Care set对吧,他用的是开赛。好,那我们来直接的来看一下代码啊,这边给大家举了一个例子。位置下推,那这边咱们看看啊,这边初始化环境,然后呢执行几个circle,咱们这边呢,是做了各种场景的打印,给大家做了一个测试,那我们首先来看一下T这边的circle主要就是什么,一张表供引上另一张表啊,一个是c cost,一个是Co shopping cart啊,反而就是这两张表啊。那他们。关联条件啊,是这么几个啊,有一个课程ID,课程ID,其他的这两个DT也好,DN也好,是一个分区字段,咱们准备的数据都只有一个分区,虽然使用了二级分区,但是都只有一个,呃,这个给大家一起看看吧,像刚才就是这张表跟这张表就啊。
04:16
一个接近五个G的一个三兆行,咱们看一下数据库里面。You have warehouse Spark tenny啊,那比如说看一下小表,这个点进来有一个分区叫DT啊,其实咱们准备的数据只有一个,没有那么多啊。点一下这是第二级分区DN啊,也只有一个分区啊,再点进来,这就咱们小表的数据啊,咱们用的存储之后是剩130多K了啊,原本是三兆对吧。再回头看一下另一张表,就是这个。嗯,Csc啊。也是一个分区。
05:00
第二集也是一个分区对吧。这也是趴回的好。嗯,那接下来就没啥了,那最关键的就是这个地方了,同学们,咱们现在用的是什么了?Inner join。然后将。呃,还加上了一个条件啊,对于一个ID做了过滤,那这个东西呢,咱们分情况,一个是写在on后面,一个写在where后面,那我们先来试试on呗,啊,这个是on啊,行啊不,那应该用and来连接就行了,对吧?那下面这个咱们也是一个inner join。然后这个过滤条件写在where里面,外面的where里面,那看看他们的执行计划有什么区别啊,那再看看下面。下面这个是用外观连left join。然后呢?也是一个写在on里面这个过滤条件,另外下面这个就是写在where里面。
06:09
那这样吧,咱们这个执行也不需要太多资源,我先挨个来看,好吧,咱们先把下面。呃,Left的全住掉,也没必要去集群执行了,那太慢了对吧,还要启动啊,那咱们直接ID跑,那这个时候呢,咱们把这个set master local星把它打开好。咱们来执行。直接在这看他的执行计划打印,大家就能看到了,我打印的是extend啊。并且我也把结果售出来了啊,售出来。执行完了,我们来瞅一瞅呗,我也做了一些标题的打印,对吧,首先是inner。然后呢,把咱们的过滤条件写在on里面,那我们看看这个执行计划啊,执行计划来我们挨个来分析,这个是未决断的一个执行计划吧,对吧,未决断的就简单,我们看一下这边是不是少一张表,扫另一张表,然后对他们做一个join。
07:15
那这边是不是就是他们的过滤条件呢?大家能够明显的看到过滤条件这个时候是不是就在这里啊。是不是扫完表才就过滤了对吧?好,那在接下来看这个解析后的一个执行计划,解析后就是加了一些字段信息啊,你看就。他还是少两张表,再之后呢,做了一个join。Q蚓之后呢,咱们这个过滤条件还是在这里对吧,还是在这里,还是在Q蚓的时候采取过滤,那么接下来我们重点从这里到这就要经过一个r r Bo的一个优化了,那这边咱们主要体现一个位置下推来往下筹,换个颜色吧,大家喜欢的红色啊,那首先我们来瞅吧,呃,第一个看这一块。
08:10
你看他。干了一个什么?它首先会自动帮我们每一个关联字段,咱们泵里面不是有三个等吗?对吧,一个是ID关联,另外两个是分区字段,我过意写上的,你看它每一个关联字段会帮我们自动过滤掉闹纸啊,所以这边大家注意一些细节,对吧,它会自动帮我们过滤纸,另外呢,就是咱们写在on里面的过滤条件是不是提前就过滤了。对吧,他是在扫表的时候就将它过滤了,那这样的话,他是不是等这读取这张表的时候,数据量已经根据需要减少了,那我们再看另一张。啊,这两个是重复的啊,重复的那我们看一个就行,是一样的,大家对比一下啊,一模一样啊,它也是读另一张表,然后呢,先进行了一个field先过滤,同样的还是那三个关联字段都做了一个is not not过滤,然后将咱们的过滤条件也一起过滤了,那这两张表都读取到之后。
09:16
干嘛呢?也就这这个是一张表吗?这个是另一张表吗?啊,那最终他们做一个join,你看join里面就没有那个小于二的那个过滤了,因为呢,每张表在读的时候都进行了过滤,那你看这样的话,相比于最早没优化的时候是不是好多了,最早是两张表所有的数据扫进来,扫完之后。去灸,灸引之后再去过滤。交你的过程中才去过年,这个时候可能就为时已晚了,对吧。这个就是咱们所谓的位置下推是写在on里面,咱们再看看写在where里面。
10:00
什么?我把SOHO写上吧,不然大家可能看的有点迷糊啊。下面这个对应的就是这。对,咱们把这个过滤条件现在是写在where了啊,不是on,然后再往下瞅。呃,前面不啰嗦了,咱们直接看到优化的逻辑计划这一块啊,优化的逻辑计划,那首先我们看未优化之前。这边同样的是一个什么扫描表,这边也是一个扫描表,两张表扫描完之后做一个join join的时候。是不是先进行join呢?Join完之后再进行过滤,因为咱们这个V的执行顺序是不是在join后啊啊,也就是说在后面,也就是说这个执行完了先两张表完全关联好了之后,我才来对这个蚯蚓后的结果表进行一个过滤,跟刚才也不太一样,对吧。
11:00
这是未优化,那你再看看优化之后啊。是一张表。那这个。读的时候就进行了一个什么fit,而且一样的三个字段都是is not not过滤,另外呢,还有这个条件,再往上看另一张表啊,下面是一个重复的分片操作,无所谓啊,咱们直接看他这个复用了,这个他扫表的时候是不是已经帮我们做了一个什么。判断了对吧,Is not not is not not,而且后面还有。啊,其实下面也能看到,你看。下面也能看到。椅子,Not now,然后小于二已经提前过滤,也就是说这里提前过滤了,这边也提前过滤了,他们是都过滤完之后再来执行一个什么呢?Join。啊,就。
12:01
那这样的话是。先提前减小了数据集再去救援的话,那效率就会好一点了,对吧。这个就是咱们的一个。R Bo优化,那其实对于内连接来讲,咱们就能发现了,不管是写在on还是写在where,是不是都会对两张表同时进行过滤,大家注意咱们过滤条件只写了其中一张表而已啊,我写的是左表小于二,但是它同时会对右表也做一个过滤,因为你是内连接嘛,内连接是不是两边都有才能join引上啊,既然左边都限定范围了,那你右边是不是肯定也是相同范围你才能交准上啊啊,所以他既位置下图的优化将我们两张表都进行了过滤啊。这是一个inner join。
我来说两句