00:00
从今天开始我们给大家讲推荐系统的一个具体应用,我们的应用场景是电商,所以给大家讲解一下电商推荐系统设计,首先我们看一下主要内容是什么呢?哎,我们希望最后推出来的一个状态是大家其实从页面上可以看到这是一个混合推荐啊,所以我们其实里边是包含各种各样不同的推荐模块,我们的主要内容呢,先给大家讲一讲整体的项目框架,然后做一下数据源的解析,后边就是我们会有各种各样的推荐模块分别做一个介绍。呃,那大家看到我们这里边主要有哪些呢?有统计推荐模块单独列出来,是不是因为它不属于个性化推荐啊啊,所以这一部分是给大家单独列出来去作为一个模块去去讲去实现,后边呢就都是个性化的推荐模块了,我们用到了哪些不同的算法呢?呃,首先是基于英语一模型的离线推荐。
01:02
然后还有我们自定义模型的实时推荐,哎,这个就大家看到这个划分是根据离线和实时去划分的,对不对?而且里边应用的算法还不一样,呃,后面还有一大部分是其他形式的离线相似推荐,呃,那么这又包括两部分,基于内容的推荐和基于物品的协同过滤,也就是有item CF对吧?呃,我们把这个给大家分模块,分别做一个讲解,做一个实现,最后我们希望实现这样的一个混合推荐。好,那呃,然后我们来看一下这个项目的框架啊,我们整体的这个框架其实主要给大家讲一下,先回忆一下大数据的处理流程,然后讲一讲这个系统模块设计怎么样去设计,最后说一下我们的整体架构,首先我们回忆一下吧,呃。这个数据的生命周期,我们在这个实际应用当中,数据它其实是有生命周期的,就是从什么地方产生,然后最后到什么地方去啊,去消费对吧,去展示出来做应用,这是有完整的一个数据周期的,大家回忆一下,首先是数据源,数据源我们可以分成三大类吧,啊,就是像图片视频这种,这是属于非结构化的数据,那当然了,我们如果存在像MYSQL里边这样的关系型表格里面的数据,这就是结构化的数据,非常。
02:34
非常明确的,有明确的数据结构的这样的一个结构化数据,另外还有一些数据是我们大数据里边常常会遇到的什么呢?就是日志数据,这我们可以把它叫做半结构化的数据,相对应关系性数据来讲,它结构化没有那么好,它相当于是序列化之后的一个状态,那么相对应非结构化的数据来讲呢,它其实还是有有一部分结构化的成分在里面的,所以我们把它叫做半结构化。
03:03
有了数据源之后,我们首先要做的是数据采集啊,这里面提到的这些工具,大家看是不是都很熟悉,应该都讲过是吧?呃,这这个我们做,呃数据收集的啊,呃,卡夫卡这些或者说数据迁移啊什么的工具,这些ETL,这都是我们前期做数据采集相关的内容会用到的,采到数据之后接下来就是存储。呃,存储其实很简单,这一部分涉及到的都是数据库相关的东西了,呃,我们讲过的,可能这里是写的Oracle,我们讲的是mysle,这些是,呃,就是关系,传统的关系型数据库,对吧?呃,那像这个green club,像这个sanra,这些大家可能都都听说过,但但是即使没用过也也应该都知道,它其实就是我们做数据存储的一些工具,或者说进视,那比方说像这个green plum,这其实也是一个分布式的关系型数据库了,它基于post gra CQ,呃,那后边这个andra呢,它是。
04:08
它是一个no CQ数据库了,也是一个列存储的数据库,大家可以认为它跟h base的这个,呃,结构架构是类似的,原理是类似的,那当然了,我们还可以把它存到HDFS上,所以大家会发现我们后边在做这个。项目架构设计的时候,我们用到的存储介质是不是其实可以有多种选择啊,那我们前面做数据采集,其实也也是有多种选择,这里边每一个工具,每一个环节,其实都不是说无可替代,就非用它不可的,我们在一开始其实是应该做一个,呃,就是做一个选型,做一个这个框架的选择,工具的选择,考虑到我们项目实际应用,然后去选该用什么工具。这里边我们具体到这个项目用到的主要的数据库存储是芒GODB,那这个之后再给大家做一个详细的介绍,有了数据存储之后,接下来我们就应该把它从数据库里拿出来,去做对应的运算和处理,呃,这里边涉及到的一些呃运算框架或者说这个处理框架,呃,大家看这个maha就是哈杜普里边的机器学习框架了,这个storm的话就是流失处理,对不对?这些比较早期的这个流失处理,那现在大家比较熟悉的可能是杜里边map reduce啊,呃的这个Spark,还有非常新的flink,这些框架是我们经常会用到的大数据的一些计算框架,算完了之后得到的结果是不是还是应该?哦,当然了,还有一步应该再写回到数据存储的一些介质里面去,最后应该做一个应用或者说展示,对不对啊,这里边我们可以做一些这个BI。
05:57
分析啊,做一些商务应用的一些分析,或者说像这个table做这个可视化数据分析啊,呃,另外还有这个一,我们直接用一个图表来展示出来。
06:09
这就是我们整个的数据的生命周期。在大数据项目,大数据应用里边的生命周期啊,那接下来大家回顾一下这个大数据的处理流程,这个图可能比较小,呃,大家就是看一下它的整体主体的这个路线就可以了。这左右分了两个部分,大家直观的一看,能能看清楚它到底是属于什么吗?左边这个是什么啊对,大家一看这个走到这,这是不是有实时计算啊,对吧?从这个日志采集来了之后,直接进数据总线,然后做实时计算,所以左边这一部分是一个实时的处理流程。那它的流程是什么呢?首先啊,我们应该有一个网站或者APP,我们从这个网站或者APP的前端页面会提供用户接口,用户在上面会做各种各样的操作,那这些操作其实是会通过,呃,就是以这个HTTP请求的形式发送到业务系统的后台,我们应该有一个后台服务器。
07:14
那么后台服务器接收到请求之后呢,就会调用相关的服务进行响应,在做这个响应服务的过程当中,我们是不是可以去买点收集日志啊,这就涉及到我们既可以在前端去买点,也可以在后台去买点收集到的日志。就可以记录用户的一些行为,或者说一些特定的操作,然后把它写入到日志文件里面去,这就是老文件啊,然后接下来我们就去做日志采集。一般就是这样的一些工具了啊,采集到的数据,实时的日志信息传送到数据总线,接下来我们往往是用一个呃,就是像卡夫卡这样的东西去呃做做一些呃就是一个消息队列去做一个存储,对吧,然后直接让我们的实时计算的框架去消费是这个卡夫卡里面的数据,就可以在像这个Spark streaming啊,呃,像link啊,这些框架就可以去做一些实时的流失计算,最后得到结果,我们再把它放到数据库里边存储起来。
08:30
业务系统从数据库里边读取信息,就可以进一步的可视化,做一个可视化展示,显示给用户看,这就是我们整个的实时处理的这样一个流程,所以这里边的重点其实是在我们采集日志的时候,这是一个实时的过程,然后实时采集之后,然后会放到消息队列卡夫卡里边,那么实时计算框架从卡卡里面消消费数据,呃,这样去做一个实时的流失计算。
09:01
最后得到结果实时的显示出来,那同样还有另外一套处理的模式,处理的流程就是右边这个啊,这是我们所说的离线处理的一个大数据处理的一个流程,它主要的流程是什么样的呢?其实前面几步和最后跟实时的也是一样的,我们先要拿到日志对吧?呃,先从这个业务系统生成日志文件,接下来还是用flu这样的一些工具去做日志采集,然后接下来是不是可我们可以把这个在flu里边,把它的think配置为HDFS去做一个日志存储啊,诶把它直接存到这个HTFS上,接下来就可以做日志清洗啊,做ETL了,呃,一般情况我们会把它加载到哪里去呢?一般会把它再放到书仓里面去做这些ETL操作,对吧?这就涉及到了hi这样这样的一些东西。最后我们当然目的不是存储,还是要做计算,我们从数仓里面把它读出来,应用大数据的计算框架哈杜Spark进行计算和处理。这一个过程其实整体来看的话,计算量比较大,数据量非常的庞大,计算比较复杂,所以整体来讲我们都是先存储,然后做离线的计算。
10:22
是这样的一个流程,计算完成之后呢,还是把它存到相关的业务数据库里边,最后在可视化展示给用户看。大家回忆一下整体的实时和离线的处理流程,这就是我们大数据的处理流程,所以对于推荐系统而言,我们作为大数据的一个典型应用,其实主要也是这样的两个处理流程,有实时,有离线。那我们看一下我们的目标,我们在这个项目里边,我们是要做一个推荐,那推荐呢,会用到各种各样不同的算法,所以我们最后其实就是要把各种推荐算法得到的结果。
11:06
是不是应该做一个混合啊,做一个综合,然后在页面上不同的位置给用户展示出来,这就实现了我们这样的一个目的,比方说大家看最后得到的结果就是在一页上面可能全是推荐,不同的位置,我们显示不同的算法推出来的结果,这里有实时推荐,有离线推荐,有热门推荐啊,当然这个名字我们不是特别的严谨,大家可以去根据自己的需要,项目应用的需要去做一些调整。除了首页当中基本的这个个性化推荐和这个热门推荐之外,还有什么呢?我点开一个。商品的详情页的时候,是不是还应该可以看一些基本的操作啊,首先我应该能够看到商品的详情,然后应该可以给他做一个评分,然后呢,还可以看到大家给他贴上的标签,最后还应该根据这个具体的商品给他推出相似的一些推荐啊,这是电商网站当中经常有的一个应用,对吧?你点开一个商品要看的时候,下边有跟他相似的一些商品推荐出来啊,所以在实际应用当中,其实也是未必是在一个页面里面去做混合,可能是嵌在很多个页面里面,在不同的地方,你要用不同的算法给他推不同的东西出来,这是。
12:29
电商网站做推荐常有的一种混合形式。所以我们这种混合就是前面讲到的分区混合啊,大家应该有印象对吧,这就是典型的分分区混合。那么接下来给大家介绍一下项目的系统架构,这个项目里边到底是什么样的一个架构呢?首先我们应该有这个前端用户的可视化界面,用户的可视化界面这里提供了各种各样的操作接口,用户做了操作之后会把请求发送到后台服务器来,那么我们的前端这个是用AAJS写的一个前前端,后台是用spring做的一个后台,所以这些就是我们的业务系统啊。
13:17
这些大家不需要过多的去考虑过,我们主要是要做推荐,基于他做推荐好,那么业务系统里边所生成的一些数据会放到哪里去呢?我们主业务数据库用的是mango DB。然后同时还有一些重要数据会放到red里边去做一个缓存,大家会想到那这这个过程里边这个mango是不是可以做一个替换呢?当然可以,你如果想把业务数据存在MYL里边,当然也是可以的,或者说呃,你你你想直接就是这里边我们有业务数据库,然后你把推荐想用的数据再放到h base里面,当然也是可以的,或者你放到数仓里边也是可以的,所以这些东西并不是一定要这么做,那我们这个项目里边为什么选型用了这个芒GODB呢?
14:12
一方面mango其实是在大数据系统应用里边非常应用非常频繁,也可以说是现在很主流的一个数据库了,他对于大数据的这种呃应用场景是非常适合的,它的读写性能都是比较不错的,而且数据量可以支持很大的数据量。另外还有一个特点就是mango是一个。文档型数据库,先给大家做一个了解,呃,这样文档型数据库它是什么特点呢?就是里边的每一条数据。存储的时候都是类似于。啊,这里面它存储的结构类似于Jason,所以说大家可以认为它就是一个Jason创当成一个文档存储起来的。那么它就特别适合应用于什么样的场景呢?诶,我们这里一个电商项目里边的商品是不是它可能有各种各样的一些字段特征啊,哎,我里面存储的时候,它这个结构可能是完全不一样的,那我们用统一的这种表结构,你写到一张MYSQL表里边可能就不太合适了,有些商品它可能有这个字段,有些商品是另外的字段,那这种场合用什么存储方式更好呢?哎,就是用更加灵活的这种文档性数据库存储会更好一点啊。这是先给大家说一句,我们这里边用到的主业务数据库是mango。
15:37
呃,Red做缓存,这是常规的一个操作,呃,当然我们这里面还可以,呃,比方说加入ES对吧,去做一些模糊查询,做一些条件查询,这也是可以的,大家可以在这个基础上去做一些扩展。呃,这是我们主要的业务系统的一个构成,我们主要做的内容是哪些呢?推荐,那我们应该会有离线的推荐服务。
16:05
离线,离线这一部分呢,我们首先可以做一个统计的推荐,对吧?呃,提供一个离线统计服务,另外还有离线的推荐,个性化推荐服务,我们把这两部分都当做离线推荐部分。然后大家会想到是不是还应该有实时推荐啊,实时推荐这一部分,那就需要从综合业务服务里边,我们的业务系统里边是不是采集日志啊啊,拿到他的日志信息,用flu去做一个收集,接下来可能要有消息队列去做一个缓冲,卡夫卡拿到的数据给到Spark streaming这边做一个实时推荐服务处理,那么做实时推荐的时候,可能还要用到red里边缓存的一些数据,最后得到的结果我们都要写回到mango里面去,写回到mango里面去之后。
17:02
业务后台是不是就可以从网购里边读出来内容,再展示给用户看了,哎,这就是完整的一个业务流程。所以在我们实现的这两部分里边,显然是有两大模块,两大块儿内容需要去做,实现的一部分就是左边的离线部分,另外一部分就是在线部分。我们要应用的数据处理流程,就是前面讲到的离线的处理流程和实时的处理流程。刚才只是一个整体的介绍,接下来我们来做一个具体的分析啊呃,首先这个用户可视化,这里可能会给用户看到什么东西呢?哎,可能要有这个推荐结果展示,可能要有商品的检索,可能要有商品信息的展示,还有商品标签,还有商品的评分,那所有的这些对接的当然都是综合业务了,就是我们的spring写的后台,后台这里相对应的就有各种各样的服务。
18:00
呃,对应的数据库,业务数据库是mango,然后呢,还有缓存数据库是red。哎,我们这里边如果要去做推荐,那首先其实是。我我们得有基本的数据啊,那一开始我们这个这个状态,整个系统的状态里面,Mango里面可能现在是什么数据都没有的,所以我们先要从另外的数据源里边找到数据,然后把数据先导入到猫狗里面去,这里边我们就做一个简单处理了,就是写一个数据加载服务,然后直接从文件里边。把这个数据导入到芒狗就可以了,那如果说我们的实际应用场景是你要从这个数仓里面去导入数据,是不是也是一样的呀,或者说我要从其他的一些地方,其他的数据库去做一个数据迁移,这也是一样的啊,所以大家把这个呃,就是可以灵活应用在这里边各个环节,其实有其他的一些实现方式的。呃,我们这里会写一个数据加载服务。
19:03
把它放到mango里边去,呃,这是我们基本的数据,接下来可能要实现一个离线的统计服务,呃,这里边可能就会比方说统计一下历史热门的商品啊,或者近期热门的商品,还有这个每个商品的平均评分做一个统计,那对应的结果大家会想到这是一个离线计算的过程,对不对,哎,我们用这个,呃,Spark Spark CQ直接把它统计出来,最后还是要写回到。对应的表里面,然后才能给业务系统去做查询,对吧,所以这个过程还是要有的。这一部分是统计,统计服务它是离线来做的,那还有另外的重要的一部分就是个性化的推荐,个性化推荐呢,一部分可以离线来做,离线这一部分包括什么呢?呃,比如说我们可以用as算法去做一个盈语义模型的推荐,对吧?啊写分过滤的推荐还可以。
20:10
基于TFIDF,我们是不是可以提取商品特征啊,去做一个基于内容的推荐是不是也可以啊,我们把最后推荐出来的结果也要写回到mango数据库里面去,那最后我们还可以用item CF。从行为数据里边是不是可以过滤出来相似的物品,给他做一个相似推荐啊,这也是可以做的,对应的结果也可以写到网果里面去,所以这就是我们离线的个性化推荐这一部分。除了离线推荐之外,还有实时,实时的推荐是怎么做的呢?啊,那首先我们是不是应该是,既然是实时嘛,肯定是用户做了一个什么操作,然后我们就会有一个实时的响应对吧?呃,我们这里边典型的场景是什么呢?用户做了一个评分操作,呃,我们重要的一个行为数据就是评分数据,所以用户这里来了一个评分,那么后台业务系统会。
21:12
调用相关的这个服务,在这个服务里边,我们买点去收集这个日志啊,一方面这个服务会把这个评分写到mango里面去,另外一方面写到里面做缓存,还有一部分是不是应该,哎买点之后就应该把它写到log里面去啊。有了log,我们是不是用flu就可以去做实时的log收集了啊,采集到的话,诶,我们file source从log文件里边收集到,然后构建这样的一个管道。有一个卡夫卡SK,把它输出对应的就放到了卡夫卡这里边来做这个消息缓冲,在卡夫卡里面我们又可以做一个对应的消息处理,可以从这个log这样的一个topic里边,把它转成另外一个我们需要的数据格式,呃,做一个卡夫卡stream的过滤,输出到另外的一个topic里边来,这里得到的就是我们最后想要处理的数据格式。
22:18
那么。得到的这个数据就会传递给Spark streaming去做实时的计算。做实时计算的时候,我们需要哪些数据呢?除了实时的日志数据之外,我们可能还需要从red里边拿到一些最近的评分数据。另外,可能还需要从mango里边拿到一些对应的数据,把最后得到的实时推荐的结果写回到mango里面去,这就是一个完整的实时推荐的流程。好,那么mango这里边得到的所有的结果,我们都应该提供给业务后台去做推荐结果查询,查询到的结果返回给前台用户就可以看到了,就是我们一开始看到的那个展示出来的用户页面,呃,当然这里边提供的其他的一些后台服务,比方说这个商品检索,我们这里边就直接用这个mango去做这个模糊查询了,那大家如果要是想加一个ES的话,这一部分可以用ES去做。
23:25
详情展示,当然也是从网购里边直接读出来商品详情就可以了,呃,那商品的标签呢,这也是跟网相关的一些服务。
我来说两句