00:00
Application起起来之后,现在想到是去起这个flu,我这里边我这里flu的版本是1.9啊,所以大家会看到config文件下边log卡夫卡properties的这样一个文件,那大家看一眼这个配置文件里面到底有什么东西,这里边我们就本身起的这个flu代理名字就叫agent对不对?然后大家看定义了一个EXE,那接下来大家看那个EXE的配置,然后thinks这里给的是叫卡普卡think对吧?所以接下来大家看这个exe和卡卡think这两部分,大家看一下整个的这整体的定义啊,大家想我们做这个日志采集,我们的日志写在哪里呢?那大家看我们这里其实用的这条命令,大家看啊,Tail命令对不对?这条命令是不是就可以找到日志文件里边新增加进来的那些内容啊?
01:00
呃,然后找到大家看这个目录啊,我是放在哪里了,这是我当前的这个项目目录,对不对?然后下边又建了一个business server,那这是不是应该在我们的业务系统代码里啊,我们把这个路径写进来,然后下面大家可以看定义了一个对一个本身的这个前缀,那么大家看到就是我在application那里处理的时候定义好的,然后大家继续看我们这个卡普卡thinkk里边,呃,我们用的是这个卡普卡,定义出这个topic,我们跟卡普卡那边连接起来,输出之后lo,这个topic的一个生产者对不对,我们要生产数据,然后给到呃,这个卡普卡think去做消费,然后我们这里面要定一部的是不是就是提起来的卡普卡9092,呃,这其实就是一些基本的定义,然后下面这些就都没什么特别的了,大家大概的看一下就可以,所以这是我们要定义的一个flu的配置,那大家可能知道。
02:00
啊,大家如果拿到这个文件需要这个应该在文档里面都有是吧?文档里边啊配置启动form,那么这里边大家要改的是什么呢?是不是重点要改的就是这个路径啊,对吧?你的那个日志文件到底在哪里,这个是你需要去改的,所以这是flu的配置这一部分,然后如果把这一部分配置都已经配置好的话,那我们是不是直接把它提起来就可以了啊,Flu门G对吧?Agent呃,我们这里的话定义的这个name本身就叫agent,所以杠n agent,那整个我们是不是得定义出来它的那个配置文件是在config下面的lock卡夫卡对不对,这个我就直接抄过来,直接提起来就可以了啊。看一眼,退出。好,那大家会想到我把这个flu已经提起来了,那flu的日志,它的数据再往前追溯,我们现在相当于是从后往前一级一级追溯,对不对?呃,我们的Spark streaming要做这个流失计算的实时计算的,这个数据是从卡夫卡来的,卡夫卡那里的数据呢,又经过了我们刚才上节课卡夫卡stream的一道处理,中间处理,那么他是把从flu那边来的log那个topic里面的数据转到发送,发送到了这个,呃,Recommend那个topic里面,对不对?所以接下来我们追溯到现在,我们又把flu配置好提起来,呃,这边应该提起来了,对吧,卡started。
03:34
诶,这里好像。Tillit with1我们好像没有找到这个东西,是不是我看一眼啊?哦,因为我现在是不是还没有这个文件啊,对吧?所以大家会想到我是不是应该先把那个文件放到对应的目录里边,诶,再再去起这个可能会更好一点,对不对?那大家会想我们刚才是不是把这个log文件是跟业务系统放在一起的啊,所以接下来我们的数据流向前追溯就追溯到了业务系统,那同样这个跟大家说过,我们有这么一套业务系统代码,对吧?我把它解压出来,这个东西已经放在这里了,现在是不是我应该把它就放到我们对应的这个目录下面去啊,我这里面的目录大家想我应该放在哪一集下面。
04:28
是下面吗?是不是就应该放在movie recommend system这个总的副目录下面啊,副项目里边对不对,所以我把这个copy一下,这个可能还会有点大啊。大家知道这个为什么大吗?因为它里边有,它里面有前端的代码,然后前端如果是真实数据的话,它有大量的图片。呃,所以这个相对这个复制的过程还稍微复杂一点啊,有点麻烦大家看,我已经拷贝完之后,在这里就多了一个叫做business server的一个文件目录,但是它跟下边recommend长得不一样,大家知道为什么吗?诶,这个应现在才考完啊,因为什么啊,是不是我们只是把它添加进来了,但是还没有把它加入到我们的这个maven项目管理里边去啊,大家会想到我肯定要看他的这个po文件了,对不对?
05:32
这里,诶,这里的po文件大家一看这个parent是有的呀,而且我这里叫的就是movie recommend system,这个名字应该一样吧。对没没错,都一样,那那这个到底问问题在哪里呢。那大家会想到,因为我们不是在这里去手动添加的,是不是这个代码,是因为我给大家打打包好的代码,它就这么写的,当然这里边配好了,但是是不是在外边它的副项目并不认识他呀,如果副项目认识他,应该是不是在modules下边同样会出现一个叫做business的另外的一个子模块。
06:11
所以我们就手动把它添加进来,诶这里是不是创建一个这样的module。那大家会想到是不是应该把business server添加进来啊,好,这样大家要做这样一个更改啊,然后现在再看,大家看,等他把这一部分要。要搞定对吧,看起来有点慢啊。呃,我现在可能电脑起的东西有点多,所以说这个,诶大家看现在处理完成之后,是不是这就变成我们正常的一个项目了,作为一个子项目嵌入到里边了,对不对?呃,然后里边我们需要的一些依赖呢,在这里边都已经写好了,那所以如果大家就是大家给的这个项目名称不一样的话,那可能还得注意,就是在在这个business server的配置里边是不是也得改啊,因为我们是手动把它添加进去的,这个大家稍微注意一下就好,好那么这部分已经配置好了,接下来我们会大概的看一下是不是在这个目录下边啊,啊,一开始这个是空的啊,没,没有日志写进去对不对,诶,这是我们的这个日志收集写入,写入到这个文件里面,那现在我们的目录这里边已经有了,是不是可以把这个flu再去启动一下了。
07:35
同样还是这条命令,把它记起来。呃,然后大家会想到我这里边如果做了操作的话,对应应该就会写入到写入到这里边来,对吧?呃,那么大家会想到我为什么会把这里边对应的操作,我这里边日志系统会写到这里边来呢?肯定是不是lo for g有一个配置啊,所以大家再看resources里边是不是有一个properties。
08:01
那么在这里是不是定义了,大家看它的输出有一个到file啊,那么这个file它定义的这个路径是不是在这里写好了,当然了,我这里边大家看我这里边是就直接在这个Windows环境下去写了,所以我这里边的路径是Windows的路径对不对?呃,那么大家如果正常去发布的话,是不是要把这个做一个打包,打包之后是放到那个,呃,Linux环境里边去运行我们这个挖包的对不对,那么这里边这个目录就应该是用Linux目录了,对吧?啊,这个大家都知道,那所以这里大家注意一下,这个目录要一样,我们这里配置好,大家要把这个改成自己的。这个日志的文件目录配置好之后,我们写日志的时候就会写到这里来,然后那里配置好了,是不是会跟踪这个这个呃,日志的文件啊,如果有新的添加进来之后,它就会把它,呃,就是相对应的产生数据,然后给到我们的卡夫卡think那里,对吧?卡夫卡那里就就对应的那个topic log就生成了一条数据,卡普卡那里就会获得,然后去消费这条数据,做处理之后就会再生成一条recommend topic下面的数据,对不对,然后就会给到Spark streaming去做消费啊这就整个流程串简的,当然这里可以给给大家再大概的看一看这个我们Java代码啊,这是一个呃,Spring的一个代码对不对?这里我们主要的这个接口在哪里呢?在rest API这里,我们的写入评分数据就在这个movie rest API里边就有,那大家具体来看是是哪。
09:42
个,哎,就这个啊叫re rent to movie,这是不是对一个movie去做评分啊,然后大家看写日志的过程,是不是在这里做了一个啊,大家看这相当于是在服务器端买点对不对,后台买点对吧?在我们这里做处理的时候,诶,去把这个日志做一个处理,当然大家可能知道实际项目应用当中有些买点是在前端做的买点对不对,就可以收集用户的一些啊点击啊,呃,浏览啊,拖拽啊这些行为对吧?啊这些我们的就是行为数据就会更丰富一些,这里的话我们就是只是给大家举个例子,评分这个是因为要传到后台去做处理的,所以我们在在这里买一个点,那大家看这里是不是把这个前缀加冒号写到了这个前面啊,后面的格式是不是就是user u ID。
10:37
竖线,然后大家看这个ID,这是不是就应该是传进来这个movie ID啊,啊对,大家可以看到这是什么意思啊,后面再竖线,这是不是它的那个评分的score,最后是不是这个时间戳啊,System current time,呃,那那这里millions,这是毫秒,然后再除以1000,是不是就是我们要的那个时间戳啊,它这个是最后带三个零的啊好,所以这是。
11:05
我们就是看到在业务系统里面的买点的地方,所以我们的标准的做法其实就是在页面上点一下评分,它是不是就会发送一个请求,呃,给到这个传到这个接口里来啊,后台就会在这调用到这个方法,这个方法里边是不是就做了一个买点啊,就会写入这一条日志,我们对应的agent.lo里面是不是就有了一条日志,然后我们就可以收集到了,对吧,对应的就可以卡普卡拿到,然后SPA streaming就拿到了,这就是我们完整的这个流程。好,这里给大家简单的做一个,就是做做一个演示啊,这个其实演示起来在这个测试环境里边很简单啊,我们的开发环境里边做这个演示很简单,我们找到business server现在是不是加进来了,他现在诶大家看这个好像它的dependency啊,Dependency和plug in要要引入进来,对吧,它的这个plug in里边是不是就有一个TOM7啊,它是不是内嵌了一个Tom。
12:10
所以这相当于是我们的一个web服务器web server,对不对?所以我直接调用它的这个tomcat run方法,就可以直接在我的开发环境里边去起一个web后端,就相当于把我们这里边的这个代码提起来了,对吧?所以大家看我现在启动的东西就就有很多东西啊,诶这里怎么强行关闭了一个链接。哦,应该是之前我们做了这个,呃,大家这个application和这个,呃,就是我们flu那边配置的时候做了一些关闭操作,对不对,这里就就出现了这种状况,应该是没问题的啊,大家如果不放心的话,等一下我们重启一下好了,这个都没什么关系,我们现在是起了这个stream recommender的程序,而且起了我们在做这个卡夫卡STEM里面做过滤的这个程序,另外还起了一个业务系统,对不对啊,大家看现在是他在起这个阿帕奇TOCA7对吧,这个还没起起来,等下起起来之后大家会想到。
13:13
诶,大家看running wall它端口是什么呢?Local host8088对吧?呃,我们到时候是不是访问local host8088端口就可以访问我们整个这个业务系统啊,大家等一下也看一下这个到底我们这个项目长什么样。好,这些应该都没问题,诶好,现在大家看记下来了对不对,Starting啊啊,现在是我们见证奇迹的时候了。8088,因为没有做这个,呃,初始页面的这个映射,所以我们要访问这个index HTML,呃,大家看到一上来是不是一个用户,大家想这是一个冷启动对不对,一上来没有用户,所以说我们先去注册用户对吧?呃,我这里边因为之前注册过,所以他记记录了我的一些行为啊。
14:02
好,那么我去注册一个用户。大家看现在我在用这个用户名去登录,那进来之后是不是有一个选择感兴趣电影类别的这样一个标签页啊,呃,那这就是冷启动了,一开始我不知道该给你推什么,我是不是可以先去点选一个类别对吧?然后就根据这个来来来做一个推荐啊,所以我去保存一下啊,这个一些小bug大家不要太在意,然后还有一些这些样式显示不太好,大家会看到,呃,当然已经有数据了,所以它本身就有实时推荐,对吧?大家会看到是这样,因为我们默认的状态下,在这里我们还是清一下数据吧。之前我们是不是那个实时推荐STEM Rex里边是不是已经有数了呀,啊,这个不太好,我们还是从最最初的这个状态来看啊,我们不应该有这个strings把它drop掉。
15:01
然后另外大家看到我创建用户之后,是不是就多了一个user这个表啊,对吧,我把user也drop掉,重新注册一下啊,重新来一遍,好撞掉之后现在应该没了吧?对啊,这些都是我们基本已经有的啊,这个统计的推荐内容的推荐末尾是原始数据,呃,这个是相似度对不对?离呃,那个盈余模型计算出来的相似度,这个是离离线的推荐,对吧?这几个数据是已经有了,好接下来我们还是按照这个那重新来一遍了啊。Index,好,现在呢,肯定又是得重新注册了,好,我还是按照这个随这个大家随便给这只是一个username和password对不对,好登录还是啊,选择一个动作片随便啊对诶大家可以看到在这个里边是不是就是。我们已经给出了相对应的离线推荐,那一开始如果我们没有实时列表的话,大家看是不是我们有一个策略,就是直接把离线当成实时推出来了呀,啊,我选了动作片,所以大家看这个成龙大哥的好像有很多是不是对吧?呃,这个看起来这个这是什么?这是呃,看起来比比较老的这个对吧?然后下面有这个热门推荐,然后评分最多最新电影这些就是有一些规则,可能大家看的不是特别的完善啊,就是写的不一定是按照我们这个呃来写的,这个是业务系统里面实现的一个问题了,这个大家不用去太在意,大家可以知道下边这些就是我们所说的统计推荐,对不对?哎,这就是一个统计推荐,然后大家想到前面这一部分,我们把那个基于营运营模型算出来的那一部分,是不是可以作为离线推荐推到这里啊,然后在上边我们如果点击评分之后,是不是实时推荐这个列表就应该变啊,所以我们现在主要想考察的主要是这个。
16:59
实施推荐我们应该整个能跑通对吧,我点击一个它应该有变化,好那大家可以看一眼,比方说我们随便点一个,诶大家看这个是有点像,这是一个海贼王的一个电影,对不对,看一眼啊,啊大家看这个叫one piece film这个这个好像不知道什么东西啊,不过没关系,我们给一个高分来试一试对不对,大家会想到我这里边如果给高分的话,我们在诶这里面来报错了。
17:28
哦,Sor,这里面可能还有一些地方,确实是会有各种各样的问题,对吧,这个大家不用去太在意啊,只要不影响我们这个主体的评分,这个过程就可以,然后大家会想到我这里做了操作之后,是不是应该这个诶大家看这里边启动之后是不是已经有了一串的这个日志信息啊。对吧,大家看跟mango的连接对不对,然后这个web server都提起来,如果我们这里做一个评分操作,这里是不是应该就会多一条评分数据,然后大家会想到我们对应到这个,呃,Flu那里是不是就应该会收集一条数据,然后会给到卡夫卡对应这个application这里是不是也应该收集到一条啊,这里处理的时候也会收集到一条,最后我们stream recommend这里是不是也应该收集到一条啊?最后我们看是不是有一个推荐放到那个stream RA那个列表里边去,这样我们就把整个项目串起来了,好,我们评个五分吧。
18:27
哎呀,这个确实大家看就评完了之后也没什么效果,所以就就光是这么一个一个显示对吧,确实做的不好,诶大家刚才刚才是不是看到一个跳变啊,大家看是不是多了这么一条数据,48分,应该就是刚才我做的这个操作对不对,我们看一下这是个什么数据,Movie rest API诶然后大家看是不是moviex啊,后边是不是来了一条评分数据,我的啊,这是UID对吧,我注册之后它它是跟时间相关的一个UID啊,然后后边这是不是我评评价这个电影的m midd评分是不是给了一个五星好评,对吧?然后时间处是不是给过来了,诶没问题啊,我们看一眼这里,诶大家看这里是不是就来了一条数据,卡不卡,这里来了一条数据对不对,Movie rating data coming,然后大家看这是因为我们在application里面给的是不是完,呃,就是在一开始处理之前的数据,对不对,是把它完整的都显示出来了,那是不是这一条全有啊,好,那么。
19:27
我们看一下看,诶,我们在stream recommend里边是不是也来了一条数据啊,啊,当然可惜这里这里面我们没把它打印出来,大家想打印可以加一句对吧,那最后我们看一眼,这个是不是在mongo里边已经有了数据呢?售一个tables给大家看,现在果然有了streams。这不像我们昨天做那个简单测试的时候,我们是创建了一个,呃,这个卡夫卡producer,然后手动给他写的数据,我们是真的点了一下这里就有了,对不对?好,我们看一眼啊,这里是什么东西,呃,DB.stem.fun.pretty哦,大家看到哎,我们这个海贼王的这个,他的这个实时推荐好像比较少啊,大家看就只有就只有三个对不对,然后他的这个分数好像还还都挺高,看起来还都挺高,因为大家想到它本身的评分是五分对吧,然后。
20:37
那大家想是不是你如果4.99,这是不是已经接近五了呀,说明它那个相似度是不是极高啊,大家想我们做那个加权计算的时候,那那应该就是如果相似度是一的话,乘以平分乘出来是五对不对,那平均分才才会接近五,大家看一看,我们看一看它是不是真的能变化啊,我们退回一下,诶大家看果然变化了,诶果然是三个电影对不对,而且大家看到还真的是看起来是好像真的跟至少都是动画吧,对吧?然后真的是跟海贼王好像是相关的一些电影,诶所以大家会看到我们这里是他的那个评分吗?这里是它的统计评分,我们这里是不是跟他的对相似度做了加权计算之后的那一个推荐评分啊对,所以大家看到这个推荐评分为什么给的这么高呢?是不是因为他跟这个海贼行特别相关啊,对吧,所以大家。
21:37
他会看到就是这个评分,确实就就会有这样的一个一个一个状态啊,啊,当然大家可以想到,就是我们也可以去再去选另外一个,大家认识什么诶,比方说这个星球大战这个这个大家知道的是吧,Star wars这个是星球大战对不对,我们点击,哎呀,大家看这个有bug啊,跳过来之后还在下边的位置,我们还是给个好评试试啊,五星,然后我们看一眼,看一眼这里的数据,诶大家看又来了一条对不对,这里已经来了,那其实别墅就不用看了,对吧,大家看这个log,这里是不是又来一条啊对吧,然后我们就直接看这个效果吧。
22:14
诶,大家看这里的这个直接推荐就改变了,对吧,我们刚才点的那个是一个,呃,是一个星球大战对不对,星球大战几啊是我看一下啊,星球大战星球大战四对吧,所以我们这里的推荐大家看是不是就推荐出来了,另外两部星球大战对不对?呃,尽管大家看就是。哎,这是五对吧,那后边应该大家想到就是应该也是另外一部,这是六对吧?啊,所以这个推荐就是确实还是有有关联的对不对,那我们如果现在去看一眼它这里边数据的话,诶,大家就会看到这个列表里边是不是跟刚才就有一些变化了呀,而且我们之前的海贼王他的那个评价可能评分是不是就没那么高了呀啊,甚至都有可能没没筛选进来对吧?啊,所以大家就会发现就是这个真整体上来讲还是实现了我们想要的这个功能的啊,当然就是说大家可以看到本身这个业务系统做的还是比较比较真真实的一个业务系统啊,就是实现的功能还是比较复杂,呃,就是大家看到这里还有一些快速连链接,我们可以去跳转对不对,呃,你这里边还有用户空间,你可以去看一下这个,呃,苹果分的这个数量,诶这这里有一些bug,大家看到就是我应该是有一些是刚才我点过的对吧。
23:41
有一些是我之前点过的,他还直接把这个这个放在这里了,因为大家可以想象得到这些有一些东西是不是会存到比方说像ES里面去啊,我ES的数据没有没有清的话,它是不是直接就给我又又搜出来了呀,另外这里大家看到还有一个这个查询,大家看这些内容是不是比方说我这里边搜过的啊,有这个matrix,大家可能知道黑客帝国是不是本身就叫matrix啊,呃,对吧,我这里边可以去用这个去做一个搜寻,搜出来是不是就是根,大家看黑客尼果对不对,这个是,然后大家看可以是片名也可以是。
24:20
大家看这个叫什么叫an matricx,所以这是不是一个模糊检索啊,那大家可以想到这个功能是靠什么实现的?对,肯定是ES,这就是整个这个项目里边还是有一些复杂的一些,呃,就是多多个应用都给大家应用起来了,所有的工具都放在一起了,所以大家看其实这个你要是完全把这个代码都吃透,然后自己好好跑一跑的话,也算是一个比较真实的一个业务应用场景了,好,这就是给大家做测试的这一部分。
我来说两句