00:00
好,同学们,那我们接下来呢,再说一下咱们这个group by key啊和reduce by key的一个区别啊,这个是我们在嗯一些我们的面试题当中啊,会碰见的一些题目,嗯,为什么会碰见这样的题目呢?是因为啊,咱们这个reduce by key啊,它其实就有个分组的概念,为什么呢?相同的key嘛,那么分在一个组里面,然后来做聚合,对不对?而我们的group by key呢,它其实就是分组,那所以说感觉上诶很类似,但是又有区别,因为reduce啊,它有一个聚合的概念,而这group呢,是没有聚合的概念,那难道reduce仅仅是把它分组之后做了聚合,做了一个简化吗?所以我们说啊,我们需要了解一下他们的一个区别和细节啊,那这里呢,我们一块儿来给大家画图啊,让大家来理解一下。呃,首先我们这里呢,来看一看啊,咱们现在咱们假设我们是给大家讲一下那个group key啊来,那我这里呢,咱们来画一下,我这里呢,放到这里啊放到过来,放过来,然后呢,我写上叫RDD,好,现在呢,我们这里面诶有分区啊,嗯,所以咱们放到这边,嗯,这是我们的呃分区啊咱们颜色呢,给它稍微的咱们画一画啊这个颜色呢,咱们画成一个红色,嗯,然后呢,里面呢,给它画成一个我们的嗯紫色吧,OK。
01:21
好了,咱们我觉得画两个就可以了,也不用画太多啊,嗯,好,然后呢,我们现在呢,里面给他准备数据啊,比方说我们这里来给他准备一下数据,我们再写上一个A啊,然后逗号一啊是这样的,然后呢,我们再来拷贝,然后再写个A1,然后呢再写上一个A1,对吧,嗯,好OK,然后呢,我在这边呢,写上一个我们的B1啊,咱们写上一个B1,然后呢,这个颜色呢,我们给它稍微的咱们变化一下啊,比方说给一个我们的嗯,亮的一色啊,然后呢,再来,那么我们再来写上一个我们的B1啊,放过来,然后呢,我们的B1。拷贝嗯,放到这儿,然后再写个B1,然后呢,再写上一个什么呢,A1啊,咱们写上一个A1,然后呢,我把这么几个数据呢,给它稍微的调整一下它的颜色啊嗯。
02:12
好了,那我现在干什么呢?咱们说了分组嘛,那么分组的话,Group by key啊,Group by key,那这个时候我们来我们写上啊,咱们叫group by key,那好,那首先我们进行操作,那么我们的RDD要换一下了,嗯,咱们RDD,然后颜色呢,给它变成一个绿色,那么默认情况下,我们的分区是不变的,对不对,咱们的分区不变,那不变的话我们放过来啊,保持不变,我觉得没有问题,那接下来干嘛呢?我们是不是应该大家想想,把相同的数据,相同K的数据给它放在一块的呀,所以我们就复制过来了,对不对,然后呢,我们再把这个A1放到这边,没问题吧,同学们,所以啊,咱们的箭头呢,应该是这个样子的,来放过来,嗯。放过来以后放到这里,但是你要记住啊,同学们,我们那个B1就有可能放这边了吧,所以呢,我们的B1B1B1拿过来,拿过来以后放到这儿,这个B是不是应该就放到这边来了,诶,所以啊,咱们的这个数据呢,就被打乱重新组合了吧,诶,重新组合了,然后呢,我们再来啊,咱们再来把这个箭头呢放到这边,所以啊,我们的分区的数据呢,其实啊是有可能被打乱重新组合的,那么在这里呢,我们来描述一下啊,嗯。
03:30
嗯,这个文字呢,我们拿这个过来啊,嗯,然后这边给他一个他啊我们写上就是我们的group by key啊,它会啊来写上它会导致啊我们的数据啊,我们说叫做打乱啊重组。啊,所以呢,它存在我们的杀uffle操作,诶这个是我们能够看得到的,没问题吧,同学们,嗯,好,然后呢,那么我们继续啊,咱们干嘛呢?比方说我们后面大家想一想,我们是不是可以聚合呀,什么叫聚合呀,就是说我现在想干嘛呢?我想把两个分区来,他们的结果拿过来,那你是A1A1A1A1,那你最后是不是可以聚合成我们的A4呀,所以大家看一下,最后可以聚合成A4,这个聚合有很多种方式,那比方说我们可以通过什么我们的。
04:20
Map行不行啊,可以吧,诶这是没有问题的啊,用一个我们的map来做一个中间的操作,我相信没有问题啊,那同样道理,我们这个B是不是也可以闭试呀,哎,就是这样啊,好了。那么我们现在的在这个地方的话,大家想想应该是我们这样的一个操作啊,这样这样一个操作,可是那现在问题来了,什么问题呢?因为我们之前讲过,咱们分区之间为什么叫并行计算,是它们没有关系,对不对,所以可以并行计算,你不需要等别人,可是在咱们现在的这个位置,大家想一想。举个例子,比方说我先处理的这个分区,我把这三个A1诶给他放到了这边,那这个时候这三个A1他不等别人,他直接就进行我们的map操作,你们觉得行吗?
05:11
啊,同学们。你们觉得行吗?就是这三个A1呀。他拿不到这个地方来以后,他不需要等别人,他就直接往下来做一个map映射,大家想想行不行。哎,对了。是不是不行啊,同学们什么不行,因为我们还有另外一个分区的数据还没过来吧,咱们这个分区还没开始做计算呢,那么他的A1还没过来吧,他A的A1没有过来的话,你的这个。计算的结果准确吗?不准确。对不对,那好,那这个问题该如何解决呀,同学们。该如何解决?也就意味着,当我们的第一个分区,我们的三个A1过来之后,他能往下执行吗?他绝对不能往下执行,对不对?那他该怎么办?他需要等待啊,他需要等待,他等什么?等我们所有的分区的相同T的数据都过来了之后,才能往下走吧。
06:09
大家想是不是这个道理,只要你还没有做完这个分区操作的话,你就往下走了,那结果肯定不对,所以他得需要等待,可是啊,你怎么知道我等待多长时间呢,对不对?我们那么多的数据,那么多的分区,那你怎么知道我们会花多长时间等待呢?比方说花一个小时两个小时,有没有可能有可能啊,所以这种情况就麻烦了,因为在这一个小时两个小时的时候啊,咱们计算的时候所在的那个exor,它的内存的数据会越集越多,越集越多,为什么你要等待呀,那你等待的过程当中会越集越多,越集越多,是不是内存可能会不够用啊?同学们,你们想想是这样的吗?内存是有。阈值的对吧,有极限值,不可能无限大,那么你的数据量很多,你的分区很多,那这样的话会导致数据量特别的大,那么如果你在内存中等待的话,那么内存就可能溢出了。
07:08
大家能明白吗?同学们,如果你们能明白的话,那你们觉得这个该怎么办?放在内存等待是不是就不够好啊?那该怎么办?同学们,哎,所以啊,咱们就能想到了,我们别放在什么内存中等待,那咱们放到哪啊,同学们,放在我们的。文件当中要落盘,这个大家能不能明白,放在内存中不行,要放在文件当中对不对,所以这个箭头啊,这个箭头,这个箭头呢,都给它删掉,在咱们两个RDD之间,我们干嘛呢?我们要给它增加中间的一块,我们写上咱们叫做什么呢?叫咱们要落盘了,嗯。那这个落盘呢,我们给它一个紫色吧,那也给他一个紫色,为什么呢?它属于这个东西是吧?然后呢,再来,诶,这是一个file,嗯,OK,那么就意味着呀,咱们首先这个A1A1A1怎么了?同学们,它应该先到这儿来,先到我们的磁盘文件当中来,对不对,所以我们的箭头啊,应该指向的是咱们的文件,这个能不能明白,同学们,然后由于我们打乱重新组合了,对不对,诶放在这边,所以箭头这么写,然后呢,同样道理,拷贝拷贝之后放到这儿,然后呢,箭头呢,往上走啊,往上走,往上走以后放到这边,嗯。
08:30
好了,那么我们的这个A1它应该也就过来了吧,诶好,然后呢,B1B1B1,然后呢,复制过来,然后呢,我们的B,诶放过来,诶就是这样,所以呢,你会发现在文件中把这些数据都给它汇总好了,汇总好了以后,咱们在下游的这个RDD的这个位置,只要读取文件是不是就OK了呀,同学们,所以呀,诶你看它的真实的处理方式,其实是应该这个样子的,所以我们把这个稍微的总结一下,大家看一下,咱们这就说一下什么意思呢,就说明我们的Spark中啊,Spark中。
09:09
我们的杀手操作啊,打乱重新组合的操作,它必须啊,它必须干嘛呢?我们就要落盘处理啊,它要落盘处理,嗯,为什么呢?它不能在我们的内存中啊,我们叫做数据等待啊,否则会啊,嗯,会导致会导致我们叫内存移除,哎,这是绝对不允许的,所以呢,我们这里呢,一定要落盘操作,对吧?同学们诶,应该是这样的一个过程,我相信这个大家应该没有问题吧,诶就是这样,那好,那既然我必须要落盘的话,那么大家会发现,那就涉及到磁盘IO对不对,那么我们性能上就会受到影响了,对不对,那肯定是这样。所以啊,我们这个性沙Le的性能肯定不够高啊,所以我们这里再补充一下,就是我们的这个沙Le啊,沙Le操作啊,咱们操作的性能啊,它是非常低的,为什么呢?它要和磁盘交互嘛,嗯。
10:10
好了,同学们,那这个呢,我们就说到这儿了,那接下来我们来说那个叫reduce by key对不对,所以来咱们拷贝啊,Reduce by key咱们复制一下,复制以后咱们到我们的这个位置来啊,咱们到我们下面的这个位置来啊,到这儿来,嗯,好,反过来咱们再写上咱们叫reduce by key啊reduce by key,嗯,好了,那么reduce by key的话,那么这个时候啊,同学们看我们现在咱们把这个先去掉去掉去掉去掉啊,把这个去掉去掉以后,那我们想一想,同学们,我们的所谓的reduce by,其实它是不是应该也有沙风啊。为什么你相同的可以放在一块儿来做聚合,是不应该也有沙Le,所以沙Le肯定是要落盘的,对不对,肯定是要落盘的,所以呢,按照咱们之前的分析,大家看一下我们的A1A1A1OK放过来,嗯。
11:07
然后呢,把这个A1我们放到这里来,对不对,然后呢,把这个B1诶我们放到这里,然后把B1B1B1诶给它放过来,嗯,放过来以后,那么这边是我们的什么呢?A4对吧?我们写上咱们叫A4,其实按理说呢,他应该先把文件读过来吧,对不对?所以啊,咱们现在可以画大一些啊,画大一些因为它是在一个操作当中完成了分组和聚合的操作,所以呢,把这个拿过来aaaa拿过来复制,复制过来以后,它是不是就直接就变成了我们的A4呢?对不对,诶就变成了这个A4啊,并没有产生一个另外的RDD嘛,然后呢,我的箭头诶指向它就可以了,嗯。好。然后呢,我们这个B1B1BB啊,然后复制,复制过来以后给它读取过来,同样道理,它是不是就变成我们的B4了,诶就是这样啊,OK好,我们把这个箭头呢,也给它拿过来啊,咱们拿过来,所以说你感觉呀,跟跟我们这个前面这个goodbye啊,好像差的不多吧,同学们你会感觉是不是差的不多,为什么呢?因为它都要落盘嘛,他如果都要落盘的话,你最后的这个聚合,你这个聚合其实性能上其实差别不大,为什么呢?因为能差多少呢?反正你数据都拿过来就直接做聚合呗,对不对,所以说你最后的这一块的性能上差的不多,为什么呢?因为它有沙Le,其实真正影响整个计算性能应该是个沙Le吧。
12:34
那你这个沙佛跟商面没有区别,所以说你这两个从性能上好像感觉也没什么太大区别,那么从功能上来讲的话,你也有分组的概念,只不过你增加了聚合,而那个只有分组没有聚合,它的聚合呢是通过一个map,通过别的方式来做的,所以感觉这两个好像没什么太大区别,对不对?那你到底是用哪一个呢?你是用它呢,还是用咱们的group呢?对不对?所以啊,就觉得很奇怪,诶用group也能实现这种操作,你用reduce也行,那我到底用哪个呢?对不对?所以啊,告诉大家他们的核心区别就来了。
13:08
为什么?因为咱们这个reduce by key这个reduce呀,它表述的是相同的key的数据的VALUE22聚合,那么我们在这个图当中有没有发现一个现象,什么现象咱们在这一个分区当中。我们的这个什么就有相同的key,而且value就可以聚合吧。对不对?同学们,你像之前那个group by k,其实它是分完组之后在做的聚合,而我这个在做什么,分组之前是不是就本身分区里面就能够把它聚合在一块儿,所以啊,我的思路稍微的就有点变化了,同学们看啊,来把这个图形呢,我复制一下,复制以后呢,我往这儿来,嗯。往这来啊,来大家看一下,那我这个时候干嘛呢?我把咱们的这一块呢往后挪,诶把这个往后挪,为什么要往后挪呢?是因为我希望呀,把咱们这个之前的这个A来放到这儿,把这个呢往这儿拉,拉过来以后,我想做这么个操作,什么操作呢?你的这个地方大家想一想,我完全可以想办法,我事先做一个处理啊,什么做一个处理啊,我把这个能不能提前先给他聚合一下呢,我们叫做A3。
14:26
然后把这个呢,我们叫做B1,诶大家发现没有,我这么来做,你这样做的话就意味着呀,我先别在落盘的时候有那么多的数据,我可以事先呢,先想办法把这个数据减少一部分,对不对?然后呢,再来把它放到这儿,放到这儿以后,那这个时候我们的B不就是B3吗?我提前呢,先想办法给它聚合好,然后这个不就是A1吗?好了,那如果是这个样子的话,大家想一想,那么我们真正在落盘的时候,他肯定要落盘嘛,有沙Le吗?那么你落盘的时候是不是数据量就没那么大了,那就意味着这个就没了吧。
15:04
他们就没了,然后呢,你的A3就过来了,对吗?同样道理,你的这个也就没了,没了,然后呢,这个呢,就是我们的B38,所以说你落盘的数据量少了,你的那个磁盘IO是不是就少了,那这样的话性能是不是就得到提升了,还有一个当你的文件的数据量变少之后,你的读取是不是也变快了,所以这地方就是什么我们的A3吧,A3以后它就没了,它就没了,同样道理,这个是不是我们的B3呢?诶把这个去掉,把这个去掉,大家可以看到我们最终的结果是不是完全一样啊。诶,但是你最终的结果完全一样,但是你要记住这个方式他们的性能就要比之前的要快很多,那它是怎么做到的呢?很简单,就是在我们进行杀否之前,我预先对分区内的数据进行了一个预处理,啊这个预处理呢,我们称之为叫预聚合,所以大家看一下来,咱们拿过来。
16:06
在这个地方我们写上咱们叫做什么呢?叫combine啊,这个我们称之为叫预聚合功能,所谓的预聚合功能啊,所谓的预聚合功能其实就是分区内事先做聚合操作,就是这个意思啊,然后我们让落盘的数据量减少,来提升sale的性能来就是这样啊,所以我们在下面呢,也稍微的来解释一下啊,来把这个呢放过来,嗯。咱们写上啊,咱们的reduce by key啊,它支持我们的分区内啊,咱们的预啊,咱们的聚合功能,那么可以它有效啊,可以有效减少咱们叫减少杀Le时。我们叫落盘的数据量啊,数据量,那么我们说提升我们沙Le的性能啊,咱们叫沙Le的性能,那么对整体的我们的应用程序来讲,性能也是可以得到提高的,还是非常不错的啊,所以这个叫comba,那所以通过这个我们的解读的话,大家想想是不是我们的reduce by key它会优于我们的group key啊,对不对,从性能的角度来讲啊,但是反过来讲,从功能的角度来讲,它又有点区别,因为咱们的蕊就是by key,它是相同的key,那个VALUE22合。
17:29
但是如果假设我们只需要分组,不需要聚合,那么你用reduce就没有意义了吧,对不对?所以我们那个时候就只能用group by key,所以啊,他们从功能上其实是不一样的啊,所以咱们回过头来,同学们看。那么我们的reduce by key和key的区别,那么我们就来往下走了,他说了,从沙Le的角度啊,我们reduce key和key都存在的操作,但是reduce它可以在前对分区内相同的的数据进行功能,这样会减少落盘的数据量,而group只是进行分组,不存在数据量少的问题,那么就是性能,它会比较高一些啊,性能啊,我们写上它叫比较高啊。
18:17
哎,它比较高,那么从功能的角度来讲呢,我们的reduce其实包含了分组和聚合的功能,而我们的group它只能分组,它不能聚,所以在分组聚合的场合下,我们推荐用,因为它有聚,如果仅是分组而不聚合,那么你能使用白T对不对,你用它是没有意义的嘛。诶,所以这是他们的一些区别啊,然后下面有个小功能叫world,这个咱们之前不都是做过的嘛,对不对,因为你能分组的话,你要想做这个我们的world应该非常的容易,对不对,所以这个咱们就不给大家演示了,好不好,同学们。
我来说两句