00:00
接下来我们看6.3,呃,咱们前面聊到那个4.4 join数据倾斜优化的时候说了我们可以。参数开启AE对吧。其实就是指的这个啊,那我们看6.3,那么当我们有数据倾斜,我们看一下这个啊,表A跟表B做一个join啊,大家注意是join的时候啊,那其中它这边有一个join的关联条件啊,数据量比较大,也就出现了倾斜嘛,那它会自动帮我们实现打散再join。诶,这个比如说打散成两个,那对方是不是也扩容成两份跟他对应起来,这就相当于说自动帮我们实现打散大表的key,然后呢,扩容小表的key啊,这个功能呢,就不需要咱们自己再去写了,直接呢用它来动态调整就可以了,那我们直接来介绍几个参数啊,第一个呢。我们要打开。清洁灸引的功能对吧。
01:03
那我们说打开它之前,我们得打开AQE的总功能啊,AQE总功能。A k me啊,它反了另外一个几个参数不太好理解啊,第一个呢是一个比率。这是一个比例,一个因素,一个比例默认值是五,它是用来判断数据是否发生了倾斜,它不是所有任务都会帮我们实现,呃,一个倾斜的,它是有判断条件,第一个条件就是这个倍数。那他怎么判断呢?呃,比如说咱们这边有三个分区,呃,那这个是十兆。这个三兆,这个一兆,那一共是不是三个啊,它会取中位数,那中位数是不是中间这个。然后呢,用中位数乘以这个参数值,也就五三乘以五等于15。对吧,那它如果这里面有某个分区的数据量大于这个值乘以倍数之后之后的值,那么这就是判断倾斜的条件之一啊,说明他倾斜了。
02:09
这第一个条件啊,找中位数,一会咱们看执行过的案例来判断一下啊,那第二这还有一个参数呢,就是这个。咱们判断倾斜必须两个条件同时满足啊,这个的意思是单个分区的大小大于这个值,单个分区大小大于这个值,那么就判认为它倾斜了,两个都满足,那就会自动开启优化倾斜的功能。那最后一个呢?咱们就是期望打散之后的一个分区数是多少,这跟咱们前面动态合并分区那个参数是一样的,就是单个分区你期望它是多大呀,前面是合并之后是多大,现在是倾斜打散开,因为咱们也没指定说打散成几份嘛,啊,这个肯定不好指定,那咱们就通过这个单打散后单个分区的大小来控制啊,就这么几个参数,那咱们先来回顾一下原先的一个案例啊。
03:10
原先的案例的话,我看看。嗯,我想想啊,咱们用还是用partition DEMO那个吧,啥也没调那个吧,那个是不是有听写啊,到第三页了都。Partition DEMO这个也是三三张表join,然后呢,没有做任何参数的调整。啊,点开。啊,你看这有200,这200啊,分默认并行度200嘛,这个不是重点,点开我们可以看到时间线上面有一个倾斜,对吧。这也是发生的一个倾斜啊。好,截个图。另外呢,我们看看它的判断,Shuffle瑞的最多的是达到多少呢?你看我用降序啊,你点一下这里啊,让它降序,呃,这边是不是有两个数据量明显大于其他的,其他都一兆1.5兆,这几个接近30兆对吧?好,我们把它截个图。
04:09
其实这个就是咱们前面采样key所知道的一个应该是1011个103对吧?啊有一个倾斜,好呃,那么接下来呢,咱们看一下咱们怎么来做调整。首先呢,咱们演示清洁的时候也是禁用广播交引,那为了演示咱们也把广播交引禁用,那么第二一个呢,咱们先把合并分区给关了,因为它默认是不是啊对吧,不要影响咱们的一个观察一个效果,第三一个。AQ,总开关要打开,第四一个开启动态优化的功能,还有这个就是中位数。啊,不,这个就是中位数要乘的倍数判断条件之一。那这个就是第二个参数。要大,单个分区数据量大于它,那就认为倾斜的两个条件同时满足才会帮我们优化,那么最后一个参数就是之前那个了,我希望打散之后每个分区是多大,那我这边随便给了一个八兆对吧,给小一点。
05:17
好了,那基于这个情况,大家来看看。举个举刚才这个例子,这个中位数我们再理解一下啊,就这个中位数五倍的这个东西,这是咱们刚才那个倾斜的例子,呃,那咱们总的是不是有200个task啊,那中位数是不是应该是100啊。所以我们要看。排完序之后先排序啊,排完序之后第100个它是多大,那比如说我们看100。往下拉。拿到最后的100是不是1.2兆啊。对吧。中位数是1.2兆,那1.2兆乘以五倍是不是等于六兆?对吧,那前面几个倾斜的是达到了什么呢?28兆。
06:04
28兆是不是大于这个六兆,所以就满足了第一个条件啊,同学们是这么来判断的中位数啊。按照数据量排序,然后取中间的那个值啊。中间的那个task,看它是多少,再乘以这个倍数跟呃,然后做判断条件。行,那我们知道这个五倍是可以,呃,是满足条件的,另外呢,咱们前面的这两这个20兆,为什么呢?因为咱们倾斜的这一部分是不是28兆啊,那我设成20兆,他们是不是也大于20啊,那这个时候两个条件就都满足了,好废话少说,咱们来直接执行,看一下优化的效果。
07:00
等他执行完吧,执行完了他们怎么来验证呢?它不是自动打散,那我们不是原先这里有200个分区,200个task嘛,那如果自动打散它是不是大于200啊,那比如说它打散成几份的话,两百零六两百零九对吧,从这咱们也可以看到,另外我们可以去看看有没有这种大长条啊,大长条也可以看看数据量,还有没有2828对吧,从这里就能够观察到一个直观的效果来走看历史服务器。呃,刷新最新的这个二八点进来我们看一下分区数先。这边是变成206了,说明它其中的两个大的。就101103,本来是各各自一个对吧?呃,然后他把它打散了,打散成几份,他也打散成几份,所以呢,咱们总的task数量它是增加的啊,那么看看这里的执行时间线还有没有那个倾斜。
08:06
啊,看他。可以看到基本没了吧,那有同学说这不还挺大吗?那是因为我们打的不够散了,对吧,你可以打的更散一点,你可以把那个合并后的分区大小设的更小,那至少没有这么长吧。对吧,N长啊,这些都比它短了,那我们看一下这个数据量。呃,我们还是排个序,上序,你看合并到多大呀,八兆八兆。呃,13兆对吧,这是由咱们这个参数决定,咱们期望啊,合并成呃,打散之后的每个分区达到多大,是不是达到八兆的大小,对吧,没毛病啊。这是咱们动态解决分区。啊,不动态解决数据倾斜,就远时候的数据倾斜,对吧,由这么几个参数来决定,那么其实。
09:03
这个东西大家会发现它其实两个东西有冲突,什么东西呢?合并分区。跟咱们的KI join。有什么冲突呢?如果我合并了分区,是不是会影响这个倾斜的判断?就是先合并的话,那分区每个分区大小是不是变大了,那是不是会影响它的判断,那么如果是先打散。那再合并那意义何在呢?对吧,那这个东西呢,其实结论是什么,它确实会先合并,我们给大家做一个演示啊,我们把这个合并分区的功能打开,然后呢,咱们再重新打包,再重新执行,观察一下效果。看一下它的分区数的变化,还有还而且看一个有没有倾斜。好打包。
10:00
现在打开了啊打开。我们把这个包上传一下。上传,然后呢,快速的再提交一遍。提交完之后,我们来做一个对比,我们还是先等他执行完。听完了,我们来看一下。啊,最新的这个29。我们观察一下呢,这个分区数是不是少了很多呀。少了特别多,那我们这里我们无法判断它到底是先合并分区再解决倾斜呢,还是先解决倾斜再合并,我们看一下那个28兆的还在不在啊,看这个小的这个。看他。那其实是还在的吧。
11:01
来,我倒叙排一下这个数据量,从这比较直观,这俩28兆的是不是还在啊,说明完全没有触发合并分区,这是为啥呢?咱们一起来判断一下,嗯,首先第一个参数是不是五倍的中位数啊,我们先找中位数,一共36个,那是不是看第18个呀,或看19个对吧,我们往下看。嗯,现在展示20个,我们往下拉,二十十九十八你看。他先帮我们进行了合并,合并之后呢,是七兆,那七兆乘以五倍是不是35兆啊,那倾斜的分区他们的数据量是28 28小于35,不满足这个条件啊,所以他不会帮我们自动解决这个倾斜,所以大家要注意了,一起用的时候啊,是会出现这个问题的,呃,当然因为咱们的倾斜程度也不大对吧,才几,咱们表数据量也小,才,而且呢,倾斜才28兆,说实话没啥问题,那现在演示效果,我们再来一个,我把倍数改成二。
12:06
啊,我把这个倍数改成了二。哎。我们再重新执行倍数改成二的话,按照刚才的条件,同学们,呃,中位数是不是66.9啊,我们按七兆来算嘛,乘以20不是14兆对吧?那我们倾斜的分区有28,两个都是28,那是不是大于14啊,满足条件另外一个28是不是大于那个单分区的判断20兆啊,咱们设的20也满足,所以应该是能帮我们自动打散的。我们再执行一下,看一下就知道了。嗯,这是打包了吗?啊,打了。来替换一下炸包。好了,重新执行,执行完了我们再看一下历史服务器。呃,他的执行情况做一个对比。咨询网友们快速来看一下最新的30这个。
13:07
那我们可以看到它的task的数量跟上面之前也不太一样了,那我们观察第一个蚯蚓的地方有没有还有28的啊。点进来,呃,基本看起来呢,好像还是比较均匀的吧,那我们看一下这个具体的数据量来对比。哎,降序你看。都只剩八兆多了呀,对吧,不再是两个28了,同学们已经被打散了,其实这个就是他把我们打散之后的分区大小,那你看看其他都多少,都七兆六兆。啊,甚至有四兆的对吧。前面的就是他帮我们打散的,其实啊。所以呢,咱们在自动优化倾斜的时候,跟这个自动合并分区同时开启啊,咱们也要注意一下啊,会不会踩线越线,就这一个问题。
我来说两句