00:00
沙呢,我们给大家讲的差不多了啊,接下来呢,我们把源码呢给大家看一看啊,来那沙Le的话,那我们刚才讲过了,其实沙Le对于我们来讲,我们左边的map当中的任务呢,会写,那咱们就先看写啊同学们,所以来咱们找到咱们叫我们的map task对吧?然后呢,我们这边有个run task在它的里面呢,其实啊,就有这么一个什么呢?我们的right。那它里面会有一个叫sle writer processor,这个呢,我们给大家写一写啊,因为这个稍微的重要一些,所以我们在这个地方呢,给大家稍微的去看一看啊,有这么一个,呃,咱们拿过来,咱们叫Le啊,我们的writer processor这个呢,我们给它来标识一下吧,啊,咱们放过来标识一下。这个叫做什么呢?从字面含义上来讲,叫sle的写的一个处理器processer嘛,处理器对不对,咱们叫做啊,咱们叫处理器就是这个意思啊,那么如果叫做写处理器的情况下,那我们这里呢,给它来往后看啊,这么我们点个right,点点完right以后,那么这里面会有个什么东西呢?叫做Le manager,叫Le管理器啊,所以这个呢,我们也是需要来写上一下,咱们叫Le manager啊,咱们叫manager,这个staffle manager给大家说一下啊,它其实分我们两个,在早期的时候有个叫哈希啊,就是哈希处理的,还有一个我们什么呢?叫sort,哎,叫short的一个s manager,那我们会发现它里面就有个get叫get s manager,我点它一下点点完以后啊,诶,我们或者这样吧,咱们后退啊,后退以后,我们点这个叫get write,大家看一下这个就叫manager,我们给他来看,这是个treat,那我们肯定是要有实现,或者说有那个混的呀,所以打开。
01:50
打开以后大家看怎么了,它里面只有一个叫shle manager,在早期版本中有哈希,但是我们现在版本呢,都叫shot,所以啊这个其实只有一个我们的shot了啊,所以呢,这个呢,我们写上一下它是早期的啊,这里我们说一下它叫早期,而我们这个呢,是我们的shot啊,咱们当前的这个当前啊,当前版本的这个叫Le manager就是它了啊好,那我们回过头来,我们的这边有个叫get,所以拷贝拷贝以后我们找到咱们刚才的这个地方啊,找它我们打开,打开以后呢,搜索一下有个叫get writer,这个get writer大家会发现呢,它里面其中啊会匹配我们的一些类型,那么会创建不同的writer,哎,这个时候大家有没有发现它这里有一有二有三有三个我们的a write,那这个呢,我们给大家稍微的咱们列一下啊,这个就比较特殊了,所以呢,我们稍的给大家列一下啊。这个地方我。
02:50
插入啊,咱们插入我们的表格,哎,咱们就插入我们的,我想一想啊,咱们插入什么呢?首先有三行对吧,三个不同的,然后呢,我们这里这样吧,嗯,咱们这样,我们首先第一个啊,第一个呢,我们就写上它的一个条件,或者说诶不用写条件吧,咱们我觉得咱们不用写条件啊呃,这个是我们的处理方法,就是我们的handle,它有一个这个东西咱们拷贝。
03:12
拷贝以后咱们拿过来,诶拿过来我放到咱们这儿啊,这是一个我们的handle,然后呢,我们再来往下,下面还有一个叫bypassor saltle handle,所以把这个拷贝,嗯,拷贝以后呢,拿过来诶放到咱们的这个位置,诶对比一下,还有我们后面再来一个咱们叫basele handle啊所以诶我觉得咱们这个其实是不是这么写不好啊,嗯呃,咱们这样吧,咱们这样啊,我们在这写吧。同学们看啊,我现在把它换一个位置啊,我们在这写,把这个呢拿过来,我放到这边啊,放到这边以后,这个呢,我们称之为什么呢?咱们叫处理器对不对啊,所以我们觉得是不是可以,嗯,再来一个呢,比方说我们来啊,咱们给它来放到这儿。好了,那这个呢,我们就写上啊,咱们叫做处理器啊,咱们叫处理器,嗯,好,那么我们为什么要这么写呢?是因为你会发现呢,这个handle它决定了我们刚才的那个什么writer是什么,回过头来,同学们看一下,咱们这个地方叫get writer,我们这里找一下,找一下啊然后呢,我们去找打开,打开以后呢,往下来,那么这个时候往下走,你会发现我们不同的handle它会走到不同的R,所以说我们的这个handle它走的是我们的unsafe,所以把这个呢,我们拷贝啊,就是关联性呢,我们都要知道,这个呢,我们叫做写对象啊,叫做写对象,不同的处理器它的写对象它是不一样的啊嗯,这个是有点太大了,把这个字体变小点吧,好不好,同学们,嗯,把这个改成我们的小五号吧,啊好,然后写对象,那么我们下面这个handle呢,我们去找一下啊,下面这个叫做它咱们拷贝,拷贝以后咱们拿过来,诶在咱们的这个位置啊好,同样道理,我们再往下,下面呢有一个叫。
04:57
Ler,诶,所以给他拿过来好拷贝,拷贝以后放到这里啊,行可以了,嗯,那么写对象没有任何问题了,那么我们现在啊,咱们的这块基本,诶我们看现在都可以了啊,咱们接着呢往下嗯。
05:13
那么问题就在于,你的这三个handle是什么样的?类型,就我怎么去取得它的这个类型,对不对,所以啊,我们后退啊,大家看一下这个handle呢,它其实是我们的get writer第一个参数吧,所以后退,后退以后我们后退到咱们的这个地方来,我们这边的get writer的一个参数不就是它吗?它叫sle handle。好,我点一下,点点完以后大家会发现这边会有个叫suffle manager,有一个叫registerist suffle,这个就是用来注册我们suffle的一个什么处理器的,所以我们点它一下,点点完以后它是一个我们什么是一个我们的,诶抽象的,所以我们找到thoughtt sle manager,我们去找一下好搜索,搜索以后大家会发现在这个地方就对我们的条件进行了判断,然后得到不同的handle,对不对,所以啊,它里面是有条件的,那这个条件是什么呢?我们一点一点来看,首先第一个他说了叫sort sh writer.should bypa,这个咱们翻译一下同学们直观一点。
06:22
Should的能不能bypas忽略墨子叫合并,Shortt叫排序,那么直译过来就叫能不能够忽略合并的排序,咱们也称之为叫规并排序,他就问你了,我们能不能给它忽略啊,诶,能忽略的前提条件是什么?你得有吧,所以咱们之前其实是有一个叫salt的,还记得吗?叫salt,这个salt其实就是一个,这个叫基础的,或者叫基本的softle handle,它就是用来做排序的,而它的排序就是什么东西啊,叫Mo salt就是它,所以啊,我们现在呢,我们就来看看它到底能不能忽略,怎么个条件,诶,我们点点完以后,大家会发现他这里面就问你了,你的依赖关系当中有没有。
07:06
Map combine叫map的。这个咱们之前说过吧,咱们的reduce by key,咱们的aggregate by key for by key和combine by key是不是都有map端的预聚合,你有预聚合的话,那是不行的,你没有预聚合那可以对不对?所以啊,咱们在这里呢,就有一个bypass在这儿啊,咱们写上咱们叫做什么呢?判断条件,判断条件,判断条件当中我们写个一啊,咱们写个一啊,写个什么一呢?呃,就是我们的不能啊,我们说使用咱们叫预map端就叫预聚合吧,预聚合功能啊,咱们叫预先啊聚合咱们的功能啊,不能使用预聚合功能啊好,这第一个。第二个是什么呢?第二个是它会从配置信息当中取一个我们的配置的项目,这个项目呢,我们点一下在这儿呢,就是问你啊,Shuffle salt的一个什么阈值,这个阈值默认是200,那么我们后退默认是200,就意味着你取出来的话是200,那么200的话,如果你依赖当中的分区器的分区数量小于等于我们的200,那么就可以支持我们的忽略。
08:18
所以啊,这就意味着我们回过头来,同学们看啊,咱们找一下,咱们在这个里面,咱们找一下,咱们点一下,咱们在这里找到我们的图形啊,诶在这有是吧?在这有的话,我们看咱们那个三否在我们哪边呢?咱们往这找找啊来嗯。嗯,我来确定一下,嗯,在这儿,在这123,这个就是我们下游当中的那个分区器的分区数量一,我们一个分区就是一个task嘛,所以当你的下游的这个taskk的数量如果小于等于200的情况下,那么就可以忽略。啊,就可以忽略就这个意思,所以呀,我们这里呢,写上一个我们的二啊来。如果我们叫下游啊的分区数量啊,分区数量它小于它等于200,这个200呢是可配的啊,这个200是可配的,不是固定不变的,一般我们会配到400~500左右啊,是这样的,所以如果下游的分区数量小于等于200的情况下,那么就可以摆pass,并且它不能使用预聚合,对不对,比方说goodbye,它就没有预聚合功能,那么在这种情况下,我们用PA是可以,所以啊,这个是有个条件在里面啊,好了,这个呢,我们知道了以后,咱们就可以后退了,该我们往下看了,因为当我们忽略的话,就会走这个by pass吗?所以他们三个是一个连贯的过程啊好,我们再来往下,下面是什么呢?叫做这个叫sort sle manager,它里面说了能使用我们序列化的sle,这个是什么意思呢?就是当你用它的时候啊,它要有序列化的能力,也就意味着我们保存到内存啊,可以把对象直接保存到内存,也可以把对象序列化以后再保存到内存,对不?
09:59
对,这都可以的,那么如果你把对象给它用二进制的方式保存到我们的内存当中,这样的话,其实我们可以更高效的对我们的内存做一些查找和压缩,对吧。
10:12
所以啊,就看你支不支持了,那么是否支持呢?它首先就有一个条件,什么条件呢?他问你当前的这个序列化规则当中,它是否支持序列化的重定位,什么意思呀?就是本来你的序列化呢,它的这个对象是分开的,但是我完全可以把它重定位,把它关联在一起,这是可以做到的,那这样的话,我们就可以更高效的使用内存,对不对,所以啊,它就判断你是否支持这样的操作,我们告诉大家默认的Java是不支持的,默认的Java的那个序列化规则是不允许的,但是我们有个叫kr yo的序列化的框架,它支持我们的重定位操作啊,所以啊,如果你不支持,那这就不能用,对吧,就是这个意思,还有一个,如果你支持什么呢?我们的这个一聚合,那也不能用,所以啊,它有这么几个条件,我们也得来,嗯,放到这儿再写上一个一啊,首先干嘛呢,就是我们的序列化啊,咱们的序列化规则,它支持我们的是吧,咱们叫做重定位操作啊,重。
11:12
定位操作,这个操作我们说了啊,咱们Java序列化不支持啊,咱们叫Java序列化不支持。啊,谁支持呢,那个KRKR的框架,嗯,他支持啊。好了,那这个是我们的第一个啊,咱们再来第二个是什么呢?就是不能啊,不能我们说来不能使用,咱们叫预啊,咱们叫聚合功能,因为如果有map端的聚合的话,它依然不让你用,对不对,还有一个就是part,这个其实跟刚才是一样的,就是我们下游的分区的那个数量,它如果大于这个也不行。所以啊,我们再来说第三个啊,就是来如果我们下游的这个分区数量啊,它大于啊,其实也不行啊,来我们点一下,点点完以后这是一个什么什么最大的partition ID加一,这是啥东西,是不是就是它呀,是我们这个值啊,所以拷贝啊,把这个拿过来,嗯。
12:12
好了,拿过来以后,他这里好像说咱们后退一下啊,咱们后退,把这个我们拿过来后退,他不减了个一嘛,然后再减了个一后,再加上一个一,对不对,加上一个一,那我看看啊,咱们这个值应该是多少?诶,咱们后退吧,再后退,后退,由于它是大于的话,那么就意味着我们这个地方加一应该是什么值啊,应该是不是我们的,诶这个值啊,应该是加了一个一,对不对啊,加了一个一,应该是六吧,嗯,OK,所以啊,它如果大于这个,那也是不行的,所以我们应该是小于或等于啊来,咱们叫小于或等于,嗯或啊,我们等于是因为它有特殊的判断在里面,它有一个位数的概念啊,嗯,好,那就是说不能使用一聚合,而且它要支持重定位,而且它要什么,我们叫做小于或等于,这个基本上能满足,对不对啊,但前面这几个不见得能满足啊,好,这是我们的这个我们的handle,那好,除了这两个条件之外,那剩下的不就是sal sle writer了吗?它就需要排序了。
13:13
对不对,哎,就是这样啊,好,那么我们这里呢,就后退啊,咱们的后退,后退到这里的话就是else else的话就是我们的base shuffle handle,所以这个我们写上叫做其他情况啊,咱们叫其他情况,所以把咱们的这个呢,给大家稍微的去解释一下,让大家知道它是有一个条件在里面的啊来。好了,那这个呢,我们就先说到这里啊,最起码我们看到了它的底层的一些操作,那好,那我们前面咱们先不管它,咱们现在呢,就假设我现在呢,是什么呢?Short怎么样,同学们,我们就假设是short啊,咱们那个bypas,咱们一会来说,所以后退啊,咱们的后退,后退以后,来来来,我们走到我们刚才的这个位置来啊,咱们后退好在这儿呢啊,咱们这边不就有一个叫base吗?如果是base的话,是不是就是这个writer啊,所以我们点击它就是你获取了那个writer来后退,同学看啊,我们这个叫get writer就把那个我们的它得到了,哎,跑哪去了,在这。
14:16
叫sort shuffle right把它就得到了啊,那你得到了以后呢,然后干什么了,然后right,所以啊,我们点一下,点点right以后,我们可以去找一下啊,来找一下,咱们叫sort sle writer,咱们打开啊,打开打开以后大家会发现这个地方就是我们的right,而这个right首先它会有个什么呢?叫short,叫排序器,它是用来做排序用的。啊,大家想想,其实你想引明白,我们有索引文件,有分,有那个数据文件,那你的排序以后,让我们的下游的数分区不断去读它,对不对,那你得有规则,你得有顺序啊,所以这就需要排序,那么如果你忽略排序的话,那么你可能就需要通过别的方式来定位了,对不对?哎,所以这个方法呀,都差不多,只不过咱们这需要排序,那么如果你排序的话,他会把我们的数据给他,那么插进去来进行排序,那么然后排完序以后怎么办?他们接下来就开始要right了,叫right parted map outut。
15:18
要把它写出了,那写出分区的信息,然后再给他提交分区,对不对,提交分区嘛,就这个意思,所以这个操作当中,其实他就在干嘛呀,他就在去写啊,就在写,只不过我们首先先把这个咱们先搞明白,他的这个写的这个writer也不是那么简单,他需要很多的条件在判断,最后我们用到了一个,它就是这个意思啊好,我们分几步来讲这个事情吧,嗯。
我来说两句