00:00
那么接下来我们看了一个join,也就是很好用的广播,Join咱们在前面也谈到了,对吧?呃,也看到了,在SPARK9点策略当中,他如果一张表足够小,他会把它先。拉到driver端之后呢,广播到大表的分区里面,那这样的好处是什么?这样好处就能避免咱们的一个沙,那样咱们的执行效率就可以进一步的提升了,对吧。那这个广播join就有点类似于hi的那个map join啊,有点就差不多意思,只不过呢,它是以广播的形式,其实都一样对吧,都一样,他先会把小表拉到抓表端,然后广播到大表的各个分区里面去,啊就是这样,而且呢,这个参数它默认的阈值就是十兆。十兆,而且默认是打开的啊,默认是打开的。那这玩意儿呢,咱们先来做一个。
01:01
看一个效果啊,看一个效果,那要使用广播就有两种方式啊,第一种就通过刚才讲的一个参数来控制,默认是打开的设置为十兆。那另外一种呢,是强行广播,就是什么呢?假设我一张表不满足这个条件,比如说我我我是一张100个G的表跟一张20兆的表,我要进行一个join,按照咱们来看呢,这个明显是很大,呃,相对而言这个是大表,这个是小表,就应该走广播,对吧?但由于那个阈值是十兆。那这个20是不是没法走广播呀,那其中一种方式就是把阈值调大。但这样是不是很费劲对吧,就是不同的作业如果再多一点,你每个都调一下啊,当然也没多大事儿,还有一种呢,咱们可以强行指定走广播啊,就不管这个参数怎么设置了,我一定要走广播啊,就这么一回事,那行,那咱们挨个来看啊,第一个先看一下这个参数的效果。
02:00
那这边呢,我们先来跑一个这。那么它呢,咱们是用这个参数设置为负一,负一表示应用。对吧,也就是说他不会走广播纠音的,我们先来看一看它的执行效果啊,执行效果那咱们的SQL语句就是大小表进行一个交易,那这张表不就是那个只有呃三兆原原始数据只有三兆那张表,这张表呢,应该是那个接近五个G的那张表啊,没有做任何的过滤,然后就是直接交易没了啊。那咱们这边呢,来瞅一瞅。嗯,我想想在本地执行。就行了吧,那我这边要加一个循环。因为我我的电脑是。
03:01
我想想12线程32GB,其实我用ID跑起来跟我在虚拟机跑差不了多少,对吧,这我内存是完全充足的。好,我们我得把logo芯打开。我们先对比一下。走。这个时间可能需要个。呃,分钟级别吧啊,因为毕竟这个有五个G的表。好了,这边出结果了,那我们直接来本地4040再看一下。这个作业的时长啊,还比较快啊,用了十秒钟啊十秒钟。这是第一个来点开。然后呢,咱们这里能看到划分的三个stage明显呢。就是他跟他之间要有一次杀Le,他跟他的沙Le对吧。
04:01
那我们把这个截一下。可以看到有两个是沙头,写一个沙头毒啊,其实这张图再画好看一点,应该是这样啊。STAGE0STAGE1跟STAGE2一起做一个杀,对吧,一起做一个杀,那这样就更直观一点啊,这这对应这里有一个,这里有一个好,那接下来呢,咱们再看一下它的执行计划。点circle点进来,我们直接找到那个join的地方。啊,前面是读表嘛,读完之后join,其实在这咱们也看到它是一个什么,Thought much join啊,Thought much join。截截截过来一点,而且从这我们也可以看到。它的表的一个大小,对吧,Data size。
05:00
Then a science。这个明显很小嘛,啊,这个明显大一点。1万条啊,1万条。好了,咱们留下几张图,这就够了,然后把任务停掉,接下来。我把它注释掉,咱们说了注释掉它默认是不是以十兆的阈值啊,来我们瞅一眼圆满来乘加C。呃。Ctrl shift加F,然后粘贴。点score。看这个。对吧,这里也有解释啊,这里也有解释,这个参数默认呢,就是十兆。解释就不去读了啊,感兴趣自己读一读,就那个意思。好,那也就是说现在是以十兆的阈值起作用了,咱们再执行一遍。
06:10
好,稍作等待。他终于执行完了,那我们就来看一看喽。把4040页面给刷新一下。来同学们看看他们的这个,他首先是有俩作业,一个是广播嘛,这个是广播,广播用了两秒,那么最后广播完再去处理join的时候用了多久啊,62毫秒,你再对比,原来只有一个job。这个时间缩短了多少对吧,原来是十秒,现在是两秒多一点点,缩小了五倍啊,这是第一件事,第二件事,咱们来看看这个。这个有沙包吗?你看。没有沙吧?
07:00
是避免了沙跑啊,这这些现象咱们在web UI上面都是能够看到的。这边就没杀否,很简单,也是他执行这么快的原因啊,不用杀否,可想而知杀否对咱们的影响对吧?那另外呢,咱们看看执行计划来点开点开。直接拉到你看,从头到尾先扫一眼。对吧,很简单吧,好,那前面这里呢,就是读数据读数据啊啊过滤过滤列裁剪,再然后呢。他判断这个大小才多少啊一兆。对吧,那是不是小于十兆啊,那小于十兆它是不是就广播到driver端呢?然后进行在大表的分区里面直接交,然后得到结果21条,那直接输出。你看不管是从这个执行效率,它变成两秒。不管是从那个。Shuffle,它避免了sle。
08:00
还有一个好处对吧。其实它省的时间省在哪呀,你想想你传统的join除了要沙之外,像这个salt mer join是不是还得做一个排序啊,啊,这种是排序交引对吧?啊,那排序的耗时你看也是要十十毫秒20毫秒的,这些他都省去了,都不用了。甚至杀手过程也省去了啊,所以它效率才会差那么多啊。对,很好使啊,可以说这个map精非常非常好用啊,非常非常好用。好,这个是咱们体验一下那个。参数自动,参数自动。那我们再来了解一下那个强行map,呃,强行广播就引了,那这边咱们直接看代码上代码啊,这里有一个false。啊,强制join引,那这边这个案例就比较简单了,咱们呢就是设置广播join预值设为负一,我强我关闭掉了,然后呢,我们试试还能不能走广播圈,那这边的可以用暗示的方式,就hint啊hint其实就是在写SQL的时候加上这种语法啊,这种语法那么大,那在咱们的3.0版本,它是有三种写法啊,一种是这么写啊。
09:19
用一个注释把它包裹起来啊。斜杠星,然后结尾也是星,斜杠,那中间写什么呢?你看这个broadcast doing,广播doing,然后还有个细节,你要把小表明确的指定啊,要指定哪个是小表,比如说这个是SC对吧,小表,那我就写了,小表是SC啊,可以写别名啊,可以写别名,那另外一个写法就。短一点直接写一个广播就行了啊,直接写一个广播SC,再来一个,你还可以写什么,我们说是不是类似像hi的MAP9引,所以他也是支持直接写一个map join对吧?啊,所以大家要知道,如果你看到不同的呃资料写的不同写法,不要奇怪,都支持对吧,那咱们这三种方式,咱们都去做了一个执行计划的查看就好了,查看就好了,这是通过写circle的方式啊,三种。
10:15
都行都行,那还有一个API的方式,咱们一会来看呗,我先把它做掉。不用注掉吧,咱们一起看呗,呃,首先呢,你看我将两张表查询成DF啊,查询成DF啊,Two df嘛,呃,然后呢。可以调用一个广播的API。你看这就明确说我要把这个小表广播广播完,咱们再写一个join对吧,跟大表CC做一个join啊关联条件呢,就课程ID。就仅此而已啊,那你要用这个广播,这个时候如果你直接在这里,呃,比如说我在直接在这里挑,它是找不到这个类的啊,需要咱们手动的将这个包引入啊,所以我把引入就写在这里了,这是一个小细节啊,Circle function里面的啊,Circle function里面的,那你就可以用这个API了,好,那也就是说现在咱们有四种方式嘛啊,咱们都去瞅一瞅。
11:19
四个我都打印了一个执行计划而已啊,大家也知道那个执行时间肯定都能缩短,对吧,那我在本地执行就好了,我把logo星打开,嗯。哎,那我们执行。我们挨个看一下啊,首先第一种我们是写的broadcast during这个暗示,这个提示啊,那我们看到这为止,到这为止两张表准备好了,然后呢,小要做一个广播交换。然后呢,他们进行的是广播交易对吧,你在这就能看到了啊,咱们看的是物理执行计划,一般咱们看结果就看物理执行计划就行了,那接下来是写了一个broadcast啊,更简短一点,那其实也一样的啊,两张表准备好之后呢,小做一个广播到开端,在之后呢。
12:19
进行一个广播,Join是不是一样的啊,一样的,那map join也一样的,咱们快速过啊,大表小表读出来,广播到driver。然后进行广播交好,API也一样。大表小表小表读完之后广播对吧,广播交换到Java端,然后呢,进行一个广播交啊一模一样,所以呢是你看啊,咱们上面已经把这个参数这个十兆的阈值已经把它关掉了,负一表示关闭,那我们可以在折的方式或者呢以API的方式都可以强行走map。
13:03
啊,强行走这个广播交营,那这个也是咱们在开发中啊,非常好使的啊。啊,记住这个用法,它的效果非常好。
我来说两句