00:00
那接下来我们看另外一个好用的功能,叫切分去虫。Spiritli distinct。咱们前面聊的local global啊,对这种普通的聚合操作,比如说sum count max b avg啊,求均值这种有特别好的效果,对吧,因为它都会本地提前聚合,但是如果咱们用到了去虫再统计啊,比如说count distinct。这个时候咱们local global的效果就没有那么理想,这个时候呢,啊,那这边单独设计的一个功能。叫split distinct,它是什么呢?它能够帮我们解决这种去虫场景下的聚合。来,我们来看一下啊。这个是从1.9版本开始提供的。我们看一下这个原理是什么,呃,大家注意,咱们现在要去虫对吧,好。如果是。
01:07
这个是local global的实现,为什么效果不好啊,因为它去虫,去虫效果不太好,那我们看一下它如果是local global会出现一个什么样的场景,大家注意红色跟不不同颜色代表你做key,拜,呃,真正的不同key的分组,好,那如果是local global,是不是先在本地进行一个去虫对不对?那你看这是一次本地的驱虫和聚合,你看比如说这是两个不同的A,它是把它汇总起来是A2啊,对吧,那B它是不是去重起来B一个,对吧?在对另一个组的B也去重聚合,得到B1,好,那下面这个每一个都一样,都是本地的去重聚合,再之后呢,再根据真正的key再去分组,再一起去重,那你看在这种场景下,红色的是不是依然有很多的数据啊。
02:03
因为他做的是什么呢。Distinct的去虫,它并不是说把这些所有的都汇总成一条数据啊,这是问题所在。它的驱虫、本地去虫还是有很多不同的,在这里面。还是有很多。那所以这个时候呢,我们看看。这个local global效果就没那么好了,那这个切分这个是怎么做呢?它是打散分筒,那么大家注意,你看这里的线跟第一次的县是不一样,它不是本地啊,它相当于说自己先随机。打散成几份也不是随机啊,它会取哈希值,将原先的数据先按照一定的哈希算法将他们重新打散成几个桶,你看这是A跟E的这个,呃,这个桶呢,就A肯定来这里,E肯定来这里。就是说你相同值肯定去的是同一个地方,那你看经过他们的计算,是不是分成了四组啊。
03:05
对吧,那。这边。你相同的这个就到一个地方去,那去重效率是不是就高了,对吧,因为都在一起嘛,大家都去重完了,那数据量就可以急剧的减少了,大量所有的A都来到了这里啊,所有的B都来到了这里,你看啊,这里红色的B,你看是不是这里有一个,这里有一个,这里有一个,这里有一个。对吧,这些所有的币经过咱们打散,还有那个哈希算法,所有的币都得来这儿,那经过一去,虫是不是就只剩一条了。那这个另外一组的B也来到了这里啊,它是根据具体的值啊,来做一个打散,打散完之后呢,他再根据咱们真正的分组啊,帮他去到各自的地方进行再次的全局去重。那这个呢。也是两次处理。两次处理,只不过它第一次是什么?打散是真正的实现的打散,Local global是本地聚合,这个呢是叫打散。
04:05
好吧。怎么打散呢?就是通过这个公式啊,哈希扣的,然后呢,对于咱们要去重的T取哈希值,然后再以分筒的打散的分桶数取模啊。所以呢,这样才能导致才能实现说同一个去虫剂到一个桶里面去啊,这样效率才高。那么基于这种场景,咱们看看如果手动来实现,能不能呢?也可以就比如说这么一个案例,Group by a,然后呢,Count distinct b。那如果是,呃,没有这个功能,咱们自己写怎么写啊。是不是先自己将什么去虫的key打散?比如说你打散成1024份,你是不是对1024取模对吧?取哈希值再取模。哎,之后呢,先去重聚合一次,之后呢,你再按照真正的分组key再聚合起来,这个就是咱们手动二次打散的二次聚合的二次处理的那么一个circle,那现在呢,咱们有了这个功能啊,有好的不用你为什么要手动呢,对吧。
05:12
哎,这个参数就有这么一个参数。开关啊。Distinct聚合,切分打散,把它制成醋就可以,另外呢,就是打散成几份。对吧,统数它叫统数,默认你不设就1024啊1024。这个呢,就是咱们的这个用法。参数就刚才提过了啊。另外有几个注意事项啊,第一个注意事项呢,就是他不能。对咱们的udf实现这个自动打散功能啊,它不行。另外一个咱们拆分出来的两次聚合还可以同时结合local global1起用也没问题。
06:00
可以一起用。另外一个该该功能是1.9才有的啊,这一款大家注意。好了,我们演示一个粗糙的案例,对吧?把元宝这个没停啊。咱们直接提交呗,啊看一下代码是吧,来。Distinct的案例啊,这边是按照设备ID分组,然后呢,对AR就某个字段啊,这你不用纠结是什么。AR应该是渠道还是什么玩意儿啊?按照这个字段去重统计对吧,就简简单单这么一个时候,什么也不做,什么也不处理好,那接下来咱们提交。提交上去,咱们可以去看一个,呃,是不是否还它的一个热点问题,对吧,其实看那个萨task就行了,下面这个应该也少了一个杠。
07:02
保存。应该提交上去了吧。好,去虫的聚合在这里吧,对吧,Group aggregate啊,这里有个distinct。好了,看一下子任务。按照mid分组,肯定有什么热点问题。对吧,这都六兆了,这些才300K。很明显了,明显的不能再明显了啊,你看现在更明显了。30兆的话,这边才1.5兆,这个就是,呃,咱们不做任何处理,存在的一个热点问题,那你看上游全反压了,你看九十九九十七对吧,黑的就反压了。那接下来咱们来看一下SP spri distinct的帮我们做的优化,还存不存在这个倾斜问题,对吧?那么大家注意咱们刚才讲的这个功能要结合什么?Mini batch,说白了咱们前面讲的local global也好,Spli。
08:08
这种优化也好,都得什么产批,你不展批他的那个两阶段处理就没有意义啊。所以咱们这边mini batch mini batch我们看一下啊。这边我是改成了,呃什么呢,Mini batch也需要来指定的啊,Mini batch开启,嗯,然后呢,这个是local global,这个就是spirit distinct。这样更方便使用啊好,那接下来咱们提交你看mini batch开启,还有这个功能,切分打赏功能开启,好,那接下来咱们提交案例。等他执行。
09:13
那我们观察一下,我们先看一下沃UI,你看首先。我们看一下它分成了两阶段,第一阶段叫什么呢?就是部分类型,局部类型,这个是什么?这个单词的意思是部分的,也就是说他第一次帮我们打散,进行一个部分的聚合。好,再看第二步阶段,它是什么呢?第二次聚合的类型是final全局的那个聚合,那为什么这里还有local跟global呢?那咱们明明这里是制成的什么force,它怎么local global自动开启啊。
10:04
就是因为它还有一个功能叫通量聚合。这个东西。这个东西是咱们只要开启mini batch,并且满足一定条件,它自动,这是它自己的优化啊,虽然参数没指定啊,这个嗯,不耽误。那我们核心看那个切分有没有生效,就看这里,这是第一部分啊。接下来这个呢,是第二部分,那你看至少从全局来看,这边是不是都是蓝色的对吧。OK啊。而且我们看第二次全局的时候,你看是不是非常的均匀呢,都是两兆多啊两兆多,那第一次呢,看一下。是不是基本上也还好啊,因为咱们打散了对吧,打散呢。这个也就差个两倍左右啊,无所谓。这个就是给我们带来的收益跟好处,只需要开启参数,其他的不用我们操心。
11:01
非常完美。我重新截个图吧,这个比较好看一点。
我来说两句