00:00
好,同学们,那我们这里接下来把这个base handle所对应的咱们给大家讲一下啊,呃,这里呢,我们去点,点完以后,它里面应该有一个叫red方法来完成我们写磁盘的操作,那么其中因为你有sortt嘛,那么它里面就有个排序器,咱们叫sorter么?这个sort呢,它有个判断,什么判断呢,就是判断你到底用什么样的一个排序器,那么这里呢,有一个叫map set combine,就是你是否支持预聚合功能,如果你支持的话,它在构建这个S的时候,会把那个aggregator和我们的这个排序的order啊,Order给它放去,那如果要是你不支持预聚合的话,那么这里就没有那个aggregator,就是聚合器以及那个排序了,它就没有了啊,所以他们的区别就在这里,然后呢,当你把这个对象构建出来以后,干嘛呢,就把咱们的数据呢,往咱们的这个里面插入,你好排序啊,对不对,所以我们点一下,点点完以后大家会发现,首先第一个它在里面呢,就判断了一下,咱们道。
01:00
到底有没有预聚合功能,因为如果有预聚合功能的话,这个聚合器就是存在的,那么它如果存在,它就支持预聚合,对不对?那如果支持预聚合的话,它里面就采用了一个什么呢?有一个啊,我们叫做map的数据结构,这个map的数据结构呢,大家可以想到叫做什么呢?叫partition的append only map,它是一种map的结构啊,我们点一下,点点完以后啊,它里面其实说白了也就是一个我们的数组啊,只不过是按照什么呢?按照我们的这个,呃,1212这种方式,就是前面一个是K,后面一个是V,它并不是纯粹的那种map的结构啊,是这个意思,然后呢,我们来再看,那如果你要是不支持一聚合的话,下面是一个buffer的结构,这个buffer就是纯粹的一个数组的感觉了,它就叫做partition的pair buffer啊,就是这么一个数组啊,所以稍微的有点不太一样,两种不同的这种结构啊在里面,然后呢,我们来接着看啊,如果你支持预聚合的话,其实呀,它会怎么办?
02:00
他会把咱们的数据在map端,说白了就是在那个map结构当中做一个什么聚合功能,咱们不考虑它的具体底层结构吧,就问你如果是我们key和V的话,比方说我们map结构,同学们看,比方说我们map部结构,Map结构里面是不是KV对建子对吧?那如果相同的K的话,是不是就对V做更新了,这样的话不就等于在我们落盘之前就已经做了一个聚合吗?这就叫预聚合功能,咱们老说预聚合,老说预聚合这儿就是预聚合对吧?相同的key把V给它相加对不对?你看咱们这里不就这样的嘛,它里面就有update嘛,来更新嘛,它里面会有个叫create combineer,说白了就是那预和那个东西,然后呢,在我们下面这个地方update,在做更新值的时候,来做一个预和功能,对不对,这个里面的K_一其实是什么东西啊,就是咱们的那个K,它会通过K来取得它的分区,然后再把这个key给它放过来,再把咱们的值给它一做一个更新,就是这样的啊,所。
03:00
就在这儿,那如果你要没有预聚合呢,大家想到它就这样了,没有预聚合呢,它是根据K来取得我们的什么分区,然后把这个K和那个V直接往里面放就完事了,所以啊,它是这么一个功能啊,稍微的有点不同,它没有那个update的概念,没有更新的概念,对不对?好,那不管你怎么做吧,反正当你的数据来了以后,它会增加读取数据的数量,然后以及干嘛呢,往这个结构里面插入,接下来叫maybe spill collection。叫做是不是可能干嘛呀,一写要集合,就是当你不断的往内存中加数据,加数据,加数据你可能会超出一定的阈值,那么超出一定的阈值怎么办?要易写磁盘。所以啊,这就意味着咱们前面画这个图啊,还稍微的有一点问题什么呢?所谓的问题呢,其实是没有画全呢,所以我们复制一下啊,咱们往下呃,往下以后同学们看一下,就意味着我们在写文件之前,其实还有个问题什么呢?它应该有一个易写磁盘的操作,所以我的箭头呢,同学看往这儿来放啊,往这来放,那么在我们的这个地方应该有一个缓冲区的感觉,说白了就是内存呢啊,咱们叫memory啊,放到这儿咱们就写个M吧,然后呢,把这咱们也换个颜色啊,咱们换个颜色紫色吧。
04:15
放一个紫色啊,然后放过来,这是我们的什么memory,那么你memory的话,就意味着你可能干嘛呀,你可能需要什么呢?一些磁盘,当你内存不够的时候,应该有一写磁盘的操作,这个呢,我们写上叫temp,就是临时的那个什么我们的文件,这个呢,我们用一个我们的这个颜色会不会好一些呢?用它吧,啊来,然后诶临时文件啊,临时文件,然后临时文件,然后临文件对吧,就是这个意思,那么我们的内存在不断的一写呀,啊,咱们在不断的一写,所以放过来,嗯,好,然后这个呢,也给它放过来就可以了啊就是这样的,然后呢,我们复制,复制以后呢,给它放过来啊放到这边来,那么放过来以后,那么你想想你是临时文件,那你最后该怎么办,你是应该合并成我们的这两个文件呀,所以啊,我们这里是应该合并的啊,最终是要合并的啊,来把它放过来,我们这里就不画那么多了,咱们意思意思就可以了啊,来把它放过来,所以啊,就是这么个概念,好,那我们回过头来,大家看到这边呢,就叫maybe spill collection,我们再。
05:15
点一下,那么这个是不是一写的时候啊,它里面有个叫using map,就是你用的是不是map的结构,我们点一下点点完以后,如果你使用的是map结构的话,大家看到它在这个地方会用到一个,这个就是当你一写的时候,它需要重新创建一个结构,那如果要不是的话,它要重新创建这个结构,所以啊,它的主要操作就在这个位置。还有一个就是我们当前这个结构当中的内存大小,这个预估的一个值啊一因为它不能准确的评估出一个对象到底占了多少内存嘛,它是不能够准确得到的,它有一个估计的值啊,把估计的值拿到,然后呢,来判断你当前是不是需要一些,所以呢,有一个叫maybe spill,两边都是一样的啊,所以我们点点完以后,它里面就是个集合,这就是当前的内存大小,这是评估出来预估出来的啊,然后呢,他就说了我们当前读取的元素的数量,如果模拟32啊,或者说是32的整数倍的情况下,那么并且当。
06:15
填的内存大于了我们的内存的极限值叫阈值,我们点一下,点一下这边有一个值,这个值默认是多少呢?咱们叫五兆啊,如果你大于五兆了,并且你是那个什么,我们模拟32等于零的情况下,在这种情况下它会去尝试着去申请新的资源,新的内存,看能不能申请上,如果发现你申请的资源它都不足以容纳我们的数据怎么办?这个时候大家会发现它就需要一写了,对不对,所以说他预写,那么这个一写就是这是一种情况,还有另外一种情况,就是你读取的元素超过了这个预值,这个预值是多少呢?我们点就叫强制溢写啊,强制溢写,这个溢写的这个值咱们可以看一下,在这儿呢,它有这么一个值,这个值呢是int类型的最大值,如果你读取的数据超过了int的最大值的情况下,那这时候也要强制一些,就是你上面这种方式一种,然后这个也是一种,对不对,诶就是这样啊啊这个是五兆,然后呢,这边呢是模拟32等于零,然后判断。
07:15
它的大小啊,大小情况好,那如果溢写的情况下,那么下面就是溢写的操作,其中有一个叫spill,然后这边有一个叫release,当你溢写之后,那么我们该干嘛呢?我们释放内存对不对?诶,所以啊,这个跟溢写相关,那你的数据量没那么多,你当然不需要溢写了,对不对?所以我们给大家画图当中的这个temp文件呀,不是肯定有,当你数据量少的时候,内存就够了,但是你数据量多内存是不够的,不够的情况下怎么办?诶,需要预写我们的磁盘文件对吧?那好,它的一写就在这里了,我们打开,打开以后,其实啊,它所谓的一写呢,我们回过头来啊,就在我们刚才的这个地方,我们搜索一下,诶在这儿这边就有一个溢写的操作啊,这个溢写的操作呢,会有一个内存中的迭代器,然后呢,它里面会有一个什么呢?比较器,用来做比较的,其实说白了就是我们在排序中使用的啊,就是这个东西,然后呢,我们接着往下。
08:10
呃,往其实我们看这也行啊,看一眼看一眼的话,它这边有个叫key competor,这什么东西呢?其实我们的这个排序啊,它有两个排序的规则,第一个是按分区排序,第二个是相同的分区按key来排序,所以啊,这有一个K的比较器啊,是这样的,好后退,后退以后呢,我们往下,往下以后有个叫spill memory啊to Dis刻,那这里呢,就是我们把我们内存中给它一写到磁盘里面打开,打开以后啊,咱们的这个呢,往下不管它,那这里面大家可以看到有个什么东西啊,这边叫创建临时文件对不对,有一个叫file嘛,叫做我们的沙Le block一个块,然后呢,接下来有一个叫做什么呢?我们的writer,获取我们的block object writer一个磁盘的一个对象,那么这个对象呢,它里面有个什么东西呢?有一个叫file buffer size,就是我们的缓冲区大小,你要写磁盘文件应该有个缓冲区,就意味着当你的内存呢,不够用了,干嘛呢,要一写磁盘的时候。
09:11
它会有一个缓冲区,这个缓冲区往temp里面放,诶是这样的,那这个缓冲区大数多少呢?点一下咱们再点,点完以后默认是多少,默认是32K啊,默认是32K,就是我们的那个缓冲区的大小啊同学们,然后呢,这个writer它就可以往下干嘛呢,往下去写了来就是这个意思,所以呢,这是一个我们写磁盘的一个操作,诶就是这样,好,那我们现在后退啊,咱们后退,所以说在这个地方他就要写磁盘,写磁盘以后会怎么办?他要释放咱们的内存,那这时候再往我们内存里面加数据,加数据以后又可能超出了内存的限制,是不是又一些磁盘,所以这个临时文件其实会生成很多啊,生成很多,当然了,我们说的是数据量大的情况了啊,然后后退后退以后再后退,后退后退到我们的这个地方以后,同学们看你会发现,那我们是不是就已经完成了我们的插入操作了,对不对,所以我们的插入操作其实就已经结束了,那咱们后退。
10:11
后退之后就是,反正呢,就是你往里插的时候,不断插,数据量越来越多,就可能会溢些磁盘,一些磁盘之后会有很多临时文件,那么接着往下,往下以后在下面的位置就有个什么东西呢,叫做right,你看shorter right partition的map output,也就是说你map阶段的那个输出在什么位置,它这边会记录下来啊,然后呢,我们点一下,点点完以后他说了,如果你的spis is empty就是。你没有一些,你之前内存是够的,你没有一些,那你没有一些的情况下,我专门对我们内存中的数据做操作就够了啊,所以就做下面的操作,但是如果你有一写的话,比方说你有很多的文件的话,Else会走这边,他就会把咱们这边的迭代给他拿到,拿到以后往下,下面呢就会有writer,这个writer呢,就会去写磁盘文件啊,把他们其实说白了就是给他合并成一块,就是这样的啊,那么在它的处理过程当中,大家看有这么一个操作,咱们点点完以后啊,他这里面会问你啊是不是什么,有没有一些,如果要是有一些的话,往下干嘛呢,叫墨。
11:19
叫合并啊,叫合并,合并你的那些一些磁盘和什么内存中的数据,就是又把你的磁盘文件给它合并,又把你内存中的数据给它合并,诶就这么个意思,所以我们点一下,点完以后在它的里面,大家可以看到它里面其实呀,就是做了我们的什么一些基本的一些处理,那么这里面会有什么呢?叫Mo salt啊Mo salt这个是什么呢?就叫归并排序。啊,当你去支持我们的排序的话,它就有一个墨sortt归并排序啊,就是这样,好,我们点一下点点完以后大家会发现在这里面用的就是我们什么,咱们点一下这个,这个是我们的优先级队列啊,应该在我们Java当中也是有相同的一种东西,然后呢,在这里面会形成一个堆,然后这个堆呢,采用的是我们什么,就是堆排序,它用这种堆排序的方式来实现咱们的摩salt啊规并排序就是这个概念了啊好,咱们后退啊后退,后退以后咱们接着呢往下,因为它这里面其实大可呢,它就会用我们的分区,以及我们的那个key啊,用那个K,先根据分区,再根据那个key来做我们的排序啊好,我们这里呢,就往后,那么排完序以后,咱们的这个文件基本上就给它合并在一起了,合并在一起以后,诶,咱们再接着往后来往后来往后来啊,往后来以后就到咱们这个位置,记住在这一步呢,已经把咱们的这个什么给它合并了,那然后呢,在我们这点。
12:47
点完以后咱们来拷贝,拷贝以后在这边有一个local Dis本地磁盘嘛,然后呢,在这里搜索一下,有一个它在这里呢,就会把一个我们的文件啊,这是我们输出的临时文件给它找到,找到以后呢,Write咱们再接着点,点完以后它这里面就会获取什么啊,我们的索引文件,这个索引文件它会什么呢?创建我们的一个临时的索引文件,然后呢,包括我们的数据文件它都会得到,因为咱们之前是有的呀,所以在这里面呢,他就把咱们的那个临时文件和原始的那些数据文件呢,给他做操作,那么到最后的地方,大家可以看到,他这里面就把早期的所有文件给它删除,然后呢,把我们的新的临时文件给它改个名叫做我们的什么索引文件,把那个数据文件的临时文件给它什么,我们说给它改个名叫做数据文件,所以在这一步当中,我们真正的就只剩下索引文件和我们的数据文件,诶就是到了这一步就差不多了,所以我们的写词。
13:47
谈和,包括我们最终得到的这个文件,其实基本的程序代码就在这些位置啊,我们也不用说把每一步都看全,这不是我们的重点,咱们只是告诉你,它最终其实就体现了咱们的这个索引和这个数据文件其实就够了,好了,那么写磁盘文件是这样的,那么呢,这个读啊,同学们来咱们找一下,因为这个读呢,按理说它其实是应该有我们的什么。
14:12
他应该是有我们的看看啊往上走。它应该是由咱们的这个sle r DD,就是这个阶段当中的任务完成的,对不对,所以啊,我们这里写上啊,咱们叫sale,咱们叫,诶不对,咱们应该叫result,咱们叫result task,这个task当中会去读数据,但是你真正去读的话,它应该走的是那个叫sle,我们的S的RDD由它来完成,它里面有个叫compute,还记得吧,叫计算,这个里面就有个叫get reader,有个叫read,叫读取,那好,我们现在点get reader,这个get reader呢,我们可以搜索一下,诶这边有个叫sort suffer manager,咱们拷贝,拷贝以后咱们这里搜索一下,就是我们的get reader,这个get reader用到的就是这个block store啊,就是它我们点一下,点点完以后在它的里面就去有一个read方法,应该是啊,你看在这儿呢,叫read,这个read的方法呢,它会经过配置得到一些相关的信息,比方说咱们这边有个叫reduce ma s inlet,这是。
15:17
拉取数据当中的一个最大的大小,我们点一下,点完以后有个48兆,我们刚才说过了,我们写磁盘文件其实是有个缓冲区吧,同样道理,你读磁盘文件其实也有缓冲区,这个缓冲区其实就是48兆啊,就是48兆啊,这个呢我们说一下啊,然后呢,下面当然还有一些别的一些参数,咱们这里就不看了,然后呢,它的下面的这些地方就干干嘛呢,可以得到一些我们的什么ator啊,包括一些我们的这个这些东西啊,他其实就都有了,所以这个后面的这个读取过程呢,其实我们不用看,为什么呢?只要他拿到之前的文件的情况下,他就直接读,其实就够了,只是我们当时写的时候要考虑性能,那你读的话,你有多少文件我就读多少文件,加缓冲区不就完事了对不对,所以这个呢,其实问题不大,我们也不用看的那么细啊,咱们就知道有毒有写源码中在什么位置,基本的原理是什么,其实就差不多了啊好了,同学们行,这个呢我们就说到这儿啊,杀否其实主要说到这儿就。
16:17
行了。
我来说两句