00:00
好,那接下来呢,我们看这个fli so的一个优化啊,Li so优化第一个group group I对吧,啊,先分组再聚合的一个优化,第一个呢,叫mini batch。Mini batch。Mini看名字叫VP,是不是叫VP啊,它是什么意思呢?它就跟这个一样。跟我们刚才这个地方一样,就是。依据和。对吧,啊预聚合,但是呢,他不做预聚合,他不做预聚合,他只是说呢,攒一个批次输出,就是说本来你。有十个A对吧,你来一个输出一个,来一个输出一个频繁的交互,现在呢,我假如说攒了十个A,我做一次交互,就相当于我们之前网课要写批量提交,是一个道理,能听懂吗?注意这一块他不做愈合,他他不会把这个数据聚合起来,他是干什么事儿呢?就像我们批量提交,我本来每一条数据是不是都要往下游传一次,对吧,建立一个连接传一次,诶一直在发,一直在发,对吧,现在呢,我不这样,我攒个十条我传一次。
01:02
这样能明白吗?对吧,它相当于批量提交,对一次传十个,这样效率是不是就高了。呃,就是不能叫效率高了,因为吞吐量变高了,对吧,吞吐量变高了,但是呢,我们要缓存出去,其实时效性会变差。时效性会变差,当然你要取舍对吧,好,那这个呢,不需要自己写代码了,直接。对吧,三个参数,第一打开默认是默认是关闭的,对吧,打开mini BA,第二。设置时间,设置时间第三设置条数对吧,很合理,一个时间一个条数,就跟我们批量提交一个道理,对吧,我们这边呢,有一个工具类好。呃,My click house YouTube在这儿,诶那工具类对吧,工具类里边呢,咱们这儿是不是写了一个五秒五,这个五条数据,然后呢,一秒钟对吧,两个参数控制嘛,一样的对吧,五秒钟2万条。对,根据实际需求,没毛病,辛总说的有道理啊。好,这是第一个mini batch对吧,诶攒一个批四就是相当于批量提交啊好,第二个叫local global啊local global这个是干什么的呢?解决数据热点问题啊,他这呢预聚合啊,这个就是用预聚合做的一个结果,你看啊,本来。
02:15
热点问题嘛,对吧,好,那么接下来呢,我在map端做一个聚合,你看这个17红色部分十七十八十五对吧,然后呢,十七十八十五,这是预聚合啊,这个讲的就是一聚合,而我们刚才在做那个。Stream里边。K败后对吧,嗯,K败后做这个聚合已经说过了,对吧,这个地方呢,可以做这个预聚合啊。当然这边呢,你可以进行一个拆分,对吧?啊进行一个拆分,这个呢,只能做预聚合,只能做预聚合,因为没有开窗嘛,没有开窗咱们是不是只能预聚合呀。没毛病吧,啊,咱们要做预聚合啊,好,这个就不多聊了,叫local global,但是它有一个前提啊,它有个前提,什么前提呢,就是它。
03:03
你想要开启local global这个东西,要本地浴具盒啊,那你必须要开启mini batch,这个好理解吗?就是我要想开启log global本地浴具盒的一个功能,对吧?那我必须要先开启mini Bach好不好理解?这个肯定要开吧,对吧,我要本地做预聚合,那我得把数据攒下来,我才能做预聚合吧,对吧,所以它有个前提要开启mini BA,那它的参数呢,哎,这是mini半参数,然后呢,把它打的to face对吧,两阶段两阶段聚合对吧,第一阶段。好先。聚合一次预聚合嘛啊,先预聚合一次,再再聚合一次,对吧,所以叫连接段,它也叫两阶段啊,这个没关系对吧,我们知道它是预聚合就行了,这是预聚合对吧?你看这个图就能看出来吧,预句和好好,这是local glass,眼睛学会了,脑子学会了,不至于吧,这就是个参数啊,你只要把这个参数理解了不就行了吧。
04:06
班长,班长又在放烟雾弹啊,你这个说你不懂,我真的不信。啊,这个你要不懂我真不信对吧。好,那第三个,第三个什么呢,叫split。它是解决count的热点问题的。啊,看的热点问题,那我们想啊。嗯。这种啊。Local global是不是一具盒呀?对吧,好,那咱们还有一种方式是什么。加随机数实现双重聚合吧,那你考虑啊,如果说我加随机数实现双重聚合,我能不能做这些事啊。这个可不可以啊。不行吧,我做上抗的这个是不是我们分析过他不行啊。对吧,但是就可以。如果说你的聚合是的就可以,你是要驱虫就可以,为什么呢。
05:04
大家想。为什么?就是这个我们之前讨论的这个问题啊,这个东西我做reduce some。对吧,不行,那如果呢,我这个操作是一个驱虫操作就可以。就可以,为什么。我打伞。再去重可以。啊,做聚合不行。为什么呢?对吧。也是一个聚合操作嘛,对吧,多条进来输出一条。Some。这种不行而可以。不懂吗?那我问你他为什么不行啊?他为什么不行,你告诉我。辛总,你还说的那句话你还记得吗?
06:02
对泽总所说的,那新总之前说的什么,就是我们用这种方式啊,这种方式他是什么呀,他来一条输出一条,第一结果数据不会少对吧,第二。结果会出现错误,由于你不会扫嘛。对吧,你会出现错误,而现在我们是distinct的,Distinct呢?做什么事去虫好,你比如说第一条数据来了,第二条数据来,第二条数据驱虫干掉了,他不会输出,对吧?他并不是会出现来一条输出一条,来一条输出一条。能明白这个意思吗?能听懂吗?你之前是不是说来一条聚合一条,来一条聚合一条都会输出啊,现在呢,我是驱虫。对吧,你第一条来了我正常输出,第二条来了我还输出吗?我不输出了呀。明白了吗?所以我们数据量会下降。对吧,而且又是它是去虫。
07:02
对吧,而且你又是去虫。对吧,我最后呢,输出结果也不会出错,我只输出第一条,我后面就不要了,所以他是不是也解决了这个问题啊。听懂。对不对。所以你看啊,特殊的场景,它是一个特殊场景,他做这个驱虫呢就可以对吧,诶先干什么打散看。好再聚合对吧,这就是我们所说的A叫加随机数打散再双重聚合,你看图是不是能看出来。对吧,就这样的一个效果,哎,我先打伞对吧,去虫是可以的啊,这是呃,Li的这种方式对吧。两可以开启这个东西啊呃,直接开启参数就好了,还是参数啊好,这是第三个叫Li。洗澡又开始装啊。好,那么第二个叫改写。这个啊agg,然后呢,With的一个。语法啊,就是提升count的这个场景啊,这个呢,是它内部做了一个优化嘛,这个没什么好说的,就比如说Spark circle对吧,Spark circle默认的它用的是什么呢?用的是这个pack文件格式对吧,那如果你的文件是pack,它效率就是高。
08:17
因为它底层做了优化,那这个也一样,它对于这种语法做了优化,所以呢,你用这种方式代替count效果要好,你比如说场景是什么样的,你看啊。Count distinct uidd,对吧?Count distinct case,哎,好多count distinct的,对吧,那这个时候我们可以改写成什么呢?直接count distinct,哎,都是UID,然后filter,哎,改成这样的语法对吧?他会对这个语法做优化,这个没什么太多的,说说有什么理解的地方。对吧,没什么好理解的,你比如说就刚才我们举个例子,Spark circle里边它默认用的文件系统是pack,这个大家知道吗?Spark circle,它默认用的是文件格式,大家知道吗?
09:06
而且他对于这个帕的文件格式啊,做了优化了,对吧,现在知道了是吧?啊他对于做了优化了,那所以呢,咱们如果用Spark circle,你用pack这种格式比其他的格式是不是效率更高。对吧,那这有什么好说的,人家底层做了优化了。那没得聊对吧,他并不让前面那种说,哎,你去理解理解理解,那没得理解,那么人家做了优化了理解啥呀,对吧?啊这个意思啊,这个是agg with f啊。好,那接下来呢,第二部分叫top n的一个优化啊,第一块呢,要使用这个最优算法啊,最优算法,那最优算法呢,不是说诶那也来说,那我是不是有个参数就配置一下最优算法,对吧?不是不是,它是要你写的思考满足一定的条件,它会自动启用某些算法,对吧,如果你不满足这个条件,哎,不好意思用不了对吧,他必须要满足这个条件,他才能用这个算法,那条件是什么呢?第一个。
10:07
有主见信息。啊,就是有主见信息一般就勾段呗,作为主见的对吧,好第二个第二个呢看啊。叫排序字段是更新是单调的,且单调方向与排序方向相反,在说什么?听不懂。自己看一下,体会一下这句话叫什么。排序字段。更新是单调的。排序字段的更新是单调的。淘班嘛,淘宝N肯定要优化呀,对吧。切呃,不是肯定要优化,肯定要排序啊套N,你求套N肯定要排序嘛,对吧?好,他说排序字段更新是单调的,且单调方向与排序方向相反,什么意思。来看,比如说康乃馨。康的新这个东西是不是单调递增了?抗的心它是不是单调递增啊,有没有毛病。
11:04
抗的心是不是单调递增了,它中间可能会减一下吗?不可能吧,对吧,好。既然它单调递增,那么排序方向呢,就要向下排,那你要加一个什么DC。你要倒着排,你要从大到小排对吧?哎,那这个就是我们所说的你的排序字段的更新是单调的,诶更新确实单调,单调递增对吧?排序方向呢,与我们单调方向相反,排序呢,我们从大到小排。对吧,你这个呢,单调递增,从小到大单调递增,那我排序从大到小排,诶这个呢,就是满足他这个条件,就这意思。对吧,要求还挺高对吧,还挺奇怪的啊,是这个意思啊,这是最优算法的一个条件,这是第一个启用最优算法第二个。叫无排名优化,什么意思呢?就是比如说我们要求这个top n对吧,我们要求这个rank值,最后输出的时候,你不要输出这个rank。
12:00
你不要输出这个rank就干什么事呢,你看啊这个看看三不写number,这个number呢,不写,你不要写这个心。对吧,你这个会把number也写出去,那这个道理何在呢?对吧,你比如说啊,我给大家举个例子。现在呢,我第一名啊,是A。100。B。98。C。96。第94。对吧,好。那我想啊,假如说我开启了mini batch,我一下子来了好多数据,可以吧,那有没有可能。我在新的一批来了之后,D变第一名了,变成什么呢?102对吧?A变成第二名没变吗?其他的没变啊。B、98。第三名好,C96第四名了。OK吧,因为我开启了mini BA,我可能一个批次直接来了很多数据,对吧,他呢是出现了这种突变,就最后一名直接变为第一名了,对吧,其他的没变。
13:01
啊好,那你看如果说我不加这个排名,我没有这个rank值,那你看这几个数据是不是都不变。然后呢,只要输出的时候,把你先输出,然后挨个输出就好了,对吧,那如果说你加了排名呢。本来1234对吧,现在呢,变1234你看。之前是一,现在变成二,之前是二,现在变成三,之前是三,现在变成四,之前是四,现在变成一。是不是你数据变化就特别大。对吧,你要改的数据就会特别多啊,你要改的数据就会特别多,能明白这个意思吗?对吧,啊,你要动的数据就会特别多,哎,导致这个数据膨胀问题,对吧?所以呢,你可以不写这个rank,假如说你没必要,可以有可以没有,你就不写对吧,那如果说必须要,那就没办法,你必须要带着这个1234,那就没办法,没什么好说的,对吧,你不能把它干掉了,那不行,对吧。
14:01
好,第三个增加淘宝N的,看着大小这个就不聊了,增加内存大小,那肯定是优化呀,对吧,加机器了,加资源了。啊,这个就不聊啊,加的话在这。参数对吧,在这个con set啊,你就设置这个大小就好了,然后呢,还有一个叫part bed字段,要有时间类型。要有时间类型。啊。这个。是什么原因呢?因为如果你要求每天的排名,你不带上对的字段,对吧,因为你设置了这个状态的TTL,我们知道状态的TT呢,它不是说零点过期。啊,他不是零点过期,他有可能会跨天对吧,那如果说你有一个状态到第二天凌晨才过期,那完了。对吧,到一点才过期,那你这个一个小时是不是把昨天的数据都算进去了。对吧,那如果说我在part字段里边带了当天的日期呢。
15:03
我带了当天的日期呢。我还会把昨天,就算你状态里边有昨天的数据,由于我盘败字段里边加了这个日期,我还会把昨天的数据累加进来吧,大家想还会不会啊。能明白这个意思吗?就是第四个点啊,你要体会一下对吧,就是由于我们可能会设置TTL,那TTL呢,它是倒计时对吧,它有可能会跨天,那如果你怕BY里边不加这个天这个字段,不加时间字段,那你就是整个的把时间都算进去了。你如果说所有的数据都是零点过期,那还好。万一你要不是零点过期呢。你一点在过期呢。那我这一个小时是不是把昨天的数据都已都算进来了。能听懂吗?
16:01
想一想啊。嗯。没反应了,懵了啊好,那我们我们举个例子哈。比如说这边呢,4月27号。4月28号。我呢有个UID是111啊,有个UID111对吧,这边呢访问了一张数据啊,这边访问了一张数据。我现在呢,想根据这个。UID计算一下。每天这个人的访问记录,对吧,我也不求什么日活,就PV啊,就这个人他访问了多少次对吧?好,那我们正常的。呃,按照这个人分区吧,半他啊,每个人嘛,每个人半他啊,然后呢,扫一下这个值就好了。好,那如果你这样算的话,那我状态呢,设置过期时间,假如过期一天对吧?好,那这个数据呢,有可能是这个早上九点登录的。
17:06
他是到第二天九点,我一天嘛,到第二天九点才过期啊,那如果说你排半只有UID,只有UID,那这两条数据是不是会聚合到一起。因为我还没有过期对吧,这个是早上八点的。这个是九点才过期,这两条数据是不是聚合到一起了。对吗?这就不对了,我要按天算嘛,我要按天算啊,按天排名,求每日排名,那如果说我帕半里边不光有UID,我还有一个日期字段呢。我还加了这个日期出来呢,那么我算4月28号的时候,会不会把这个4月27号算进去啊,必然就不会啊,对吧,你状态没过期无所谓啊,我也不会算呀。对吧,因为我排列败里边有日期字段呀。是不是这这会儿能懂能懂了吗?讲的是这个事儿啊,就是说否则套完的结果会最后会由于这个状态的TTL会有所错乱,对吧,因为你数据会变多,你懂吧,因为有可能你TTL是跨天TTL到了第二天你才过期,那肯定不行啊,对吧,所以我们加上天讲到这个事。
18:12
对吧。还非得?举个数据的例子,大家才能明白是吗?要不然就不懂哈。啊,没关系啊,大家现在呢,只要我举了例子以后懂了就行了对吧?好,那看一下这是一个事例的circle,考这个不是说什么优化猪脑扩载又扩载了啊好,第一个拍半对吧,加上日期诶那不会错乱对吧?All by诶D叫pay。All the amount叫D对吧,接下来呢,看这个some total fe对吧,它是这样的,我直接声明了大于零。对吧,显示的告诉系统我们呢,一定是单调递增,然后接下来排序DC走最优排序算法。对吧,啊,这是一个示例,就是你写的时候呢,要这样写,最后输出呢,不输出之后number么呢,叫无排名优化,就这个搜个里边把几种优化的一个方式都放在里边了,对吧,这样的方式啊好,那接下来。
19:08
第三大点叫高效的去除。方案。啊,高效的去除方案,呃,那保留首行,如果说只要第一行。对吧,如果只要第一行,OK,怎么写呢?诶搞一个road number,按照处理时间对吧?按照处理时间取这个为一的啊,如果按最后一行呢,那我们倒序对吧?按照事件时间或者处理时间也行啊,按照这个倒序取第一条对吧?那这样的话最优的为什么最优呢?啊,为什么最优呢,对吧,因为他状态里边只需要保留一条数据就够了。对吧,比你取那个最大的要好,我取第一条对吧,我永远只取第一条啊,这是我们所说的它。高效的去重方案对吧?啊,如果取第一条直接按处理时间,但这个也可以按处理时间,这无所谓啊好,那下来叫高效的内置函数,说使用内置函数呢,替代自定义函数,这个呢,我我就不写对吧,这玩意儿干掉。
20:08
也行,为什么?我对大家非常放心,就是有函数,就是所有人都一样,系统有这个函数,我们会去自定义吗?会不会啊?你觉得?那不可能啊,对吧,那这有函数了,你要自定义,你不有毛病吗?对不对啊,所以说这个东西呢,对大家来说非常放心啊好like这个东西呢,就是用的时候就是这些语法啊,还是一样的语法,对吧?顺用这个正则,因为正则的话它会。造造轮子正则的话,它会比较的比较多啊,它会比较的比较多,所以有可能会卡对吧,会卡这个就不好了,对吧,所以这是我们高校的内置函数啊,就你用内置函数就好了啊,最后呢,指定市区。就是说在弗林斯格里边可以指定市区为亚洲上海,对吧,就是这个。因为不知道系统函数的存在,然后写了自定义函数,那就没办法了啊,那就只能说明你知识储备不够菜是吧?啊,但是你又能写出来自定义函数,又不能说你菜,那应该是怎么办呢?我也就不知道了,对吧?啊好,那第六章第六节啊,讲的是这个什么呢?设置参数的总结,这不是一个新的东西啊,就是把刚才我们遇到的参数放在这儿给大家放做了一个总结。
21:25
未来你也不用一个一个去翻了,你直接看这结束了,对吧?啊,所有的参数都给你列这儿了。OK吧,最后做了一个总结而已。好好,那就。
我来说两句