00:00
呃,前面给大家,呃,基本上把这个transform啊,在做中间转换计算的这个过程,所有的算子都讲解了一遍,然后关于这个data stream里边啊,呃,这里边能够做的这些可以调用的API操作,还有一些,呃,前面我们可能是没有详细给大家讲到的,比如说还有另外一大类,那大家去会想到前面我们讲这个KBY的时候,大家发现它并不是一个真正意义上的transform做的这个计算,对吧?啊,但是你也可以认为它是transform,但它其实这个transform就不是转换,它真的是转移,真的只是做了一个重分区。啊,所以大家会想到就是对于这样的算子来讲,在这个data streamam里边是不是还有其他的一些呢?啊,是不是不光是可以做一个这个P,我们当时说是基于哈西扣的重分区对吧?哎,那是不是还有其他的一些重分区方式呢?呃,确实有的啊,之前我们其实讲到这个数据传输方式的时候,是给大家提到过的,比如说这里边哦,大家看下边,这里边有这个broadcast对吧?Broadcast的话那就是。
01:09
广播对吧?啊,就是所有的这个数据来了之后,下游分区全部广播一份下去啊,这是这是比较特殊的这种用法啊,就是所有的这个数据都要,呃,下游下游的这个任务都要接收到一份啊,那另外还有就是大家看shuffle。直接就一个方法,就叫点shuffle shuffle是什么意思,我们说洗牌嘛,所以这里的洗牌其实就是跟大家说的,不是不是把牌攒齐了洗是吧,而是发牌对,随机发牌,所以这里它其实就是一个随机的把当前数据分配到下游一个并行子任务上一种方式啊,那另外还有就是大家看forward forward什么意思。哎,这就是直通对吧,或者说直传,那是不是就是只放在当前这个分区做计算啊,哎,对吧,这这就是直通啊,当然这个一般就大家可能想到没什么特殊的意义是吧?啊就是如果它本身能直通的话,我直接就传到当前分区就完事了啊,然后下面还有rebance rebance什么意思,Re balance rebance,大家看这里边的注释啊,它说的就是哎,就是它是distributed的evenly,就是even是有这个平均对吧,均匀这样一个意思啊,就是均匀的分布,分布在呃,这个下游的所有这个操作的实例里边,然后另外它是在一个什么样以一个什么样的模式呢?一个round Robin模式。
02:38
轮询的模式对吧?哎,所以这个所谓所谓的rebance,就是当前所有数据来了之后,一个一个来了之后啊,那就是接下来发送的时候,下游有两个子任务。那我这儿就是第一个来这儿,第二个来这,第三个来上边,第四个在下边对吧?哎,这就是所谓的这个轮巡的操作啊,所以整体来讲这个呃,Rebllance,我们说它其实是发生并行度改变的,前后两个任务之间的默认数据传输方式,对吧?啊,就假如说这个并行度不一样的话,它默认就是用这样的一个方式做这个,呃,重新分配的啊,那除了这个之外呢,还有另外一个特殊的叫。
03:24
的话,大家会想到它是一个类似于叫什么叫叫重新重新平衡,对吧,有点像这个重新,呃呃,就是重重新做一个均均匀化分布这样一个操作,其实跟前面那个reb啊重平衡是差不多的,那他可以认为是一个一个分组的rebance,简单来讲就是说之前我们这个不是一下子分了这个。两个分区嘛,那现在呢,比方说我现在是本来数据来了之后,上游就是有两个分区,下游呢,对下游有四个分区。
04:03
那这样的一个并行度调整。默认如果要用rebance的话,那大家想是不是相当于我上面的这个数据来了之后,1234都都都分配到下面去对吧?呃,然后下边这个任务是不是也是1234轮询各各自分配啊,那现在scale不是这样的,Scale的做法是直接对,就相当于做一个分组。上游的话就是它对应两个下游任务去做一个rebance轮询,然后下游呢,也是对应它自己的两个下游任务去做一个轮训啊,所以这样的话是不是相当于传输的范围就小一点啊,有些场景下可能这种方式可能数据传输的效率更高,对不对对吧?这个就不要完全打散的去做轮询了啊,这是在有一些特殊场景下,可能去做这样的一个数据重重分配啊啊,那另外还有一个global global什么意思啊。Global是全局,全局的意思是大家看它是所有的这个数据啊,输出之后全部都会直接丢给下游的,对下游这个处理算子的第一个实例,也就是不管下游有多少个分区,我是不是相当于直接全传输到同一个第一个分区里面去了,并且都变一了,对不对啊,所以这个一般大家要谨慎使用对吧?啊,就是如果你真的是要把所有数据全汇总到一起的话,可以用这个啊,那你如果不是想用这个的话,那那尽量不要,你这样是不是并行度就完全没用了啊,这是这个global啊,那另外还有一个比较特殊的,大家可能会想到这这是我们预定义好的朝下游传输的方式嘛,那假如说我想自定义可以吗?
05:44
可以的,大家看,还有一个叫。Custom也就是用户自定义的重分区方式,对吧。所以你看所有的这些操作啊,这里边的这些data STEM API里面可以调用的方法都涉及到的是数据重分区,数据在任务之间传输的方式的一个定义,对吧?啊,那关于这这里的这个position customer它它的这个定义到底是什么意思呢?你看它的定义就是这里边有一个partitioner分区器,对不对,那大家想这个分区器是干啥呢?
06:18
这就是你当前给我定义一个key,然后哎,就是定义一个我当前到底要,呃,就是这里有number of positions对吧,就是你当当前到底有几个分区,然后最后我就返回一个你到底要去哪个分区,对吧?啊就是这样的一个输入输出的关系嘛。那所以大家看到既然是自定义分区器,是不是必须得有一个K啊,啊,我现在又是thent streamam,你并没有没有做KBY啊,那这个K从哪来呢?那你看是不是后边要自己再去定义一个key select啊,跟我们那个KBY操作差不多对吧?啊,所以这是这个用户自定义这个分区器啊,所以flink里边整体来讲,你看这个Spark里边,呃,有有的这些操作啊,类似的这些shuffle的这些功能,这里边其实都是有的,只不过呢,一般情况我们在flink里边这个操作比较比较少用,因为它是来一个处理一个,只是直接发牌嘛,所以我们一般不会专门去专门的去说这个杀后这步操作,对吧?啊,就直接在这个代码里边,其实就已经涵盖了,一般我们也不专门调用,呃,这里边我们可以简单的给大家写一个代码,稍微的测试一下啊。
07:29
去new一个class,这个是。Transform test6。呃,这个叫做,呃,我们就叫做重新分区对吧?好呃,然后在这个里边,我们首先还是把前面的。这个算了啊,这个本身分区比较简单,我们就直接简单的给大家把这个过程写出来吧,Get execution environment,然后DV先定义出来啊,然后首先我把这个如果要是原始状态下,我们之前都是把这个全局并行都设成一的,对吧?但大家想如果我要检测它的这个重分区状态的话,是不是不应该给一啊,对吧?我这里边可以给大一点啊,我给一个四,然后接下来我可以从文件里面去读取数据,这个还是一样的啊,我们直接把那个读出来。
08:30
然后这个我也不做转换了啊,直接读出来,后边把这个引入后边可以直接做一个输出对吧。Input。呃,这个就是我们原始的这个input stream啊,最后不要忘记把这个execute执行起来。呃,这里边少了这个throw exception对吧?好,这是我们这个完整的流程,然后这里边我们还可以做一个重分区操作对吧?呃,我们我们这个啊,直接给大家做一个杀吧,非常简单,直接input stream,大家想我直接杀uffle是不是就可以对吧?呃,这里边我可以得到一个shauffle stream,好,呃,下边来一个这个shuffle stream.print。
09:29
闪,大家可以看看这个效果到底是什么样的啊。运行一下。我们看一下最最呃,后边这个执行出来的结果啊,好大家看一眼。首先input的这里面,大家看这个这个是怎么怎么样一个一个输入的。哎,大家看这个341有四条数据对吧,其他这个七六七十各是一条数据,它这个其实就是几乎就是均匀的分配在这个1234里边,对不对啊,就完全是这样做的这个操作啊,然后后边我们做一次那个沙否之后,诶大家看是不是就相当于这个分区就完全调整了呀?啊然后这里边啊,当然这里边大家看这个打乱的好像不是完全的随机,就好像是一和四两个对吧?啊,主要是分配在这个一和四两个,这主要是因为我们数据比较少嘛,如果数据比较多的时候,这个呃随机分配就会比较明显了,那其实你像我们前面的这一个就是1234,为什么看起来它更均匀呢?
10:35
其实大家会想到前边如果要是对应的啊,我们读取数据之后,然后去做这个,呃,后边做这个具具体的这个转换,那其实前边是不是读取数据,我们从这个文件里边读取数据,假如说并行度只能是一的话,那后边从一变成四的这个并行度是不是就是一个,就是一个轮训re balanceance的过程啊,那所以它其实是完全均匀的啊,反而比我们后边这个直接杀火更均匀,对吧?啊,那后边如果说你还想做一个其他的那个测试的话,比方说KY,我们前面其实也测过了,对吧?呃,我这个input stream啊。
11:11
如果要是直接做一个这个K的话。比方说我们,呃,当前这个就不能基于FS了啊,如果要是想做key的话,大家会想到是不是前面我还要再做一个那个转换操作啊。这个才方便一些,对吧,我还要把这个定义出来,定义一个这个sensor reading类型的data stream啊,那这里边我需要K的话,用这个data stream k by当前的ID。呃,那比方说这里我就直接把它打印出来了啊,这个是K。大家想一下,这个k buy出来的结果跟前面的这个shuffle或者是直接打印的这个结果有什么区别啊?我们把上面这个其实也可以改成data stream啊,大家这样的话可能看的会更明显一点,重新运行一下。
12:08
好,再来看一下当前这个K败的结果。大家看,呃,首先就是我之前这个input的时候,这里边的这个sensor reading,呃,它有一个特点,其实就是说整个都都都很乱,对吧,这个分配就都是都是很乱的啊,你即使都是341的数据,它是不是也都是一四,大家看这个三有可能分配到不同的地方啊,呃,然后那个不同的这个ID也有可能分配到相同的这个一个分区里边去,对吧?啊,这个是没准的,然后后边如果说这个沙否的话,就是在之前的那个基础上做了一个打乱,这个大家都知道,那K败呢。K派大家看一下这个K派七,这是在四上面对吧?啊,当然这个后面没有七了啊,十在二上面,一在三上面,然后大家看后边的一是不是都在三上面啊,这就是K外的这个特点对吧?原则就是这样的嘛,KY是不是按照哈西扣的重分区相同K的那个数据是不是一定在同一个同一个分区上啊啊当然就是说同一个分区的话,VB都一定都是呃都都有这个呃相同的一个K对吧?它有可能有多个K,因为我们说呃这个不同的K,最后我们的哈希code是要再去取模对吧,分配到对应分区上的啊,所以大家通过这个应该是看得很明显啊,这个结果能够看得很明显。
13:31
啊,然后上面那我就把这个先先注掉吧,对吧,不要影响我们后边的这个测试啊,那最后再给大家看一个比较特殊的这个global吧。呃,这个我们基于data stream啊,或者说input stream也一样,对吧,直接调一个这个global,然后print啊,这个这个不是皮,这个是global啊。
14:00
好,大家可以想象一下这个global输出的结果是什么?就global我们说它是把所有的数据全部发送到下游的,呃,第一个分区里面去,对吧,所以当前它最终输出的是不是全是一啊,哎,大家看这个就是直接就能想到最后的这样的一个结果啊,这就是关于这个数据传输和重分区的一个过程。
我来说两句