项目以推荐系统建设领域知名的经过修改过的
M
o
v
i
e
L
e
n
s
MovieLens
MovieLens数据集作为依托,构建了整个电影推荐系统,包含了离线推荐与实时推荐体系,综合利用了协同过滤算法以及基于内容的推荐方法来提供混合推荐。提供了从前端应用、后台服务构建、算法设计实现、平台部署等多方位的闭环的业务实现
1.1 后台服务部分
用户可视化:主要负责实现和用户的交互以及业务数据的展示,主体采用
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上
1.2 数据存储部分
业务数据库:项目采用广泛应用的文档数据库
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作为缓存服务器,主要用来支撑实时推荐系统部分对于数据的高速获取需求
1.3 离线推荐部分
离线统计服务:批处理统计性业务采用
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进行任务的调度
1.4 实时推荐部分
日志采集服务:通过利用
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数据库
二、数据流程
2.1 系统初始化部分
通过
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中
2.2 离线推荐部分
通过
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中
2.3 实时推荐部分
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数据库中的推荐结果进行合并
2.4 业务系统部分
推荐结果展示部分从
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实现对电影的模糊检索
电影标签部分,项目提供用户对电影打标签服务
三、数据模型
3.1 电影数据表
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
电影的演员
3.2 用户评分表
R
a
t
i
n
g
Rating
Rating
字段名
字段类型
字段描述
字段备注
uid
Int
用户的ID
mid
Int
电影的ID
score
Double
电影的分值
timestamp
Long
评分的时间
3.3 电影标签表
T
a
g
Tag
Tag
字段名
字段类型
字段描述
字段备注
uid
Int
用户的ID
mid
Int
电影的ID
tag
String
电影的标签
timestamp
Long
评分的时间
3.4 用户表
U
s
e
r
User
User
字段名
字段类型
字段描述
字段备注
uid
Int
用户的ID
username
String
用户名
password
String
用户密码
first
Boolean
用于是否第一次登录
genres
List
用户偏爱的电影类型
timestamp
Long
用户创建的时间
3.5 最近电影评分个数统计表
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
电影的评分数
yearmonth
String
评分的时段
201507
3.6 电影评分个数统计表
R
a
t
e
M
o
r
e
M
o
v
i
e
s
RateMoreMovies
RateMoreMovies
字段名
字段类型
字段描述
字段备注
mid
Int
电影的ID
count
Int
电影的评分数
3.7 电影平均评分表
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
电影的平均评分
3.8 电影相似性矩阵表
M
o
v
i
e
R
e
c
s
MovieRecs
MovieRecs
字段名
字段类型
字段描述
字段备注
mid
Int
电影的ID
recs
Array[(mid:Int,score:Double)]
该电影最相似的电影集合
3.9 用户电影推荐矩阵表
U
s
e
r
R
e
c
s
UserRecs
UserRecs
字段名
字段类型
字段描述
字段备注
uid
Int
用户的ID
recs
Array[(mid:Int,score:Double)]
推荐给该用户的电影集合
3.10 用户实时电影推荐矩阵表
S
t
r
e
a
m
R
e
c
s
StreamRecs
StreamRecs
字段名
字段类型
字段描述
字段备注
uid
Int
用户的ID
recs
Array[(mid:Int,score:Double)]
实时推荐给该用户的电影集合
3.11 电影类别
T
o
p
10
Top10
Top10表
G
e
n
r
e
s
T
o
p
M
o
v
i
e
s
GenresTopMovies
GenresTopMovies