00:00
我们已经了解了杀父洗牌这种数据重分区的方式啊,其实就是一个随机分配啊,随机分区,那除了这种方式之外呢,还有一种重分区的方式也是非常的简单,非常的经典,那就是我们所说的。轮巡分区round Robin啊这种方式其实我们更加容易理解啊,所谓的轮询,那就是什么呢?按照先后顺序依次轮流的发放到下游的每一个并行子任务上啊,那如果对比之前的沙否是一个洗牌的话,那现在的轮询就是一个发牌啊,就是按照顺序来一人一张,一人一张啊,所以我们看啊,在这种情况下,这种方式他所做的操作就是所有数据依次来了之后呢,第一个数据分配到啊我们的第一个分区里边去,第二个数据分配到第二个分区,第三个数据分配到第三个分区,他就是这样去做的。当然了,对于上游的每一个并行子任务,它都是轮询分配到下游的每一个分区,所以我们看到啊,上下游之间的这种连接,这种传递数据的联系,那其实这就是一个M对N的一个关系,他们之间的这个数据传输可能要有M乘N这样一个笛卡尔级的数据量级来进行数据传输。
01:23
啊,那所以这种方式呢,其实非常的简单啊,而且它也会用在很多地方,比如说像这个卡夫卡engines啊,里边都会用到类似于装Robin这种轮询算法,那在实际的代码当中呢,我们调用的叫做data stream的。Re balance方法,哎,他reb,我们知道是再平衡重平衡的意思吧,他所说的再平衡,那就是按照顺序依次发牌。这种方式其实也是前面我们提到的啊,在上下游算子之间并行度发生变化,发生调整的时候,默认的数据重分区的方式就是reb啊,就是轮询分区,接下来我们可以在代码当中同样来做一个测试啊,那这一段代码呢,我们直接还是新建一个object,这一部分叫。
02:16
Rebance。Test。这一部分代码我们其实可以直接参考前面的沙否,基本上架构是完全一样啊,我们直接先把这个主体都copy过来,不要忘记上面这个下划线改一下,然后接下来其实就是洗牌的这一步,我们要改成一个发牌,改成一个轮询,所以这里边其实是轮巡重分区后。打印输出,那下面要调的方法当然就不再是shuffle,而是reb,那后面print我们也直接打印一下,当前这个叫。Reb。好,只要更改这两个地方,接下来我们就完成了整个代码的书写,接下来可以做一个简单的测试。
03:04
我们还是运行看一下现在输出的结果是什么样,我们可以看到开始是三,然后就是三四,之后就是一二,然后三四,1234,所以我们看到第一个数据,它从哪一个分区开始,这个可能是不确定的,但是呢,只要确定了之后,接下来就完全按照顺序1234 1234轮流发牌,这就是我们所说的轮巡分区reb。当然了,我们说默认情况下,如果发生并行度的变化,上下游之间啊,上面的S任务并行度是一,下边的print输出的时候并行度是四,那其实我们这里啊。Re balance有没有?其实结果是一样的,我们可以直接删掉中间的这个re balance操作,然后同样运行做一个测试啊,我们看一开始是二啊,然后是234,接下来又是1234 1234以哪个分区子任务开始,这个可能每一次测试我们的结果都不一样,但是后边的顺序完全不变,就是1234的轮询顺序啊,所以这也解答了我们之前,呃,在看到web UI上给我们展示的作业图里边,我们会看到啊,每一个框框中间它连一条线啊,其实中间它会写一些不同的单词啊,有时候这里写的这个单词就是reb。
04:28
那现在我们就知道了,他所说的其实就是极有可能就是并行度做了一个调整,然后中间我们这里的数据传输方式默认就变成了一个轮巡重分区,就是reb。
我来说两句