00:00
实时模块这一部分先给大家回忆一下,我们要做的主要是啊,是不是就是这个实时的交互性要很好,对吧?用户如果来了一个行为,我们这里的例子是来了一个新的评分,我就实时的要给他有一个列表,推出新的东西,根据他当前的兴趣,当前的这种行为做出一个判断,对不对啊,这是我们直观的一个想法,如果你要实时性非常好的话。那我们就能想到鱼与行掌不可兼得嘛,你如果要非常速的推的话,可能要求的精度就不能那么高了,对不对?所以大家发现我们这里其实是在离线的那一部分,基于盈余模型的算出来的特征矩阵,我们是不是基于特征矩阵可以算一个提前算好一个相似度啊,那大家就会想到我现在已经有了现成的相似度,那么你新来一个电影的话,我是不是直接就可以找出跟他相似的东西推出来啊,这是一个基本的想法,比较类似于这种想法,比较类似于item CF来想一想是不是?
01:08
Item CF就是基于用户的行为数据,找出物品、电影之间的相似度对不对,然后根据这个相似度,你喜欢什么,我就把相似的推给你。所以大家想到我们的基本思路其实是基于item CF的,尽管我们这里面没有没有写出来,没有说啊,但是大家应该知道基本思路是item CF,然后接下来大家会想到纯粹的item CF是不是在我们这个场景里面不太不太合适啊。纯粹的item CF的话,如果说我们来了一个评分很差对吧?啊,大家想到我尽管看了这个电影,这代表我对这个电影是比较感兴趣的,但是我我看了之后非常失望,原来是个烂片,一个差片,呃,给了一个一分差评,那大家想我应该把跟他相似的这个电影全推出来吗?就直接推出来吗?好像不是那么确定了,对不对啊,但是大家又会想到,你既然看这个电影,其实还是说明对他这类型的电影感兴趣的,对不对,那所以还是有一些相关性的,所以在这种情况下,我们到底应该怎么去做呢?
02:19
这个时候我们可以的做的一个想法就是我们应该把相似度、相关性和评分结合起来考虑做一个加权,对吧?哎,所以在这个算法里边,我们的做法是,呃,就是自己又在item CF的基础上,自己又建立了一个模型,把相似度和之前的K4评分做了一个叠加,做了一个加权,具体来说大家看啊,我们的计算步骤是什么?哎,我们首先先拿到最近的K个评分对不对,拿到所有的这K个评分,然后我们是不是应该找到,呃,另外我们应该拿到当前跟当前评分的电影相似的电影作为备选啊,啊,我们有一个备选的电影列表,接下来我们做的就是考察每一个备选电影,给他一个推荐评分,对不对,按照我们模型给一个推荐评分,怎么给这个推荐评分呢,诶我们。
03:19
把这个备选电影跟最近评分过的电影挨个做一个比对,他们是不是从相似度矩阵里边又可以取出他们的那个相似度啊,啊,又可以拿到他们的相似度,他俩的相似度再乘以本身评分过电影的这个评分,这是不是就相当于做了一个加权啊,然后求和,这求和是不是对所有评分过的电影算完相似度全部求和啊,最后再除以平分过的个数,这是不是就是做了一个加权平均数啊,这就是我们最后推荐分数的一个基准项。后边还有一个偏移项,那偏移项有两个,一个是呃,增加的鼓励,另外一个是减少的是一个惩罚,对吧,那到底是什么就奖励,什么叫惩罚呢?我们这里边有一个count,有一个re count,它代表的是。
04:16
之前评分高分的数量和低分的数量对不对?比方说我们以呃,我们的这个例子是一到五分的评分,那就三分为基准对不对?大于等于三的是高分,小于等于三小于三的是低分,那在这里边我们会想到,呃,在做这个计算的时候,是不是不应该直接就。你有几高分我就直接给几的这个叠加啊,大家会想到有五个高分,我如果给了五分的话,那有十个高分你就直接给十分,有100个高分的话,你这个就这个分数就就很大很大了,对不对,那前前面我们的基准项就几乎都都被他盖过去了,这显然是不合理的,所以大家会想到我希望让它这个增长的对不要那么明显对不对,不要像线性的那么明显,那什么样的函数增长不那么明显的,哎,Log这个是不是就非诚合适啊,所以我们再加一个这个对数函数,当然了,最终函数避免它里边这个为零,那个就取到负无穷了,对吧?所以我们这里边跟它取一个跟一的最大值,然后做一个计算,那同样这里是做增加,这里就做减少减对吧,这就是我们整个的计算公式,好,那呃,大家把这一个大概的梳理一下,那接下来我们就要新建一个模块,然后把这部分代码。
05:37
去做一个实现了,好,我们接下来还是在recommend下边你一个module这一部分啊,我名字就跟这个文档上叫的一样了啊,大家大家可以自己给自己想要的名字对不对,我们叫呃,Streaming recommend啊,或者刚才我们那个叫offline这里,大家可以说online对吧?啊,这个是都可以的啊,把这个模块先创建出来,那首先第一步我们又要来,又要来考察它的dependency了,有哪些依赖呢?呃,对应的我们就对比这个奥夫line这里。
06:21
这里的依赖我们看一眼,它依赖了,呃,J plus,这是矩阵计算相关的东西,大家还记得我们当时是在哪里用到了它吗?推荐相似的那对算它们相似度矩阵的时候,是不是把两个当成向量,当成那个double matricx当成一个矩阵来做计算啊,我们直接调了它的那个点dot点击方法对吧?还有一个nor norm2直接算它的模长对不对?大家想想我们在这个就是实时推荐这个模块里边还需要算向量之间的模长,向量的向量的那个点击向量的模长吗?好像不需要了,对吧?因为我们现成的相似度是不是都已经算完了呀?哎,所以那这一部分看起来其实是不需要了啊呃,然后大家再想一下SPA相关的依赖我们引入什么呢?
07:14
诶,Spark是不是需要spaq要吗?也需要对吧?呃,然后这个需要吗?哦,大家想到m Mr lab,当时我们用的时候主要是ars对吧?Ars点,那么在这里面我们还要调ars算法吗?那现在就没必要了,我们现在是实时计算,那还有一个没有引入的东西,我们要引入什么模块啊,对,SPA streaming所以现在又涉及到SPA streaming,我们想到这个MLLA可以去掉,但是streaming要加上,呃,那另外大家想到下边这些scalela library要吗?啊,这个要mongo相关的东西要吗?要啊,这些也要对不对,因为肯定我们涉及到存和和取对不对,呃,基本的数据要读出来,然后最后我们肯定还有一个推荐列表还得写进去,所以mango肯定还是需要的,那另外还有哪些组件需要呢?
08:17
啊,大家就想到了,我们当时说我们一开始创建这个,呃,这个input stream的时候,创建这个流的时候,我们是不是想从卡夫卡那里来获取数据流啊,所以我们是基于卡夫卡来创建的,那需要跟卡夫卡相关的一些依赖,对不对,另外还需要什么东西呢?哦,大家也想到了,我们对实时性有要求的话,那有一部分数据,比方说在在我们这里之前的K4评分,我们是不是在mango里面没有存过啊,那到哪里去找?呃,对,我们的业务系统会把他每一之前的那个评分的信息直接存一份,存到就是red里面去,那另外这些就是在呃那个日志里边去记录了,对不对?呃,有这个持久化的是在日志里边,然后最近的评分是都会放在red里面的,大家想到我们是不是应该引入redis相关的依赖啊啊,所以这就是这个实时这一部分大家应该能够想到的依赖,我们过一下啊,SPA。
09:22
Spaq啊啊,当然大家习惯是这个读circle啊,大家也不要觉得奇怪,呃,这既然说这个的话都跟大家说一句,就是呃这个国际上标准的这个发音大家知道是什么吗?标准发音应该是SQL,我还专门查过啊,真的标标准发音是SQL,呃,但当然这个就是说其实这个习惯性的发音,大家可能就发现其实都是一个约定俗成对不对?呃,你像我是习惯读CQ了,所以呃大家可能一下子听就就听着还有点奇怪,甚至还不知道我说什么对不对,呃,如果大家就是我是一下子改不过来,所以说大家知道我说的是什么就可以,那这个其实并不是特别重要,那他的这个来源是什么呢?就是国外其实更多的是读CQ的,老外往往是读CQ,为什么?因为他一开始的这个就是大家知道这是结构化查询语言对不对,Structure的query language,他一开始这个叫什。
10:22
那一开始叫structure的English query language,所以它的简写是SE,然后Qu,呃呃,应该是query啊uell对吧,所以那个合成的那个词呢,就是有点像续集的那个那个词一样,就就是续集的那个词,那个词发音是CQ,所以就是国外一般它是按照那个英文词的那个发音来发的,后来变成这个SQL这个简写之后,呃,那就是如果有些人沿用以前的习惯,他读CQ,那我们国内的话,很多大家发现国内的很多工程师,这个很多程序员是读circleq的,对吧,所以大家习惯读circleq也是没毛病,就是大家只要知道是是一一回事就就可以了。那提到这个就另外还说就是像我们之前讲讲这个Python,大家用Python实现了很多代码,对吧,大家知道Python老外一般是怎么发音吗?不,不会啊,不会啊。Python本身是一个代。
11:22
呃,本本身是一个单词啊,不是代码单词,大家知道Python什么意思吗?对,大蟒蛇的意思对吧?它的那个发音叫Python Python,对所以对,但大家大家听起来就很很诡异对不对,但是那个大蟒蛇那个发音它确实就是Python,所以老外提到这个语言的时候,一般都是说Python,那那大家如果要是听到说Python也不要觉得就很诡异,对吧,因为他他发音可能就是这样的,但是我们国内的话,大家看我也是习惯一开始我读的就是Python,所以我也跟大家说的是Python,大家就比较好理解对不对,像我这个习惯,如果我一开始习惯读的是CQ,大家就就觉得,诶这这是什么玩意儿,呃,这这个没关系啊,呃就是我们也不需要说,非得去比方说别人说,呃,别别人,别别人读Python或者说p Python我们去纠正,哎,你这个读的不对,对吧,我们也没必要这样,它只是一个,呃,对于我们专业术语而言而讲,就是大家习惯能交流就可以了,也没必要用这个去去。
12:22
好像是指责别人对不对,那个就有点装了对吧?啊,就是大家知道一下就好啊呃,好,那接下来大家看除了这个Spark cross Spark CQ之外,还有Spark streaming对不对啊,这这个Spark streaming这个是大家需要引入的啊,我们这里边实时计算这个一定要引入的模块,还有scale library这个也要有,对不对?呃,还有后边我们用到的mongo相关的东西继续引入对吧?接下来还多了red跟卡夫卡对吧?那么卡夫卡这里大家看到有一个是卡夫卡这个clients客户端的这个程序这个依赖,另外是不是还有一个是Spark stream卡卡啊,呃,他们互相之间要做连接的,这个依赖要引入,好,大家知道的话,我就把这个直接copy过来了。
13:14
诶,这不是这个吧,啊,这是offline啊,看着就依赖很多,好,直接copy过来,大家已经清楚我们要用哪些东西了,那接下来呃,该做什么就开始写代码了,对不对?呃,我们要做的事情跟之前还是很类似啊,大家想到这个pro是不是copy过来,诶不是在这儿啊,下边。我们把这个复制过来,呃,然后我们把这个还是做一个改名吧,在下边可以去新建一个sky class对吧,那大家会想到这里边我们新建的是什么呢?一个一个实时的,呃,这样的一个。
14:09
一个一个类,它应该是一个object还是一个class,还是一个treat,首先肯定不是treat对吧?啊,肯定不是这个特征特征类,那么呃,Class和object大家会想到我们主要的区别是在考虑别的地方是否要创建它对应的对象去调用它里面的方法,对不对?那么大家想这里边我是这个程序直接跑起来就完事呢,还是说别的地方还要调调用它,好像别的地方也不会调用它的方法了,对不对?所以大家会想到这里是不是还是一个object呀,尽管跟前边诶离线那边是离线跑完就完事了,我们这里边的实施程序的话,应该是提起来之后是会一直等待那个啊流流数据来对不对啊,它是一个这样的一个状态啊,它同样还是一个单一对象,好,那么我们这里还是按照习惯去定义一个com.at硅谷,呃,这里边我们就按照之前的命名格式啊。
15:09
这个包名叫做streaming streaming recommend。好,定义好了之后,首先我们哎继续来看的啊,大家会想到一开始我们还是考察要定义哪些样例类对不对?呃,首先我们还是看看哪些能直接抄过来的啊,大家想我们在这里边有哪些这个基本的这个表需要对应的这个样例类需要抄过来呢?呃,Movie rating这个需要吗?因为当时我们做离线推荐的时候,他就基于行为数据对吧,就基于之前的这一个评分数据,所以movie rating肯定是要的,我们现在实时推荐基于的数据是什么呢?啊,其实我们的数据基础也也是评分数据,但是我们是不是基于的是评分数据里边已经提取出来的特征向量算出的相似度啊啊,所以我们已经有相似度的话,那是不是这个就没必要了?哎,所以那那我们其实需要的是。
16:19
什么相似度,是不是这个东西啊,对,所以大家想到我们想要的,其实这个movie ras,另外大家会想到,呃,我们可能还需要什么东西呢。Monggo config是不是还需要?哎,这个对应的东西还需要对吧?然后大家想到,诶,下面这个recommendation是不是也要啊,你既然我们这里相似度用到了这个基本的样例类,那当然也是需要的。另外我们想到最后要写入到mongo里边的数据是不是也应该是一个用户推荐列表啊,那我们想要的一个形式是不是也类似一个用户的UID后边是不是跟着一个列表,这个列表里边是不是也是一个recommendation,一个movie ID后边跟着一个推荐评分啊,哎,所以大家想是不是可以直接就复用这样的一个杨利类,哎,所以我们这里甚至连这个名字都可以不改,我们就叫userrex,最后存到mango里边,我们换一个名字是不是就可以了,不要再叫userrex,就可以了,对吧,所以我们直接把下面这几个抄过来就完事。
17:28
好,这是我们想要用到的一些样例类,呃,就是monggo conigig,还有recommendation,这是基础基准的推荐对象,最后还有user con和movie con,但是大家要注意,Movie con在这里我们就不是写入的数据库了,是我们到时候要从这里就是读出来的数据,我们是不是要用转换成这样的,呃,数据格式啊,然后user rax,这是我们最后还要写入的数据,对吧?我们写的数据是这样的一个数据格式,我们可以看一眼,就是在代码里边给大家的实现,大家会看,还多了一个啊,这就不是样例类了,多了一个object。
18:11
一个单立对象多了一个什么呢?大家看我们建立了一个连接助手对象,这是要干什么事情呢?呃,是因为大家想到我们,我们接下来是不是可能会用到呃,Red对不对?用到red的连接对吧?然后还有这个,呃,就是mongo,如果说我们用到一些复杂的这个操作的话,大家想到之前我们mongo可以不创建它连接,不创建这个,呃,Mongo client是为什么呢?我们是不是可以直接用Spark session的read方法,或者用呃,Data frame writer直接去写数对不对?只要设定好那个option,设定好format,就可以直接往里面写或者是从里面读了,但是如果我们涉及到复杂的查询呢?大家想到我们要要犯的一个按照什么条件去犯的呢?你用什么方式去去查呢?这个好像就只能用客户端了,对吧?啊,只能去创建一个连接,去按照这种方式去去做,所以这里边我们要把这个连接创建出来,大家就就会想到有了这个连接之后,我们在这个呃实时计算的过程当中互相传递,是不是需要把它做序列化啊啊,那所以在这个过程当中,我们是不是应该有这样的一个连接助手,它是不是应该呃继承这个呃,S s lizable这样的一个对象,对吧?那大家当然知道,在skyla里边,这相当于是一个。
19:41
呃,我们先把它实现一下啊,然后大家来看,大家之前用过这个吧,用过对吧,之前大家都是呃类似的一些实现嘛,Connect helper extendable对吧。
20:01
那里边我们这里边大家看我们定有一个lazy来修饰,这是什么意思啊,对,这是一个懒变懒变量懒加载的模式,对不对,那相当于含义是说它的初始化是不会延迟啊,我们这里相当于只是把它声明出来,定义出来,它真正的初始化是不是到真正用到的时候才去真正初始化啊,所以这样的话我们就不会去重复计算啊,那这里边我们定义一个呃,Red的连接,我们一般就是用这个jeice,对不对,Jeice。呃,那当然了,我这里边就是logo host直接起一个就可以,同样我们跟monggo的连接定义一个monggo client,那这里边啊,这这里monggo client,我们直接调这个monggo client,开SPA里边的这个,因为我们已经引入开SPA了,对吧?我们可以直接用它里边的这个类去创建客户端的时候,我们需要传入它的uri monggo client uri对吧?呃,当然这里边我们可能要传入,大家会想到这里边肯定要把这个uri传进去,对不对,我们没有统一定义,这里直接写死了,大家可以对在外面如果自己写一个这个,呃,公有的这个类的话,可以把这些东西都提出去,对不对?我们这里其实这这一部分没有做的特别完善,好,我们把这部分引入,大家看到已经有了这样。
21:40
一个东西,那several大家点进去的话,可以看到它其实是一个treat,是一个特征,对不对,所以大大家之前是是讲过这些的,对吧,我们去一个呃,Skyla的对象,如果要是去继承一个特征的话,这相当于是不是Java里边实现了一个接口啊,对吧?所以这部分大家都很熟悉,就是给大家再简单的回顾一下。
22:07
好,那么我们定义了这样,这里还是给一个注释啊,大家知道是干什么。连接助手对象好,呃,那个序列化对吧,主要是要要做这个序列化操作的好,然后接下来我们就真正进入到呃,这个主程序里边,我们的这个对象里边,首先第一步进入对象里面来,按照我们的套路,还是先定义一些常量,还有我们的表名对不对,这里面我们我们需要用到哪些表明呢?大家可以首先想到哦,那那我们首先是不是要拿那个相似度列表啊,是不是这个movie re肯定需要啊,这个是跑不了的,然后还需要什么呢?是不是我最后推荐要写入到一个表里边啊,之前我们写入的是叫user rax,现在我们数据格式还是还是用了这个样一类来定义,但是我们名字肯定不能叫U,对不对,因为我们要做这个分区混合的啊,就是之前的是一个离线推荐,我们现在的实时推荐是不是都得用不同的表存存储啊,然后我们前台才能去,呃,有不同的显示,所以这里边我们肯定还要定义另外的一个表名,除了这两个之外,大家想到好像是想不到什么别的要用到的东西了,对吧,我们看一眼这个,呃,文档里边定义了哪些啊,大家看这里还多定义了一个rating rating的话,我我们其实现在一时半会想不到,但是大家可能会想在什么地方有能要去查那个表。
23:53
我们是不是有可能要去查诶之前的一些评分记录的时候,那有可能还要从RA里面去找,对不对,那比方说啊,大家可能想到你reading不是本身已经RA里面有了吗?RA里边是最近的评分数据,它是作为一个缓存存在的,那有可能历史的评分,所有的评分,呃,那不是在里边直接全能拿出来的,对不对?那大家想我们在什么地方有可能会用到历史评分呢?
24:27
大家会想到我们给用户去推荐的时候,你看了一部电影,然后我给你推像类似的出来,对吧,评分比较高的出来,是不是要过滤掉他已经看过,已经评分过的电影啊,正常来讲,电影或者说电商的这个应用场景,不应该把他已经买过的东西重新推,对吧?大部分应用场景里面啊,就如果说是像这种日常消耗品的话,当然是可以推以前买过的同样的东西的,对不对?那电影这个场景的话,一般情况你就不要推别人看过的东西了,对吧?哎,所以在这种场景下,我们是不是应该从它的历史评分里边把已经评分过的过滤掉啊,做一个filter,对吧?啊,所以基于这样的考虑,我们是不是还是应该从这个表里面查一些数据出来啊,所以这是我们这这里的一个基本的想法,另外呢,就还想到我们还定义了两个常量啊,大家看一看这个名字其实已经知道了。
25:28
User number,那这是不是这个用户评分的个数啊,大家可以想到这个是什么意思呢?这是不是就是我们定义的,哎,你到底要选取多少个评分对不对,哎,这就是这样的一个定义的一个常量,就是我们所说的要选选择K4评分,那这个K怎么去定义,就这里定义了对吧,另外还有一个需要定义的是。我们是不是要从相似度矩阵里边选取出当前的备选列表啊,那备选项你到底选几个呢?这里边我们是不是也可以去定义一个相似的电影到底有多少个,是不是这里边最大值给它列出来啊,我们按照这个数量去取啊,所以这是我们预先定义好的一些常量,好,我这里就手敲的话,这个相相对应来讲还是有点麻烦的啊,这个字母比较多,但是我们定义成这样大家会比较好理解,一般的常量和变量命名大家都要符合这个规则,敲起来复杂并不是事儿啊。
26:35
好,接下来我们当然就可以实现这个入口那方法了,对吧?呃,接下来我们看一下整体的这个程程序框架应该什么样呢?按照我们的套路,一开始还是先定义一个conig对吧,Con是一个map。呃,这里边我们需要的预先定义好的可能,这个包括哪些呢?还是回过头来看一下offline里边我们定义过哪些?Spark这里需要吗?
27:07
显然需要,对吧,我们一开始你你Spark streaming是不是也得需要Spark config啊,对吧?啊,这都是一样的啊,所以我们一开始还是要有Spark course,然后mango UI和mango DB是不是也是都需要啊,同样的一些操作,除了这几项之外,我们先把它copy过来,还要什么东西呢?除了这两项之外,还要什么东西大家可以想到哦,那我这里边是不是还涉及到red跟卡夫卡啊,他们对应的一些配置项是不是也应该引入进来?呃,Red的话,这里边相对比较简单,大家看我都是用的默认的东西对吧?Local host啊,当然我默认已经吸起来的话,也是默认端口对吧?应该是66379还是多少啊啊,所以这里边我都不需要去特定指特意的指定了,而且red大家可以理解,我们把它当成这个缓存数据库的话,它是不是就相当于一个大内存啊,我要取的东西直接在里边根据K去取出来是不是就可以了,是不是我不需要预先定义特殊的东西啊啊在这里边我们可能里边的一些K我们是有单独的设计的,那其实用到的时候我们单独去用就可以了,不需要提前定义出来,好,那接下来卡夫卡我们是不是需要有一些预先的定义,比如说我们常用到的有什么是。
28:31
不是卡夫卡的topic应该定义出来啊,对吧,我们这里边作为一个消费者的话,那我们订阅一个topic,到底是是去订阅哪个topic呢?这里边我们叫的名字还是叫recommend吧,统一的都是这样的名字啊,推荐好有了基本的配置之后,接下来啊,大家会想到按照之前的这个是不是还是Spark这个SPA session还应该创建出来啊,那接下来这个影视的这个包是不是也得也得引入啊,那如果对mango有操作的话,是不是下边mango这也应该定义出来,所以这几项我们一样先copy过来。
29:14
Copy过来之后,呃,大家看我先把它引入啊,但是这个monggo config是不是我这里不应该用offline里边的monggo config啊,而且大家看这个uri,其实我们用里面的就可以了,对不对,这两项都删掉。大家想一下,我们这里边已经创建创建好了SPA session,但是还没完,大家想一下,我们真正如果要用这个SPA streaming做流式处理的话,是不是最后要拿到的那个应该是得要拿到streaming context的啊对,那大家想这个Spark里边封装了这个stream context的吗?呃,大大家大家知道现在的这个版本,2.2.0版本里边应该还是没有的,对吧?2.0版本里边跟之前的相比的话,是把我们之前的这个呃,Spark context,还有我们经常会用到的q context context都封装到一起了,对不对,所以我们调用的时候就有了一个统一的入口,但是啊,现在唯独还没有封装进来的,是不是stream contact的还没有封装进来啊,在以后如果要发布新的版本的话,有可能我们就可以统一调用了,现在还不行,那这个呃stream contact我们到哪里去找,这个大家都是已经知道了,对吧,我们是不是还要呃这个创创建,呃,不不是创建了啊,就是呃拿到。
30:52
Streaming context啊,那首先大家会想到我们应该要从SC里面去拿对不对,应该要从Spark contact里面去拿,那在Spark session里边是不是已经封装好了SC啊,所以我们先定义一个吧,SC等于SPA,是不是这里边就有SCR?那然后我们就可以定义这个stream contact,一般我们SSC对不对?呃,那这里当然就是Spark session点。
31:31
哎,不应该是SPA session对吧,前面我们已经创建出SPA session了,肯定不需要再用SPA session了,那直接去new一个streaming contact就可以了,对不对?好streaming这里边没有context,好SPA context里边我们需要传入什么内容呢?是不是应该把SC传进来啊啊另外我们还可以指定一个第二个参数,第二个参数一般是什么一个时间对吧,比方说我们这里边second。
32:04
To,给个两秒对不对啊,这个要引入啊,那大家想这个两秒指的是什么?指的是什么呀?回忆一下这个是不是就是那个叫做什么batch duration啊,是不是这个概念啊,就是相当于是我们每一批次的那个持续时间对不对,或者叫批处理时间,对吧?呃,因为大家知道这里边这个就是有些人会把这个SPA streaming叫做,就是认为它还不是绝对纯粹意义上的流失处理,对不对,因为它相当于是一个时间窗口,一个时间窗口的一个批处理,对吧?啊,它不是真正意义上的流啊,所以这个概念大家再稍微的回回顾一下,我们这里边定义一般这个是不是不要给太短啊,因为你这个时间窗口给的太小的话,是不是有可能在这个呃时间内,我们的那个处理还没有处理完的话,是不是接下来的这个这个任务就会,哎,就会就会阻塞了,对吧,一步一步就会就会往后去去去延迟了,所以这里一般给的这个是。
33:11
500毫秒以上对不对啊,这个大家还是之前应该都讲过,回顾一下就可以。
我来说两句