00:00
不好讲,来,我们首先看一下这个流图在哪里,我我们每个图关注两件事,同学们,第一件事在哪里生成对吧,生成位置,第二一个怎么生成的啊,但至于怎么生成呢?这个大家可以呃,不那么重点去关注,因为那个是代码底层的一个逻辑了啊。就是各种数据结构弄来弄去,弄来弄去啊。但是在哪里生成,我们一定要知道啊,那这个在哪呢?还记得吗?是不是在执行用户代码的时候生成的流图啊,咱们提交流程是不是讲过了,呃,所以咱们直接来到stringcution element,找什么呢?找exe的方法,那经过层层调用,诶是不是咱们当时是没细看了。哎,所以你可以直接进入这个方法看一看它怎么生成的流图啊,诶大家注意这个是什么位置啊。
01:05
是从整体大的方面来讲,是不是在这个里面啊,对吧,还在属于客户端范畴对吧?啊,所以我就简写出客户端啊,简写就客户端如果具体一点是咱们提交流程里面是不是具体的什么执行器啊里面的对吧啊。啊,不是执行器啊,就是客户端里面啊,就是啊。好,那我们看看这个方法,废话少说,进来又套娃掉了一层对吧,无所谓,赶紧继续点。啊,这边我提前都把一些重要的都给标上了啊,省得又找半天浪费时间啊。那这边呢,我们终于进来到了generate,这里有一个生成的方法啊,那这个跳转的过程大家可以不用去记忆,就如果你想自己看的时候,你要么对着文档我的跳转过程一步步点进来,要么你直接搜这个方法直接进来好吧,啊你所以大家不用纠结说哎,咱们看原版老是跳来跳去的,逻辑上很乱啊,呃,你你分清主次好吧,分清主次跳转过程可以忽略,需要的时候再去现跳啊。
02:10
点好了。Generate里面就是它的一个生成逻辑了,那这里面呃,有一个东西叫。Transform这个是什么东西呢?这个东西就是电力咱们的每一个扇子,然后把它依次放到一个list里面啊,这边我还是得标一下啊。是。是一个list,我们说依次有,呃依次呃存放了。用户代码里的算子。什么意思啊,比如说咱们整个代码写了map,呃,后面写了一个the,呃等等,比如说就两个呃,一前一后,那么这个transformation呢,它是这么存的,里面有一个method信息,后面有一个fit信息,是按顺序的啊,按顺序的,所以咱们要生成图的时候是变它是遍历这个啊。
03:18
对吧,便利这个便利这个东西啊。那我这边文档里面也介绍了更详细的,咱们简单瞅一眼啊,这边我介绍了这个是怎么来的啊,怎么来的,那这边呢,我是以一个算子为例,比如说脉算子。Map算子就对,它是最里面的map算子,它调用的时候调用了map,又调用了map,咱们简单大家看一下啊,省点时间啊,那这个map最终会调用一个损直缝方法啊,那这个里面啊传的一个名字类型,还有一个时均。Map指的是map扇子啊,对map算子做了一个封装,那么之后呢?
04:03
它里面又套娃对吧,哎,套进来最终到了一个都全是缝,那最终呢,在这里面做了什么事呢?啊,我关心核心逻辑。这部跟。这那么这一步是不是利用了一个什么,这个名字,大家熟悉一下one input是不是单输入啊,单输入的转换,单输入转换返回了一个这个,然后把这个给谁呀。给后面ADD。啊,这个,那我们直接看核心逻辑,我带大家看一下这个do存储缝方法吧,好吧,这里面其实我也标了。呃,是在哪里来的?啊,这里啊,我没必要这样。呃,这里跟。
05:02
这里这个就是咱们文档的位置对吧?调用map算子最终会来到这啊,大家知道这一点就行了,然后呢,做了一个单输入的转换,单输入转换之后呢,把它添加这个方法大家注意点。对应上了吧。是对咱们来讲一个结论是把这个算子封装完之后,一个一个添加到这个list里面啊,这个就是咱们要知道的是这就够了啊,这就够了,好,那咱们就不用过多去看了,所以这个时候这里啊大家就能理解了啊。好,接下来往里走,纯直缝,它每一个怎么转的呀?啊,纯直缝方法里面我们看下面啊。呃,其他那种无关逻辑我也不去讲了,也不是无关,就不是主要逻辑我不讲了啊,省点时间,不像之前一样一行一行看,那太慢了啊。嗯。
06:00
那我们这边,哎。是不是又调用了一个全是类方法呀?来,继续往里看。在这里面呢,我们直接看到往下走,往下走全是内里面往下走,这里你看他做了什么。是否应该执行在批处理模式啊,是不是做了判断三元表达式,如果是P处理是不是走上面。那如果是流处理是不是走下面,哎,所以我们是不是应该看这个。对吧,所以我们就往下走来点。我们发现它是一个接口。那早实现。找谁呢?是,呃。肯定不是think对吧,呃,咱们think什么特殊的,最后一个算子才是,那我们先看看其他的这些对吧。呃,我们先看它的抽象附内找什么,诶是不是有啊。
07:00
对吧,是不是有这个方法。好,接下来。找谁?他说又调用了一个一次方法对吧?啊,又调用一次,大家知道又调用一次就行了,再往里走。那么发现是个抽象的。我把方法名考一下,那么接下来该找谁呢?哎,该找谁?大家注意咱们扇子啊,这边要给大家讲一个事,比如说map扇子跟鸡卖扇子。Map算子在咱们图里面表示,最后是不是会有一个圈啊。是不是能看到击败能看到吗。几百能不能看到圈?看不到吧,击败对数据做转换了吗?改变的数据的类型的吗?没有对吧?啊,所以像这种击败类型的算子,它不是对数据做转换操作,这个大概念大家有吗。
08:02
那相同的算子还有什么?优点改变类型的吗?Connect改变类型的吗?啊,就这种是不是用来重新分配一下,或者怎么描述在一起,对吧,是数据间的关系,而不是改变数据本身,这种是不会表现成一个圈的,那这种对应的是哪一个呢。以KBY为代表的,对应的是这种partition是不是跟分区相关的,那么普通的转换扇子map flat map上这种在哪里呢?还记得咱们之前添加的时候,是不是一个one input对吧?啊,所以咱们就要找这个啊,这个给大家说明一下啊,说明一下,那么这里面呢,还有更具体的对吧?啊,是reduce相关的,聚合相关的对吧?时间错误,Mark相关的,还有正常类型相关的,咱们主要还是看one input。
09:01
好,走进来。啊,知道怎么走了啦啊,我这边还是标一下啊呃。我们说区分。Map之类的。转换算子。和key之类的分区算子对吧,那么如果是map之类的,应该是找一个弯。Input对吧,那击败之类的分区扇子代表呢,是partition好吧,啊,这关键词大家留个印象啊,好继续啊。回到万运步。找这个方法啊,又套了一层对吧,无所谓,赶紧速度点进去啊。好,那这边咱们看几个核心的逻辑,你看。我提前都写好了,咱们直接看就舒服了啊来。
10:02
String gray是不是添加了一个操作,添加了什么啊,String node是不是添加黄点啊,黄圈圈啊。对吧,咱们当前是不是进到这是把当前这个,比如说map段子是不是加进来了,这个时候是不是把黄圈就有了,对吧,好再往下走。咱们除了黄圈是不是还有一个边啊,留边对吧?在哪里呢?在下面这里是不是也加了一个边啊。对不对。啊,所以咱们知道它图是怎么生成的吗?他是不是每个。顶点每个边就依次编辑,依次加进到一个叫stream gray的类里面,类的对象里,是不是啊,它是这么来实现的啊,这个咱们简单做一个了解也就够了啊,也就够了,那么。呃,那比如说呀,咱们来一个具体的过程啊,具体的过程。
11:01
来,那比如说他举例的这么多种。举例了这么多种。那是不是有sources操作,像老版本呃,Union,还有老版本的SPSP等等这些我们说了这些算子是分两类啊。一类叫什么one input的,一类叫part提,Part提是不表示啊,所以正确的画法应该是什么呀?这样子吧。他把什么省略了。这种东西是不是没有了,跟分区相关的啊,那还有一个这是什么。Re balance跟哈西partition这种是不是也没了对吧?啊,这个咱们大概知道一下就行,你要细看的话也行啊也行,那么大家可以自己去看一看,那么。我在代码里面。呃,是也也也都给大家做好了啊,比如说这里这里有没有。
12:04
但是加边的时候我就有了,因为咱们边是不是包含了那些爬梯了是吧,那些爬梯绳也在这里面,所以这个会重要一点啊,在加边里边再往里点你看。他这边是不是区分啊,哎,我们简单看一下啊,在加边的逻辑里面,他是不是做了一些分支判断了。对吧,你是什么类型,我就在递归调用这个方法,这个是不是本方法名啊,是不是在递归调用一遍啊,就慢慢一个一个的加进去,是什么类型你就按照什么类型添加,说白了就这么一句话,按照类型添加。按照类型添加边啊,按照类型。啊。啊,然后还有一些细节,真正的构建这个边对吧,这个边我们说呀,它是不是得。
13:03
有输入跟输出啊,怎么体现呢?在代码里面它是区分的啊,会区分的啊。比如说上游节点跟下游节点,这个对应的应该是他的。是吧?在咱们的边里边上游节点表示它的入吧。对不对,那么下一点是表示它的出啊,这个对应什么呢?对应这个嘛,呃,放半天啊。就最原始图,比如说这个边,它的上游节点是不是它的入对吧,下游点点是它的出对吧?啊就是说代码里面它会体现出出跟入,那么具体呢,咱们也不用去看了啊,那还有一个如果没有指定分区器怎么样?会为其选择。Forward或者re balance这种代表的是什么呀?代表的是什么?
14:01
没有指定分区器。分居期没讲完。比如说杀手算子。啊,那不知道是吧,居然不知道,那我给你们简单瞅一眼啊,什么叫分区器啊?对,塔是最里面,比如说找沙否扇子。哎,不在这里面吗?在哪里啊。Single。弯,哎,不对。那个叫什么?那我直接搜吧,方法。方法。方法没有?我打错了吗?哎呀,不早了,不早了,或者我直接收,哎呀有点不甘心了。滑梯呢?
15:03
找不到就算了吧。这个分区器,比如说咱们是不是有个沙扇子啊,哎,那我点进来。是不是有一个杀手分区器啊,那同样的,比如说我击败击败是不是看过源码啊。他是不是有个key group partition呢,分居器啊。啊,这是很多分区器应该应该提的吧,你看它是这个副类,然后找呢。有这么多分区器,Re balance的的,Key keyba的,全局的,Forward的,Shuffle的,自定义的。二进制哈希的广播的就等等啊,这个就了解一下就行了啊。诶,回到咱们刚才的地方在哪里啊。啊,就不能跳,一跳就找不到地方。
16:03
关音部的,然后进来。呃,添加边里面对吧。加边。再点。好了啊,回到咱们刚才那个位置啊,这边也有官方的一句注释啊,就这个意思,如果分区器为空啊,会选择forward或re balancell分区啊,Forward是什么?是不是直接一对一怼过去啊,Re balance是反产生一个轮群啊,对吧?哎,轮群好了。那最终呢?呃,前面一大堆判断,最终要开始创建这个边的对象了,你看他穿的什么?是不是上游节点下游节点,这个是不是对应它的输入跟输出啊,对吧,前面都做好了,还有一个分区器对吧,还有等等,还有杀狗的模式好,那最终呢。你看是把上下游。诶,大家注意这边做的是什么。诶两个现在这个边这里是做好了对吧,他后面还做了一个事,那这个边同时是不是一个上游节点的。
17:09
输出对不对,对上游节点来讲,这个边是不是输出啊,他这边就是把他们之间的不可描述关系疯狂的去,呃保存起来,这样你才知道你的前面是谁,你的后面是谁是吧。那比如说。上游。添加它的出边对吧,是不是它的输出啊,然后下游添加它的入边,就做这几个事嘛,所以我们说他这个源码其实呃有必要去看,但是你去深究每一行,那很慢,它核心做的什么事啊,就是把前后关系捋清楚,该怎么加就怎么加,拼接在一起对吧,就做了这些事情啊。那么整体而言呢,这个就是咱们的一个流土,那是来总结一下做了什么事。是把每个扇子I依次变立做处理啊是吧,该做成节点的就做成节点,该做成边的就做成边,对吧,同时把它的上下游关系捋清楚,是不是这么一个事儿没了吧。
18:14
啊,就这么一个事儿啊啊,所以这个代码呃,咱们就看一看就行了啊,那后面这些啰里吧嗦的我就不看了啊,不看了。那其实我们文档还有一块是什么,是不是key,像击败union这种分区类型的怎么加,我是不是还没看呢。啊,他同样的是会做一些处理的同学们。就是这个以击败为代表的这种啊。这里同时也有,呃,我就给大家讲一下在哪看就行了啊,你选择这个类型,它同样也有这个流处理模式下的方法,好点进来,它也有自己的一个处理方法,那么大家知道这种不能形成黄圈的,它是。
19:05
虚拟ID,虚拟节点是虚拟的就行了。能理解吧?啊,这个咱不多讲啊。
我来说两句