00:00
那接下来呢,咱们看一个对于沙后的另一个调优,就是合理利用by pass机制。那他的意思是啥呢?咱们默认的一个杀手管理器啊。它里面的沙类型是有三种的,第一种呢叫做白pass,第二种呢就是普通的,第三种是序列化的,那么我们一般呢,就是用白pass效率会更高一点,因为它可以避免排序。它但它有几个条件,第一个呢,咱们。杀否后的分区数啊,要小于两,一个默认值它是200,并且有一个要求不需要map端进行合并操作,比如说咱们写的是一个聚合操作,比如说你写了一个。Some,那这个我们知道它是不会预聚合啊,从执行计划我们可以看到有一个哈希aggregateator,它是不是在意思change之前有一次啊,意是劝解之后是不是还有一次啊,我们说了这是自动优化,它会预聚合嘛,那如果有预聚合的话,那就不能走白pass,也就是说咱们不做这种聚合操作啊,那另外呢,就是有一个条件就是这个。
01:14
默认阈值是200,也就是说杀狗后的分区数要小于这个值,那么它咱们就可以使用pass,它的效率会更高一点,而且呢,不需要排序。不需要排序,那么这个呢,咱们从源码来理解一下啊,首先咱们进入这个类,CTRL加LN叫sort shuffle manager。那咱们进入到这个类里面呢。他有一个方法叫注册啊,我们找一下。注特沙uffle啊,就这个方法注特沙uffle,它这边做了一个判断,大家看一下是否要使用by pass,这就是咱们一直讲的bypass,那如果是的话,他就new了一个bypass类型的啊,Handle。
02:03
那如果不是,那还有其他条件,要不要使用这个序列化的沙,对吧。如果咱们使用的是kr yo序列话,那他们他是可以走这个的啊,也就是说他不能走bypass。接下来就判断能不能走序列化的这个啊,效率更高一点,如果这个还没有,那就是基础的。Base shuffle handle,这个就是咱们那个sort沙uffle啊,就最普通的一个sort沙uffle,那我们来看一看它的这个条件,到底什么样的条件可以走一个by pass来,我们按住CTRL点进来,其实这个方法超简单,对吧?首先看这个注释,我们不能用by pass。如果我们需要什么呢?Map端的聚合对吧,它这边源码就这个需不需要map端聚合,如果需要的话就进入这个方法,然后呢,就进入这个if对吧,返回一个false表示呢,不能用白pass as,那就表示咱们不需要麦法短语聚合,它有一个判断条件啊,一个一个判断,你看小于等于这个参数。
03:11
那这边就很简单了,这个是分区数啊,分区数也就咱们并行度,那这个参数的值在上面做的负值在这里,那它的值又等于这个参数,这个参数有默认值,我们看一下。点一下它的默认值就是200。对吧。那在之后呢,咱们返回啊,返回注册完之后来我们点一下看它在哪调用了,注册完之后是赋值给了这个shuffle handle,对吧,已经复制好了,假设咱们既没有map端依据和又是小于这个阈值,默认200,那已经创建的是一个by pass类型这个handle,那接下来我们看它在哪调用,呃,在咱们我直接搜,在这里有一个writer方法,Get writer,就发火的时候写出T啊。
04:09
哦不,咱们在这个方法sort shle manager这里有一个get right get right进来之后,大家可以往下拉,往下拉,哎,他这边对这个handle做了一个模式匹配,那根据咱们前面的逻辑,它会匹配到这个。Bypasst s。那这个时候它创建的就是一个什么呢?Bypass modu sort shuffle writer啊,用了它,那它的效率会更高一点的啊,那就是咱们从源码的角度来来给大家具体的分析啊,那么之后呢,咱们这边也准备了一个代码,做一个演示,那首先看一下代码,下面就是咱们前面演示的很多次的一个案例,三张表读出来,然后做一个join,没有预聚合对吧?没有预聚合,另外呢,我的分区数是不是36啊。
05:01
对吧,分期数36,咱们根据刚才源码是小于200啊,如果咱们不改下面这个参数,是不是可以走白pass啊,对吧?走白pass,那么如果我现在把它设为30。那我们的分区数是大于这个阈值的,它就会不能走白pass对吧?啊所以呢,咱们就分两种情况把它执行一遍,那我是已经分别执行完了,咱们直接看历史服务器啊,为了节省时间,那在这大家可以看到这两个啊。首先呢,这个是能走白pass,也就是说我的白pass阈值是200,上面这个最新的这个是改成30,我们来对比一下。点点进来之后,三张表就有一个广播,对吧,这不用管,我们看上面这个。下面这里呢,大家可以先看一下执行计划上面没有那个哈西aggregate对吧,没有浴具盒change就是沙uffle这一块就是沙uffle,那shuffle呢,我们看关注的就是写嘛,因为是shuffle right对吧,刚才是get right,那就看这个啊,看大数据量大一点有没有什么问题啊。
06:12
好点一下第二页stage。进来之后呢,我们可以大概观察到他的一个写的时间,对吧,而且呢,这些任务全部都是什么成功的。啊个是什么呢?这个是咱们200啊,预值200的时候,那我们的分区数是36,小于200也没有,所以咱们当前这个是什么白pass。你从执行计划是看不出来的啊,白pass,好,那我们来看看另一个。呃,008这个啊,点一下啊,同样咱们看这个一号旧吧,下来之后,哎,这一段还是沙per新计划,看起来是一模一样的,一模一样的来往下走,大家发现一个细节,这个地方。
07:00
写一个多句的这个地方来点一下,那在这里呢,我们看一看有两个失败对吧,他写的时间咱们也不用去关注了,因为这个其实小于一秒,大差不差的都是零点几秒对吧?那关键就在于有失败,有两个失败大家看到没有。两个失败是为什么呢?大家想一想。我们当前的场景是啥呢?呃,36的分区数阈值是30,是不是大于它啊,也就是说咱们走的是非白pass。非白pass就得做什么呢?得做排序,写的时候要排序,那么大家还记得咱们有一张表。哎,有一张票,他的key是不是数据量比较多呀,一个是101,一个103对吧,课程ID他们每一条有50万条,所以这个就是对他们进行什么呢?Sort。我们非白pass要做排序嘛,那排排序使用的肯定是内存对吧,那你看。
08:02
对这两个大进行排序就挂了啊,当然这是我们资源给的,呃,排序的话资源不够多,对吧,是这么一个原因。从这里我们能发现一点点啊,发现一点点,另外呢,我们可以从最外面资金时间上像这个。不是摆pass时间要长一点,走摆pass的时间相对要短一点啊,甚至呢,没有走摆pass需要排序的时候,它还失败过对吧,还失败过啊这个地方啊,但是咱们从源码,包括从咱们实际演示对吧?啊来体会啊来体会。
我来说两句