00:00
KPI之前的呢,相对来说比较简单一点,对吧,这个问题很好解决啊啊那K败之后的啊,KPI之后呢,有两种啊,一种呢是直接聚合,另外一种是在窗口,好呃,那我们想一下啊,一拜一拜啊,它是按照哈希,那也就是说跟我们MR当中的一个。沙uffle啊,Spark里边的沙uffle是不是很像?好,那大家想一下,如果说在我们have当中,对吧,Have当中用了go by分组,那不就相当于这边做了key by嘛,对吧?或者MR里边有这个shuffle Spark里边呢,有这个shuffle,那这个时候我们该如何解决?我们应该如何解决啊,就是想一想啊,那我们扩展一下嘛,你既然碰到了数据倾斜,那往往我们像have mr48里边都有可能。
01:09
对吧。那这个时候应该如何解决呢?不知道吗?前面学了那么多的解决数据倾斜的方案,到这边来一个都不会了。啊,双重聚合是不是双重聚合,简单一点就是双重聚合,先用随机数把K打散,对吧,就是说之前是A,他说A呢有10万条,好,那我放A0。A11直到A9,把它变成A变成十个K10个对吧,10万那也就随机分配的话,我就可以认为是1万。
02:03
可以认为所有人1万对吧,10万就变成1万好说,为什么双重聚额呢?因为你这个A0算出来是A0的数量,A1数量,我们要算A的总数量,所以第二次把A_零一把这个后面的后缀去掉,哎,也就是说A有十条数据了,对吧?把十条数据呢,再做一次累加,哎,得到结果双重聚合对吧?哎,是一个很好的解决方案,那我们想啊,在这个弗当中能不能用呢?Link里边能不能用呢?对啊,我可以告诉大家,Link里边如果说K麦之后直接聚合不做开装用不了。用不了为什么,大家自己先想一想,我先不看啊,自己想一想为什么在flink当中用不了。就直接聚合对吧,不做开窗直接聚合,为什么他用不了。
03:11
而为什么Mr bug反而就能用,对吧?想一想,思考思考啊,有同学知道的可以打在这个微信上面给我看一下流逝啊,流是说具体一点。尾后。还是会一条一条写出去,没有解决数量问题,对了啊对了,还有还有一个问题,班长还有一个问题,你这个只是数量问题,还有一个问题。还有一个问题比这个更严重,可以想一想。没有结束条件重复问题对数据会错,不是没有结束条件啊,结束条件要要干嘛呀,我本来就留,我肯定没有结束条件啊,现在他不是一样的班长两个点都收到了啊。
04:12
班长,两个点都说到了对吧?呃,Reduce后还是一条一条写出去,没有解决数据数量问题,重复问题对吧?好,那比方说我们来看一下,这上面呢,画了一个图啊,那我们就不对着这个图来看了,我们直接我自己来写,自己给大家介绍一下,首先原始数据,比方说有三个A。啊,四个A吧,文件当中有四个A,我就拿四个来说,这说明问题啊,好比方说我随机数加的是一二,也就是说过来数据之后变成什么呢?成这个。AAA1 a22可以吧,这没有问题吧,对吧?因为我加了随机数下划线我就不写了啊,大家知道一下就行了,对吧?正常的你可要加一个下划线,因为加下划线呢,为了好去掉这个数据对吧?按下划线以分割,然后以Li,然后呢取第一个数组的第一位是为了做这个事对吧?好,那接下来我们要做key半好,本来呢,A进到一个分区的,现在呢,A进到两个分区了,对吧,A11个二一个啊,两个A一进到这好,两个A2进到这没问题吧,好,但是呢,记一下株距是一条一条来的,也是什么意思呢?既然来了一个A1。
05:35
再来一个A1对吧,好,那A1过来。分组嘛,做聚合是不是出去了,它是一个什么A1,好,它也出来一个A21A11啊,这一呢,表示抗的可以吧,这个后面一表示抗的啊好,那这个A1来了,这个A1来了,那这边呢。变成什么了,A12吧,好,这边呢是A22,到这一步有没有问题。
06:09
一步一步走啊,到这一步有没有问题。我们加随机数做双重结合,本来A是不是所有的进到同一个并度啊,注意这个地方是K半啊,这个地方K半我们在KPI之前加了随机数吗?对吧,所以它就分两个平度了,Al不同的明度可以吧,这块应该没什么问题,对吧?好,那继续接下来我们要做双重聚合,在这一块的时候是不是要把这个al干掉。把al干掉,然后再按A重新分组。去做聚合吧,首先我们想啊,我们把。一二干掉的时候你看啊,这边第一条数据A1。这个一条这一条这条这条四条是不是最后A还是怎么样,四条并没有跟原始数据比,并没有减少。啊,因为流它是一条一条的写出去的,对吧?来一条写出一条,首先这是班长说的第一个问题,对吧?哎,那并没有解决数量问题,你最后下游KBY,重新KBY啊,把这个随机数去掉之后,重新k by a还是四个A到一起了,这是一个问题,二个问题比这个更严重,没严重呢?啊,这A1过来的变成什么了?一吧,好,然后A2把随机去掉,又来一个A2不样的,A21过来是一个A1吧,A22过来是一个A2,好,你最后一加发现这个数据等于多少了,等于A6了,实际上几个A呀,四个A,也就是说最终呢,有数据重复问题,导致结果不对。
07:45
导致结果不对,对吧,两种问题啊,第一个问题就班长班长两个问题都说出来了,第一个数量问题,对吧,并没有减少数量。并没有减少数量,就第二次KPI之后,这个病度照样还是会倾斜在这一块,前面你可能在这解决了,二还是会产生数据倾斜,跟前面一样没什么区别,二更严重了,比之前还严重了,之前只有数据倾斜,你现在不光有数据倾斜还怎么样?
08:14
数据还错了?数据还错了?对吧,数据最终还不对了,你要再做一次金额不就错了吗?第二个问题能不能理解?思考一下这个问题能不能理解了?能不能理解?理解不了吗?理解不了咱这样啊,咱们呢一条一条数据看好这里边呢,还是有四个A啊,我们先一条一条走,结果啊首先一过来对吧,第一条数据来了,我把它变成A1啊第一条数据呢是A1可以吧,第一呢,分组分到这个这里边了,这是两个边度啊,两个边度好这是在这个KBY之后,在这边做一个sum对吧?好这边呢,得到了一个A11,然后继续就往下游传,下游船呢,再把这个随机数去掉做聚合吧,好,去掉做聚合,比方说去掉之后,那必然是一个A了。
09:29
啊,去掉之后必然是一个A,好,那到A这来到这个里边来,然后做后面数字的累加对吧?好,它此时是一个A1吧,是A1,这是第一条数据啊好,第二条A来了,第二条A呢,按照随机原则,我假如说就规定它为A2可以吧,A2,好A2来了之后呢,A2应该进这个对吧?A2呢,经过经过计算之后,A2第一条数据A1对吧?呃,那继续把随机数去掉,变成A,然后是不是也传输到这个平度了。啊,你看啊,二条数据来了,本来是拆开的,到下游又怎么样,又进到同一个冰度了吧。
10:06
对吧,好,这个温度取出理第二条数据把这个一累加上去,这个变成什么。变成A2啊,变成一个A2没有问题对吧,但是此时注意它已经处理了两条数据了啊,第三条数据来了,第三条数据比方说还是A1还是A1可以吧,还是A1好,那A1同样的A1按照K进这个密度,这个一就变成什么了,变成二了,因为第二条数就来了,那是不是同样的把这个随机数去掉,把这个一去掉,然后把A2往下游传的。对吧,往下又一传,这个地方变成什么了,变成四了对吧,因为刚才是二,你又来了一个二,我不就变成四了嘛,这里加双重聚合嘛,对吧,好,第四条数据来了,第四条数据呢,随机数是A2对吧?A2呢,记这个平度,那这个一变成二了,这个一变成了二了,那接下来去掉随机数。
11:00
重新分组,双重聚合,那就变成AA,是不是又进这个力度?好,那A2这个是刚才A4是不是变成A6了,所以刚才你看啊,这个里边是不是处理了四条数据。啊,数据并没有少,因为原始数据四条,你这边最后单个平行录里边处理了四条数据,数据并没有少,如果原始主与数据信息,那么到这块这个啊,还是会数据倾斜,这第一个问题,第二个问题,本来我有四个A,我应该算出来是A4,是你双重聚合之后出来的是几A6。出来的是A6。OK吗?能不能理解了,现在。这个应该没问题了吧,对吧,我们可以一条一条数据来看这个事情啊,如果还不能理解的,大家下去自己去想一想,拿纸笔去画一画,对吧,把这个内容画一画。
12:04
啊,你就清楚了,其实也就这张图,这张图本来是九个hello对吧?啊,为了处理这个数据倾斜啊,我们把hello变成HELLO1 1hello2hello3对吧,变分成三份,但是去掉之后,这边你那所有的人聚合之后都要去掉这个什么随机数,那去掉随机数对吧?去掉随机数之后进到一个分度里边还是九个hello吗?29个hello嘛,对吧,数据量没少,而且这里边HELLO1233条数据,它输出的结果是三条,而且是1233条,所以结果不对了,本来我要累加的是三个一,你变成123逐条输出,所以导致结果对了啊那就有问题,那就有问题,好,那这个双重聚合的不能用了,那怎么办呢。KPI之后直接聚合,难道没有办法解决了吗?
13:02
其实我们仔细想一下啊,刚才双重聚合的问题出在哪啊,两个问题,第一个数据没少,第二个数据会多,都是出在它是流失处理,来一条出一条,来一条出一条,那如果说这个数据啊,我不是HELLO1来了我就输出一个HELLO1到第二个一来了,我就输出HELLO23,对吧,如果说我等三条,我一起这三条呢,不输出三次,我输出直接输出一个HELLO3在想哎,会不会有刚才的问题。你想想看,MR或者4BUG是不是就是这个道理,随机数做完之后,我如果这个三对吧,我是不是只输出一次三呀,而不是输出1233条数据吧。开窗开窗不行啊,说了不开窗,下面是开窗。
14:11
开麦之后自定义状态啊。这定一张呢。啊,不开窗去处理啊,当然你你硬要这个地方用开窗啊,当然是可以解决这个问题的。对吧,因为开窗之后呢,输出一条,但是下面呢,我们去聊开窗去聊开窗。对吧,啊去聊开窗,因为你开窗呢,也有可能会收据信息嘛,对吧,我们下面去聊开窗这个地方呢,我们先暂时不用了,先暂时不用,如果说你结合了开窗再加双聚合,这个当然可以啊,当然可以对吧,嗯,那向总说了资金状态,对其实就可以用一个什么呢?这个思想啊,叫local key叫local k啊呃,我们。
15:01
把数据呢不打散,但是呢,我们先在map端,哎,那你看啊,我们map里边。这这个是map的对吧,这个是K,中间呢是K操作,后面呢是videos可以吧,这个地方是video啊好,那如果直接发。直接发这个数据,那是不是相同的定到同一个频度导致的数据倾斜啊,那这边假如我这边有三个hello,三个hello,我想办法我只给你发一个HELLO3出去行不行。对吧,我只给你发一个HELLO3啊,我只给你发一个HELLO3不就好了吗?对吧?所以这个思想啊,Look keep并不是一个操作,哎,是不是我设置一个参数就行了,不是啊,是一个思想啊,叫log k,那怎么做呢?就是定义状态啊,定义状态我在本地干什么呢?我搞一个。
16:02
状态啊,当然最好不要用哈,Map啊,最好用map state对吧,用状态,然后呢,往里边存数据啊,来一条存一条,来一条存一条,然后呢,我写一个定时器,定时器出发了对吧?或者说这边我们取一个SIZE2个东西对吧,一个size一个定时器。对吧,当我们有多少条,或者说时间到达多少的时候,我把当前这个数据做一个累加输出。我只输出一次。对吧,我不是说来一条输出一条,计算完之后输出我是来了很多,然后呢,计算统一输出,统一输出对吧,相当于在map端做了一个预聚合。是不是相当于在MR里边那个呃,Container。是不是?对吧,MR里边咱们可以做预聚合嘛,啊18个里面也可以做预聚合嘛,那在Li里边。
17:03
Comer,对ER啊对吧,对,就相当于这个comer是不是啊做预聚合,那这是一种方案吧,啊比开窗要好一点,因为你如果说本身就数据倾斜了,你开窗还会数据倾斜,那我们还要结合着开窗的操作来做这个事情。啊,这个就比较麻烦了,对吧,如果说你不需要开窗,你本身这个操作就是简单的聚合,不需要开窗,那无所谓对吧,你可以咱们可以用叫local key思想。在map端先做预聚合,哎,攒几条批次对吧,攒几条数据一起输出啊,攒几条数据一起输出,而不是来一条输出一条,来一条输出一条。对吧,这个能理解吗?就这种。能理解吗?啊,也理解不了是吧。
18:06
我们可以把数据来了之后收集到状态里边,对吧?然后写一个定时器,同时呢,再写一个大小,当大小到了,或者说定时器触发了,我们都把这个数据呢,做一个累加输出,对吧?然后把这个状态清了啊,对吧,这是相当于本地聚合嘛啊,先在本地聚合对吧?而我们流式数据没办法把所有数据本地的map端全部聚合在一起,像MR里边或者Spark,它可以把mapb端同一个K的数据全部聚合到一起再输出而流不行,对吧?所以我们只能根据时间或者根据一个大小来处理个事情。没办法合到一起啊,全部聚合在一起,全部都聚合到一起,没得聊了,因为流由是源源不断来的,什么时候又结束呢?结束不了对吧?好,这是K之后直接聚合啊,不开窗对吧。
我来说两句