00:00
那么接下来我们看介绍一下3SPARK和3.0的一个新特性,AQE,那我们最一开始的时候也说到了Spark3.0有一半的改进跟优化是集中在circle上面的,那重点呢就体现在咱们的AQ上面。那其中第一块功能呢,就是咱们的动态合并分区。动态合并分区呢,就是自动呢,感知和调整咱们的分区数。那这个咱们前面也分析过了,就那个合理利用CPU资源那里啊,就是咱们默认circle的沙普并行度是不是200啊。对吧,那那还有一个,咱们说这是它的一个并行度,咱们还考虑一个并发度,就是总的和数啊,总和数我们说他们做中间最好是吧?呃。Task的数量是总和数的二到三倍,效率比较高,对吧?啊不会不会造成一个浪费,那么如果咱们的分区太少,也就并行度太低,那每一个分区的数据量就大了。
01:07
那处理这每一个处理这么多的数据呢,可能就有点压力呢,甚至要发生一些,那这样呢,咱们的执行效率就降低了,那么如果咱们设置太多,分区数设置太多,也就并行度太高的话,Task数量太多,那可能每一个task处理的数据量才一丢丢,那这样就有点浪费资源了,而且呢,咱们涉及到数据传输的时候,就大量的来回交换。读取大量小的网络数据块啊,那这样的话,咱们整体的一个IO效率是比较低的,因为每你是不是得有开销开根关对吧,你得开关,每个task都得开关啊,浪费这个开销。那所以呢。咱们结合3.0AQE,咱们可以一开始设置较多的分区个数,然后让它自动去调整啊,让它自动去调整,那这边有一个小案例啊,咱们理解一下,咱们做了这么一个查询,Group加max是不是要产生一个沙uffle对吧?
02:05
那么这个时候呢?如果呢?只有两个分区,数据量比较大,一开始假设我们设成五个分区,如果没有ake,没有AQ,是不是得启动五个task?然后来处理啊,但其中咱们说只有两个有比较有数据,其他的基本没啥数据,那这几个呢,到后面是不是出现一个空转,有点浪费啊,那如果开启了AQE呢,它会将什么呢?这三个比较无关紧要,它会合并成一个。他要把它们合并成一个来处理。那咱们就来具体聊一聊吧,咱们首先了解一下参数啊,首先看一下Spark的官网,我从头点进去给大家看啊,这是Spark官网,点文档,点老版本,选择3.0。之后呢,点右上角这个more.configuration好,那么从上面的总纲呢,我们能看到一个Spark circle,呃,这个分类,那在有一个运行的或动置一就置,那么主化这个动的这里运行时的参数啊,点一下那这一块就全都是了。
03:17
那我们要设置这个合并分区,咱们看一个案例啊。再给到大家AQE这个包,下面咱们先看这个a q e partition自动合并分区。那我们先看一下主要的处理逻辑啊,处理逻辑就是咱们以前那个查询出三张表,然后呢,把它们做一个join。圈起来。那在这边为了一个演示效果,咱们把这个广播就禁用掉啊,咱们标注一下,为了演示效果,哎,利用咱们的广播就好。那接下来我们要开启AQE,必须打开第一个总开关。
04:00
A q e enable,把它制成two,默认是false,这是总开关啊,所有的AQE功能都得把它打开,接下来我们合并分区有这么几个参数啊,第一个呢,这个是不是cors chorus partitions en na,这个是合并分区的开关啊。这合并分区的开关,那下面这个呢,合并分区的初始化分区数,也就是说一开始啊设成多少,咱们应该还记得Spark circle默认并行度是不是200啊,是另外一个参数对吧,也就是说呀,如果咱们。这个参数不去做设置的话,它默认的值就等于circle的并行度200,那如果设置的话,那就按照它来。啊,我们一开始设的很大,不要紧,它会自动合并,那自动合并呢,那到底合并成几个呢?还有,合并后每一个有多大呢?这由下面两个参数来决定。这个呢指的是最小分区数,也就是说不管你怎么合并,那么最少要剩十个分区啊,这是指定一个最小的分区数啊。
05:09
啊,咱们写一下合并后的最小分区数,这个是初始的并行度。那还有一个,那既然只是一个最小值,它并不是一个精确的,那你剩20个分区是不是也是满足大于十啊,这个值是咱们指定的,那接下来就有另外一个参数了,每一个分区咱们期望它能是呃,是多大?就是咱们的一个期望对吧,他会尽量将呃分区内的数据合并到一个分区,最大二十兆。这样子。啊,那通过每个分区的大小,我们它就可以计算出需要多少个分区啊。就嗯每个分区和呃合并后的分区,呃希望有多大。
06:12
啊,基本上就这么几个参数,咱们一起来使用,那么如果官网呢,你在这也是能看到的啊,像官网咱们刚才点开了这里有一个AQE默认呢是false,咱们把总开关打开的,还有一个呢,咱们把动态分区啊,动态合并分区,它默认是打开的啊,当然咱们只是写出来看一下这个默认打开。啊,还有咱们刚才的初始化的分区数。那么这里可以看一下。那初始值对吧?By default,它的默认值等于什么equals这个。这个咱们一直在调整分期数的那个参数,默认它就200呗,他没设那就等于200,或者咱们之前改成36了,他没设,那它就等于36啊。
07:05
一开始尽量设大一点啊,还有最小的分区数啊,最小分区数。还有一个最上面希望每个分区的大小,每个分区期望能达到多大,那咱们呢,就把它提交来执行一下啊,看一下效果。提交。那么我们等他执行完,我们来先回顾一下,之前没有使用AQE动态合并分区功能的时候,它是一个什么现象,是不是都是200个呀,对吧?呃,我记得咱们最开始也是讲到一个分区数的问题,哎,Partition DEMO,看一下这个代码。Partition DEMO这里是不是啥也没做啊,对吧,也是禁用的广播就引。然后呢,下面也是查三张表,然后呢,做一个什么三张表的就没了,逻辑是一样的,刚好做一个对比。
08:07
刚好做对比。我们瞅一眼他。呃,点进来。大家可以看到两次join的shuffle的时候,后面都是生成了200个分区,对吧。都是生产200个分区,那我们等当前这个执行完,再对比一下,到底有没有帮我们自动合并,或者咱们现在直接看雅安呗,别浪费时间对吧。点开。那么大家其实在这儿可以看到现在是多少啊。没有200吧。那个200默认并行度那个参数咱们并没有修改,所以应该还是200,但是开启了AQE之后,大家可以看到这边所有的都没有200了。再刷一下。
09:01
等他跑完吧,我们一起看,不然太卡了,好,执行完了,我们来看一下历史服务器吧。最新提交的,诶。啊,没翻页对吧?啊好,这AQ的这个我们瞅一眼它的一个分区情况。那这么多个作业呢,咱们点哪一个。点最后一个瞅一眼。这个看一下。我们看分区数就行了,你看这分区数多少个63也非200,咱们跟前面那个做个对比啊,前面那一个呃,Partition。Partition DEMO这个这个任务。啊,它是这样的,只有一个啊。那咱们当前这个。翻页。
10:01
点一下好。每个值跑了一个stage对吧,别管多少了,咱们就看这个就行了。的克数这边呢,完全没有这个200跟200的。就是它自动帮我们实现了一个合并分区,那这个中间的15还有63,它怎么来的呢。就是咱们根据刚才咱们那个参数啊,刚开始呢,它是有1000个分区,那么后来呢,它自动帮我们小的那些分区数据合并起来,合并到一个为20兆大小。一个20兆。一个20兆之后呢。那这个数量它一除,可能就是这边需要15个,这边需要63个,同时15跟63是不是小于咱们设定的最小值时啊,哎,这就是自动帮我们合并分区了,那么来瞅简单瞅一眼,它写出了一个大小。
11:05
你看他帮我们沙uffle写出去之后,读取之后,读取的大小是不是都是才18兆啊,接近20兆对吧,他如果再合并一个就超过20了,所以才才没有接着合并嘛啊。最大不超过20嘛,那这些都是了,自动合并分区,但是还是比较非常好用的一个功能。你也可以看这个写入的文件数啊,那我们看一下这个写入是哪一张啊,D1啊D一来瞅一眼。啊,这个已经没用了,第1.1。那么大家可以看到每一个文件是八兆,但是经过咱们的帕加snap才五套多,所以你在HDFS上不能直观的看到啊,他们那个合并成20兆,指的是序列化,也不考虑式存储原始的数据大小。
12:02
啊是这么一回事,那么这个这里呢,咱们再顺带介绍一下咱们那个。一个动态调整资源啊,动态申请资源,那这个参数呢在这里。咱们找找哈哈。Dynamic。在这里动态申请资源,那他呢就会帮,比如说咱们提交参数指定的exeor是三个,然后呢,他每个盒是两个,然后呢,它为了提高效率,它自动最大化的帮我们去申请呃的数量,那这个有一个总开关,呃动态申请的开关默认false,我们把它打开。那还有其他的一些指定最小最大的还有初始化的个数,那我们现在也不去做了,我们弄一个默认值来看一看。那但是。要去体会呢,咱们必须还开启一个杀跟踪器。
13:04
他帮我们申请多少呢,他得结合这个沙Le跟踪器来使用啊,这样会比较准确一点,但是呢,他目前标记为什么实验项啊。我给大家翻译一下啊。位执行器,执行器就ex启用沙Le文件跟踪,允许动态分配对吧,而不需要外部的杀Le服务啊,咱们就不需要外部的杀否服啊。总而言之呢,咱们来感受一下呗,我这边又写了一个类啊,前面的参数一模一样,后面加上这个。两个参数,然后呢,我们来提交一下,大家注意看啊。这边我的提交参数是一模一样的,都driverva不用管对吧,Ex的数量都是三个合数呢,都两个,不要给太高啊,因为他还要往上申请,不然集群资源不太够,内存都是给的两个G啊。加了两参数啊,加了两参数,我们提交执行试一下。
14:06
那我们来养上,看能不能看到效果。点开。刷新稍等一下啊,正在运行中。好,那其实我们稍等等啊。好,现在其实我们可以看到当前执行中的task有几个是八个,你想想咱们提交参数啊。现在一并并发度居然变成了八呀,但是我们提交参数是不是每个两盒呀,三个一共才六啊,他现在跑了八个啊,比我们设定的还多。那这个时候你看一下executors这里看一下executor的数量,是不是咱们指定了三个呢。
15:05
有点慢。哎,大家可以看到ECU的数量是不是足足有七个,咱们一开始可是只设了三个,而且这些当前都是活跃状态。这个就是它会自动帮我们去申请一个资源。估计快跑完了吧。而且你看现在并发达到了多少14每一个才两盒啊。他每个也是给两盒,他现在帮我们起了七个,而我们指定的参数才给了三个,多给了四个,所以这这种东西呢,嗯,也。
16:04
要不要开得看你的情况,什么情况了,你的资源够不够,这样有点奢侈,同学们。它自动帮你往大的加,往大的加,那你这个就无法估量它会占用多大的,而且它尽量怎么帮我们增加呢?我们来瞅一瞅。他会尽可能的申请,尽量让我们每一个task探用一个和,这样子我们可以看一下它的执行的时间线。大家可以看到它分布的很均匀。看到没?尽量满足一个task斯克。他用一个和。对吧,那如果还有task没有何用呢?那我就继续申请一次Q,一直到我申请不动为止,那你想想这个开启这个功能还大家还是得掂量掂量对吧,那你像这个task它等到这个时候才执行。他等到这个时候才执行,是因为集群实在申请不到资源了,那然后呢,等他跑完了,空出来一个,他接着去跑,最多帮我们申请了七个,那是因为我的资源就那么多。
17:08
你也可以看看洋洋基本都刚才跑的时候应该是都被占光了。所以这个大家去衡量吧啊,去衡量一下动态申请资源,没钱的话尽量少开啊少开。
我来说两句