- 初识推荐系统——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一)利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)项目主要效果展示——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(三)项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四)基础环境搭建——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(五)……
项目资源下载
- 电影推荐系统网站项目源码Github地址(可Fork可Clone)电影推荐系统网站项目源码Gitee地址(可Fork可Clone)电影推荐系统网站项目源码压缩包下载(直接使用)电影推荐系统网站项目源码所需全部工具合集打包下载(spark、kafka、flume、tomcat、azkaban、elasticsearch、zookeeper)电影推荐系统网站项目源数据(可直接使用)电影推荐系统网站项目个人原创论文电影推荐系统网站项目前端代码电影推荐系统网站项目前端css代码
文章目录
系列文章目录项目资源下载前言一、系统架构
1.1 后台服务部分1.2 数据存储部分1.3 离线推荐部分1.4 实时推荐部分 二、数据流程
2.1 系统初始化部分2.2 离线推荐部分2.3 实时推荐部分2.4 业务系统部分 三、数据模型
3.1 电影数据表3.2 用户评分表3.3 电影标签表3.4 用户表3.5 最近电影评分个数统计表3.6 电影评分个数统计表3.7 电影平均评分表3.8 电影相似性矩阵3.9 用户电影推荐矩阵3.10 用户实时电影推荐矩阵3.11 电影类别 T o p 10 Top10 Top10 总结
前言
今天给大家带来的是项目体系架构设计,包括项目系统架构、项目数据流程、数据模型等。以及整个系统各个功能模块是怎么串联起来的,还有各个软件是怎么相互配合的,最重要的是数据库模型的设计,如果数据库设计不好,会直接影响后面整个系统的运行,下面就开始今天的学习吧!
一、系统架构
项目以推荐系统建设领域知名的经过修改过的
M
o
v
i
e
L
e
n
s
MovieLens
MovieLens数据集作为依托,构建了整个电影推荐系统,包含了离线推荐与实时推荐体系,综合利用了协同过滤算法以及基于内容的推荐方法来提供混合推荐。提供了从前端应用、后台服务构建、算法设计实现、平台部署等多方位的闭环的业务实现
- 用户可视化:主要负责实现和用户的交互以及业务数据的展示,主体采用
A
n
g
u
l
a
r
J
S
2
AngularJS2
AngularJS2进行实现,部署在
A
p
a
c
h
e
Apache
Apache服务上综合业务服务:主要实现
J
a
v
a
E
E
JavaEE
JavaEE层面整体的业务逻辑,通过
S
p
r
i
n
g
Spring
Spring进行构建,对接业务需求。部署在
T
o
m
c
a
t
Tomcat
Tomcat上
- 业务数据库:项目采用广泛应用的文档数据库
M
o
n
g
D
B
MongDB
MongDB作为主数据库,主要负责平台业务逻辑数据的存储搜索服务器:项目采用
E
l
a
s
t
i
c
S
e
a
r
c
h
ElasticSearch
ElasticSearch作为模糊检索服务器,通过利用
E
S
ES
ES强大的匹配查询能力实现基于内容的推荐服务缓存数据库:项目采用
R
e
d
i
s
Redis
Redis作为缓存服务器,主要用来支撑实时推荐系统部分对于数据的高速获取需求
- 离线统计服务:批处理统计性业务采用
S
p
a
r
k
C
o
r
e
+
S
p
a
r
k
S
q
l
Spark quad Core quad + quad Spark quad Sql
SparkCore+SparkSql进行实现,实现对指标类数据的统计任务。离线推荐服务:离线推荐业务采用
S
p
a
r
k
C
o
r
e
+
S
p
a
r
k
M
L
l
i
b
Spark quad Core + Spark quad MLlib
SparkCore+SparkMLlib进行实现,采用ALS算法进行实现。工作调度服务:对于离线推荐部分需要以一定的时间频率对算法进行调度,采用
A
z
k
a
b
a
n
Azkaban
Azkaban进行任务的调度
- 日志采集服务:通过利用
F
l
u
m
e
−
n
g
Flume-ng
Flume−ng对业务平台中用户对电影的一次评分行为进行采集,实时发送到
K
a
f
k
a
Kafka
Kafka集群消息缓冲服务:项目采用
K
a
f
k
a
Kafka
Kafka作为流式数据的缓存组件,接收来自
F
l
u
m
e
Flume
Flume的数据采集请求。并将数据推送到项目的实时推荐系统部分实时推荐服务:项目采用
S
p
a
r
k
S
t
r
e
a
m
i
n
g
Spark quad Streaming
SparkStreaming作为实时推荐服务,通过接收
K
a
f
k
a
Kafka
Kafka中缓存的数据,通过设计的推荐算法实现对实时推荐的数据处理,并将结构合并更新到
M
o
n
g
o
D
B
MongoDB
MongoDB数据库
- 通过
S
p
a
r
k
S
Q
L
Spark quad SQL
SparkSQL将系统初始化数据加载到
M
o
n
g
o
D
B
MongoDB
MongoDB和
E
l
a
s
t
i
c
S
e
a
r
c
h
ElasticSearch
ElasticSearch中
- 通过
A
z
k
a
b
a
n
Azkaban
Azkaban实现对于离线统计服务以离线推荐服务的调度。通过设定的运行时间完成对任务的触发执行离线统计服务从
M
o
n
g
o
D
B
MongoDB
MongoDB中加载数据,将电影平均评分统计、电影评分个数统计、最近电影评分个数统计三个统计算法进行运行实现,并将计算结果回写到
M
o
n
g
o
D
B
MongoDB
MongoDB中,离线推荐服务从
M
o
n
g
o
D
B
MongoDB
MongoDB中加载数据,通过
A
L
S
ALS
ALS算法分别将用户推荐结果矩阵、影片相似度矩阵回写到
M
o
n
g
o
D
B
MongoDB
MongoDB中
-
F
l
u
m
e
Flume
Flume从综合业务服务的运行日志中读取日志更新,并将更新的日志实时推送到
K
a
f
k
a
Kafka
Kafka中,
K
a
f
k
a
Kafka
Kafka在收到这些日志后,通过
K
a
f
k
a
S
t
r
e
a
m
KafkaStream
KafkaStream程序对获取的日志信息进行过滤处理,获取用户评分数据流:
U
I
D
∣
M
I
D
∣
S
C
O
R
E
∣
T
I
M
E
S
T
A
M
P
UID|MID|SCORE|TIMESTAMP
UID∣MID∣SCORE∣TIMESTAMP,并发送到另一个
K
a
f
k
a
Kafka
Kafka队列,
S
p
a
r
k
S
t
r
e
a
m
i
n
g
Spark quad Streaming
SparkStreaming监听
K
a
f
k
a
Kafka
Kafka队列,实时获取
K
a
f
k
a
Kafka
Kafka过滤的出来的用户评分数据流,融合存储在
R
e
d
i
s
Redis
Redis中的用户最近评分队列数据,提交给实时推荐算法,完成对用户新的推荐结果计算,计算完成后,将新的推荐结果和
M
o
n
g
o
D
B
MongoDB
MongoDB数据库中的推荐结果进行合并
- 推荐结果展示部分从
M
o
n
g
o
D
B
MongoDB
MongoDB、
E
l
a
s
t
i
c
S
e
a
r
c
h
ElasticSearch
ElasticSearch中将离线推荐结果、实时推荐结果、内容推荐结果进行混合,综合给出相对应的数据电影信息查询服务通过对接
M
o
n
g
o
D
B
MongoDB
MongoDB实现对电影信息的查询操作电影评分部分通过获取用户通过
U
I
UI
UI给出的评分动作,后台服务进行数据库记录后,一方面将数据推送到
R
e
d
i
s
Redis
Redis中,另一方面,通过预设的日志框架输出到
T
o
m
c
a
t
Tomcat
Tomcat中的日志中项目通过
E
l
a
s
t
i
c
S
e
a
r
c
h
ElasticSearch
ElasticSearch实现对电影的模糊检索电影标签部分,项目提供用户对电影打标签服务
M o v i e Movie Movie
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| mid | Int | 电影的ID | |
| name | String | 电影的名称 | |
| descri | String | 电影的描述 | |
| timelong | String | 电影的时长 | |
| shoot | String | 电影拍摄时间 | |
| issue | String | 电影发布时间 | |
| language | String | 电影语言 | |
| genres | String | 电影所属类别 | |
| director | String | 电影的导演 | |
| actors | String | 电影的演员 |
R a t i n g Rating Rating
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| uid | Int | 用户的ID | |
| mid | Int | 电影的ID | |
| score | Double | 电影的分值 | |
| timestamp | Long | 评分的时间 |
T a g Tag Tag
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| uid | Int | 用户的ID | |
| mid | Int | 电影的ID | |
| tag | String | 电影的标签 | |
| timestamp | Long | 评分的时间 |
U s e r User User
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| uid | Int | 用户的ID | |
| username | String | 用户名 | |
| password | String | 用户密码 | |
| first | boolean | 用于是否第一次登录 | |
| genres | List | 用户偏爱的电影类型 | |
| timestamp | Long | 用户创建的时间 |
R a t e M o r e M o v i e s R e c e n t l y RateMoreMoviesRecently RateMoreMoviesRecently
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| mid | Int | 电影的ID | |
| count | Int | 电影的评分数 | |
| yeahmonth | String | 评分的时段 | 201507 |
R a t e M o r e M o v i e s RateMoreMovies RateMoreMovies
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| mid | Int | 电影的ID | |
| count | Int | 电影的评分数 |
A v e r a g e M o v i e s S c o r e AverageMoviesScore AverageMoviesScore
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| mid | Int | 电影的ID | |
| avg | Double | 电影的平均评分 |
M o v i e R e c s MovieRecs MovieRecs
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| mid | Int | 电影的ID | |
| recs | Array[(mid:Int,score:Double)] | 该电影最相似的电影集合 |
U s e r R e c s UserRecs UserRecs
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| uid | Int | 用户的ID | |
| recs | Array[(mid:Int,score:Double)] | 推荐给该用户的电影集合 |
S t r e a m R e c s StreamRecs StreamRecs
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| uid | Int | 用户的ID | |
| recs | Array[(mid:Int,score:Double)] | 实时推荐给该用户的电影集合 |
G e n r e s T o p M o v i e s GenresTopMovies GenresTopMovies
| 字段名 | 字段类型 | 字段描述 | 字段备注 |
|---|---|---|---|
| genres | String | 电影类型 | |
| recs | Array[(mid:Int,score:Double)] | TOP10电影 |
总结
这篇博文也终于结束了,这篇文章主要介绍的是整个系统的架构设计以及整个系统的数据流程和数据模型,只有设计好这些,整个系统的搭建才能比较顺利,后面就要真刀真枪的做整个系统了,下一篇文章会给大家带来项目的基础环境搭建!



