00:00
接下来我们去创建一个新的项目。呃,这里先去给一个group ID,比方说我叫艾硅谷点com com.at硅谷啊,然后这里边的ID,我这里就叫一康。Recommend,跟我们文档里面写的一样。Recommend的system。呃,然后finish创建出来。好。现在我们。现在我们创建了一个新的项目,叫做e commerce recommend system的一个电商推荐系统项目,好,那么看到这里边已经有了一个po文件啊,它大家知道在微项目里面这个po po文件就可以指定整个这个项目的架构,而且可以去添加各种各样的依赖,对吧?啊都都在这个里边去做的一些操作,好接下来。
01:08
我们是不是我们整体的思路是想要创建一个负子项目,呃,外层的这个是我们的负项,里边还需要在添加对应的子模块,所以接下来我们做的是。表示有点太卡,呃,先等一下吧,先把下面的这个reading过程跑完之后,这这个就有点。好,我们现在可以把这个enable autoport打开对吧?呃,有同学如果要是这里看不到两边的这个,呃,Project这个目录的话,这个大家知道吧。这个是two buttons里边有这一项啊,大家把这个勾选上好,所以呃,我们这里已经有了这个副项目之后,可以去new一个module,然后去构建下面的一个子项目。
02:02
叫做recommend。创建出来,呃,接下来大家会看到这里面就都包含在里边了,之前的这个副项目的pop文件里边有什么变化呢?对,是不是多了一个module啊,多了一个模块,然后呃,这个副项目还pack packaging加了一个packaging这个标签变成了po,对不对?呃,这就是这个父子项目的一个结构,那么子项目这里边它就会有一个parent的这个标签,指定的是我们外层的这个1s recommend system这父子项目的结构。同样我们接下来今天要做的是在recommend下边我们是不是就会有具体的各个推荐模块,今天我们要做的是第一个简单模块是数据加载,所以在下边再去创建一个子项目。这个数据加载就叫做data loader。
03:04
呃,这里大家注意一下这个目录啊,如果要是它没有自动的补全的话,我们把它要添加进来,好添加进来之后大家会看到一样的啊,Recommend这里是不是也是下边多了一个子模块啊,这里边我们loader他的parent,它的副项目是recommender,这就是我们整体的一个项目结构,呃,然后大家会看到就是。在我们的这个架构里边,我们的代码是要放到这个SS下边的,对不对,这里面其实副项目是不是根本就不需要这个SS啊,对,我们只是把它作为一个,呃,就是整体的项目结构来做做考量,控制一些依赖就可以了,所以可以直接删掉,那同样这个recommend下边是不是也可以删掉啊,也不需要做具体的S。真正的代码我们会放在data loader source下边,我们去实现就可以了,那接下来这个它的代码放在哪里呢?大家看source下边,Main下边有一个Java,它默认是抓va,大家看着不爽对吧?你可以另外再新建一个目录,叫SKY或者也可以,是不是可以直接重命名啊,对skyla它重命名一下,那有同学可能会担心,我们之前本来这个就是原文件,目录是Java,你改成scla之后是不是会有问题呢?诶我们看一眼啊,怎么看是不是打开这个project structure去看一下它这个定义啊,我们可以看到在这里边是不是source folds定义的,就是source main下面的。
04:39
如果说这里边已经改变的话,大家在这里边再去配一下就可以了,好,这是这些常常规的一些操作,然后我们还在真正开始码代码之前,我们还需要去做一些,呃,就是一些准备工作,什么准备工作呢?刚才我们只是把这个整体的框架搭建起来了,具体里边的依赖我们是不是都没有配置啊?
05:04
所以接下来我们在最外层的这个po文件里边,需要先去定义一些东西啊,大家看一眼这个文档,我们会定义什么东西呢?大家看在最外层的e commerce recommend system里面,我可以先去添加一堆proper,这是干嘛的?对,这其实是我们里边是不是会用到各种各样的工具,用到各种各样的依赖,它是不是都应该有版本信息啊,如果我们下面的子模块,你这个模块里边用到的Spark是,呃,是这个2.11,呃,二,2.1,另外一个地方用到的是2.2,那这个肯定就乱了,对吧?所以我们需要在最外层副项目里边对他的版本统一做一个管理,哎,所以我们先定义出这样的一些proper,定义它的一些版本信息,我这里就直接copy过来了啊,大家只要知道它是什么就可以,大家看一眼这里边用到了哪些东西呢?
06:07
Log for g,大家知道这是什么吗?对,这是我们处理日志的这个日志框架,对吧?那么self for g呢?它也是处理日志的啊,他是我们所谓的这个简单日志门面,大家可以认为它是一个日志的接口,就上面这个log forg是对日志的具体实现,而下面这个self forg是简单日志接口,好,那下边我们就会用到。Mongo Spark,呃,这是mongo跟Spark之间的连接器,对吧?然后下面这个KASPA,这是这是mongo的一个,呃,Skyla上面的一个driver啊,当然就是说现在的话,最新的版本大家应该用,就是呃,官方应该有这个mongo skyla driver啊,我们这里面还用,沿用的是之前的一种实现,就是一个呃,开源的实现,叫开SPA,大家工具性的东西,只要我们会用就可以,然后接下来还有red。
07:08
还有卡夫卡,这些我们都是能够想到的,在项目架构里边我们都是已经提到过的,还有Spark,呃,还有skyla,对吧,我们在这里去定义SKY了,还有一个叫做g plus的一个,呃,一个库,那么这是做什么的呢?这是一个Java的线性代数的库,我们做具体的这个矩阵运算的时候,需要用到它里面的一些东西,所以在这里面把它统一都定义出来,好,那然后接下来我们已经有了这些版本信息,接下来是不是应该去定义一些,大家能想到应该去定义一些什么呀?是不是应该有一些dependency啊?去定义依赖对吧,那大家首先想一下,我们在最外层的副项目里边需要有哪些依赖呢?最外层的依赖是不是应该下面子项目,所有的子项目都用到的依赖才会写到这里啊哦,所以这里边大家看一下文档里边。
08:11
给出来的例子就只有这么几项,我们这里用的是什么呢?对,就是日志相关的放在了这里啊,那具体其他的一些工具啊,你像这个,呃,这个mango或者说或者说SPA,这有可能有些模块用到,有些模块不用到,对不对,诶所以我们就用到的时候,他们再去自己定义就好了,我们这里只用所有模块都用到的东西。其实就是日志相关。好,我把它也是直接复制过来,但是大家如果想要去,呃,就是自己一行一行去敲一下,去写一下的话,这个肯定也是没问题的啊呃,那那有些同学可能会想,就是这里边我要用到这个self for g,它里边的这些东西我到到哪里去找呢?这些信息到哪里去找呢?呃,对,这个之前大家也讲过是吧,Ma ma responses,对。
09:10
呃,在这个里边,如果说我去找一下这个self for g去搜索一下,其实就可以看到我们相关,哎,要用到的这个self for GA API cell for g log for g12对吧,这些就都都已经有了,我们其实可以直接在这里边点对应的想要用的这个版本,大家直接在这里把这个copy下来是不是就可以了啊,这这个大家应该做过没项目的话,这个都很熟,所以就提一句大家回忆一下就好了,然后接下来我们最外层把这个dependency定义好了之后,还应该有一些什么信息呢?我们继续看文档里边给大家定义了哪些东西呢?还有一些插件,公用的插件可以在外层去引入,比方说这里大家看到我引入了什么。
10:05
对,我这里引入了一个编译的插件,没文compiler plug in,所以它相当于引入这个插件之后,我们子项目在做这个微项目编译的时候,是不是就都用在编译环节,这个生命周期是不是都用它?呃,这个大家先了解一下我们微project,大家看到这已经有三个project,对不对?本身的这个没项目是不是有各种各样的生命周期啊。每一个生命周期,我们是不是可以给他绑定对应的插件,然后在这个对应的生命周期去调用这个插件去帮我们做一些处理好,那么这里边已有的这些plug in,这是本身已经定义好的,对吧?大家看到在clean阶段deploy install,还有这个site,这里边有几个这样的几个插件,我们现在如果说它的编译。
11:03
这个阶段也要用某个特定的插件的话,是不是可以在这里边直接定义出来ma compeller plug,呃,另外下面大家看到还有一个ping management,这是表示什么?前面我就直接定义这个plug ins了,下面是plug in management,对这呃,这个表示的是。下边的这些plug in,大家看下边是不是还是plug ins啊?下边的这些plug in是指声明。但暂时不引入,所以就相当于我是在这里边已经配置好了子项目,你如果要用的话,诶,直接用我这里边的定义好的就可以了,你不用再做那些其他的像版本信息啊,其他这些配置了,所以是这样的一个定义,大家看在这个planning management里边就定义了什么。每晚的大包插件对吧,还有什么。
12:01
大家看skyla ma plug in,所以我如果有了这个skyla plug in的话,是不是就直接可以把skyla代码编进行编译,编译成class文件了?所以如果我有这样的一个插件引入的话,其实也就不需要再做其他的一些配置。我这里把这个复制过来build啊,把整个build都复制下来。好,呃,大家看我把这一部分已经引入之后,刚才大家看到右边这里出现了一个什么样的变化吗。对,是不是plug in,这里就多了一个compel啊,呃,这就是刚才我们指定的这个3.6.1版本的maybe compiler plug in对吧?呃,就是在编译这个过程里边,我们用这个就可以了。好,呃,应该大家之前做这个main项目的时候,可能对这些都很熟,我们就只是给大家做一个回顾就好了。
13:06
好,然后接下来最外层已经把该定义好的,该定义的都定义好了,那么接下来我们看这个recommend recommend是我们的。推荐,总体的这个推荐模块都在这里边,那么大家会想到它下边的子模块可能共有的依赖会用到哪些东西呢?哎,我们这里边对大家会想到Spark是不是肯定要用啊,对吧,所以在这里在这里我没有直接去定义dependcs,而用了dependency management,它的区别是什么呢。对,跟刚才那个plug in management一样,对吧?对,他是说我这里只是声明不是直接引入,所以下面的项目你如果想要用的时候,我这里边的版本都已经定好了,你就直接引入就可以了。大家看我这里边声明了哪些东西呢?
14:01
对,Spark相关的是不是都要放在这里啊?呃,那Spark的几大组件,Spark靠,要不要用?呃,肯定要大家能想到,那我就把Spark几大组件全先放在这,反正我只是声明嘛,你要用到什么你去用就好了。所以Spark Spark SQ Spark streaming Spark ML LA,呃,当然了,还有这个graphic X,对吧,Graphic你放在这里也是可以的。最后还有sky library,我统一把它都放在这里,这就是我们有可能要用到的,呃,在推荐模块里边有可能要用到的dependence。好把它做一个复制好。呃,那大家会看到我这一部分把它这个复制过来之后,其实这里边看起来好像没有多大变化是吧,Dependency。大家看这里边我在最外层定义了这个log log forg的这些,这些依赖是不是里边的子项目就都有了,但是我这里定义完了之后怎么没东西呢?啊,那这就是我们说的只声明不引入,对吧?这就是这样的一个过程,大家可以看到这个data load,这里的dependency还是这几项好,那接下来我们再看data loader需要引入什么东西呢?
15:20
那就得考察data这个数据加载服务,我们到底要做什么了。我们到底要做什么呀?对,我们其实就是从文件里边读取数据,然后装载成我们想要的那个数据格式,最后用这个SPA再写到这个对应的mango数据库表里边就可以了,是不是这就是我们想要做的事情,所以对大家会想到我们需要什么东西呢?诶这里面大家注意一下啊,就是我们在前面的recommend里面还少了一项。什么呢?因为在最外层我们是不是只声明了skyla ma plug in没有引入啊,啊,所以这里边把当时声明出来的那个在真正的引入,在build plug ins里面引入。
16:11
刚才少做了这一项工作,好。大家看我把这个引入之后。这里是不是就多了一项这个skyla plug啊,同样在data loader里边是不是也多了一个LA plugin。啊,这是大家能够想到的啊,然后接下来data loader里边我们需要引入哪些依赖,大家可以看一眼。那Spark要不要?我们读取和写入的时候应该是需要用SPA对吧?呃,需要用SPA session,然后spaq是不是也需要啊,这也是我们需要的,另外skyla library这个也需要啊,然后接下来是不是还跟mango有关系。我们要跟mango去做这个写入的操作,所以要用到开SPA,这是mango的驱动,另外还需要mango Spark connector,这是我们需要用到的一些依赖。好,我把这个也是复制过来写到这里。
17:18
啊,大家看一眼,现在如果我把这一部分引入的话,呃,在这边。诶,大家看这里面已经有跳变了,对吧,Dependency里边是不是刚刚引入的依赖就都已经写进来了。啊,所以有了这些东西之后,我们在代码里边就可以直接用这里面的内容了。
我来说两句