00:00
好,那接下来我们看一个很好用的功能叫local global,这个功能能够很好的帮我们解决数据倾斜的问题。它是什么原理呢?来我们一起来关注一下,它将原先的聚合分成本地和全局聚合两阶段,是不是两阶段聚合对吧?但是它不是随机打散啊,它是本地聚合加全局聚合,就像咱们前面数据倾斜处理的这种场景,K败之后的聚合存在数据倾斜,咱们是不是自己实现了展P,然后呢,在KBY之前呢,咱们先把它本地聚合一下,聚合完咱们在分组之后再真正的将它全局聚合起来,没错,咱们circle里面用开启这个功能即可。开一个参数就搞定了那个事儿了,写蛇口是非常方便的啊。这就是咱们说过了,像MR里面的那一个什么提前combine啊,提前combine豫剧盒,来我们直接来看这里。
01:06
呃,比如说这是三个map算子,那它有不同的颜色,每相同颜色代表的是KBY之后的相同K,也就是同一组的数据啊,那么如果咱们直接K败聚合会有什么问题呢?你看红色的这一组这么多数据啊,另外紫色的这么少。那你看这里是不是出现了数据倾斜对吧?好,那如果是local global是什么意思呢?来。那注意看他先在本地进行什么本地聚合对吧,先将本地,呃,你未来要分组的T,他先提前聚合好啊,你看这紫色的聚合好,红色的聚合好,后面这个也一样,这个是不是就本地combine呃,提前预聚合对吧,像MR的combine一样好,再接下来再按照真正的T呃,做一个T,拜哈希。之后呢,你看红色三条紫色三条这边是不是就没有听写了,这个呢,就是对应的第二阶段聚合,这个呢是由flink circle开启参数之后自动实现。
02:08
但是有前提。你想想,如果它是一个纯流式的。纯流式的,你怎么实现说本地聚合呢?就像咱们前面讲,呃,第四章的时候一样的道理,咱们是不是自己展P啊,哎,没错,所以咱们的local global。必须结合什么功能一起开啊,刚才讲到的mini batch啊,展P再加上local global就搞定了啊,展P加两阶段聚合好。开启方式特别简单,就这么一个参数而已,你看就这个参数。这是table里面的一个优化参数,那叫什么?聚合阶段策略我们指定为两阶段就可以了。另外呢,一定要开启什么mini batch功能,Mini batch这是一个开关,这个是两个批次的触发条件,对吧,要么调速,要么时间好。
03:02
就这么来开就行了。好。如果还有一个就是如果你是自定义udf的话,你要实现这个梦方法啊,那如果不是udf,那就不用管了来。我们提交一个简单的小案例啊,这个呢,是咱们circle DEMO里面的。这边我划分了很多分支啊,就是为了方便偷个懒嘛,然后我写到一个代码里了啊,就不同的输入条件我执行不同的circle,好吧,那咱们来看看这个DEMO,跑的是count这个DEMO。前面就是一些准备工作了啊,然后呢,这里你看local是否开启这个参数是我自己命名的啊,我利用这个工具类把它提取出来,呃,你看开启local global啊,那我就设置这几个参数啊,开启其他功能我就设置这几个参数啊,是这个这么回事啊,再往下走,我们看DEMO的circle。
04:04
我们是count对吧,是不是这个。那我们看一下这边。看这个色号就行了。是统计每天mid出现的次数,每个mid出现的次数,那是不是得按天分区啊分组啊,是不是还得按设备呃分组啊,然后再去count,对吧,就很简单的一个逻辑分组count。那我们知道mid是存在数据倾斜的,那么就直接跑一下啊。这个咱们快速跑就行了。前面都了解特别多了。好,已经开始执行,我们看一下页面,我们UI还记得数据倾斜怎么看对吧?看一下它子任务的接收和发送数据量就行,我们看一下聚合在哪里啊,应该是这个group are g对吧?分组聚合操作好看一下。
05:12
其实从这我们也能看出一点端倪呢,是不是其中有一个sub task处理的数据量明显呢?要比其他的多是吧?等他再跑一会儿,你看其他的都是一兆多,这个都已经处理了30多兆数据啊,接收30多兆。60多兆,这个三兆对吧,这很明显有什么呢,数据倾斜。好,那就不用看了,那咱们来看看优化的效果啊,那咱们看一下提开启了mini batch,还有一个local global的一个功能那。怎么样呢,对吧,那我这边又指定了一个什么,把这个参数制成处,这个参数是我自己定义的啊,只是为了取值,那如果设成醋,大家看一下local global。
06:06
四乘处是不是就会设定这四个参数啊,咱们刚才提到的这四个参数啊,Mini batch3条a local global一个,好,我们试一下。提交。等它部署上去。好在接收了。好让你。嗯。在这打开。那首先我们注意观察一下这个。提交的对了吗?哦,我去。
07:00
又多了一个空格什么的啊,等一下啊,这个登录不对啊。没有生效。这边多了一个什么吗。这里忘了这个啊,又忘了这个分隔符。那他这里直接就相当于说命令就提交这里,提交到这里没生效。啊,没事。咱们重新来。啊,这一次没问题了。我一看那个作业图就知道有问题啊,因为没有我想要的东西。Running了,打开。这一次应该就。对了,来看这里。你看到这边有一个叫什么local。分组聚合,这就是local global里边的第一阶段,本地聚合。你从沃UI势能很明显看到,再往右拉一点,你能看到一个叫什么global全局的分组聚合。
08:05
对吧,你看这里就特别明显了,而且你再往前翻。这里有一个。Task克尔是什么?Mini be分配器对吧?这里呢在干嘛呢?在长P啊,这里就是一个长P的过程。好。从UI咱们能看到这些明显的mini BAT也好,Local global也好,都开启了,接下来我们看一下本地聚合。也还好吧,没有像这种倾斜几十倍对吧?啊,基本相对比较均匀,有个别还稍微大了一丢丢,这无所谓了,差距不是很大。接下来我们看一看这个全局聚合,你看数据量多小,两兆,前面发过来至少都是大几十兆吧,对吧,后面过来两兆。因为它是本地聚合的结果,再进行聚合。好了,你看这个参数多方便,你看后面全是蓝的啊,没有繁忙,也没有什么那一个circle,简简单单写完设置几个参数搞定了,数据倾斜对吧?这非常好用的一个功能。
我来说两句