目录
1.StatisticsRecommender-统计数据模块项目创建
3.OfflineRecommender-离线推荐模块项目创建
1.StreamingRecommender-实施推荐模块项目建立
一、项目概述
1、项目简介
此次推荐系统项目跟随B站尚硅谷大数据项目教程实现,在学习推荐系统的过程中结合大数据技术做一个完整的项目
2、项目使用技术
Flume日志采集、kafka消息缓冲、spark、mongoDB业务数据库、redis缓存数据库、ElasticSearch搜索服务器,在此次项目中主要使用以上技术,可视化技术与综合业务服务技术不做深入实现研究。
3、项目系统框架
二、数据简介
1、数据来源
此次项目所需要的数据名称为 moviceLen ,是推荐系统中所使用到的典型数据集,数据来源于一个网站专门提供的免费数据https://grouplens.org/datasets/movielens/
2、数据概览
字段名 | 字段类型 | 字段描述 |
mid | Int | 电影的 ID |
name | String | 电影的名称 |
descri | String | 电影的描述 |
timelong | String | 电影的时长 |
shoot | String | 电影拍摄时间 |
issue | String | 电影发布时间 |
language | String | 电影语言 |
genres | String | 电影所属类别 |
director | String | 电影的导演 |
actors | String | 电影的演员 |
表 2‑1 电影数据表
字段名 | 字段类型 | 字段描述 |
uid | Int | 用户的 ID |
mid | Int | 电影的 ID |
score | Double | 电影的分值 |
timestamp | Long | 评分的时间 |
表 2‑2 用户评分表
三、环境搭建
1、ElasticSearch-head安装
1)插件安装
地址: liufengji/es-head (github.com)
拖拽不成功参照csdn博客
Google浏览器 安装 Elasticsearch-head 插件_打工人很惨的博客-CSDN博客_elasticsearch head谷歌插件
检查安装结果
2)linux下单节点安装
[root@ha-01 software]#
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.tar.gz
3)修改linux配置文件
ElasticSearch单节点环境配置_sebeefe的博客-CSDN博客_elasticsearch单节点配置
[root@ha-01 ~]# vi /etc/security/limits.conf
[root@ha-01 ~]# vi /etc/security/limits.d/20-nproc.conf
[root@ha-01 ~]# vi /etc/sysctl.conf
[root@ha-01 ~]# sysctl -p
4)解压安装
[root@ha-01 software]# tar -xf elasticsearch-5.6.2.tar.gz -C /export/servers/cluster
[root@ha-01 elasticsearch-5.6.2]# mkdir data/
[root@ha-01 elasticsearch-5.6.2]# mkdir logs/
5)修改配置文件
[root@ha-01 elasticsearch-5.6.2]# vi config/elasticsearch.yml
6)启动ElasticSearch
Caused by: java.lang.RuntimeException: can not run elasticsearch as root_liang墨竹的博客-CSDN博客
创建一个新用户切换到非root用户才能启动
新用户 elsearch
密码 123456
2、Mongodb单节点安装
1)Wget下载
[root@ha-01 ~]#
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.3.tgz
2)解压
[root@ha-01 software]# tar -xf mongodb-linux-x86_64-rhel62-3.4.3.tgz -C /export/servers/
3)创建文件夹
data目录下文件夹用于存放数据和日志
在 data 文件夹下创建 db 文件夹,用于存放数据
在 data 文件夹下创建 logs 文件夹,用于存放日志
4)创建配置文件
[root@ha-01 logs]# touch mongodb.log
[root@ha-01 logs]#
touch /export/servers/mongodb-linux-x86_64-rhel62-3.4.3/data/mongodb.conf
5)配置文件添加信息
mongodb.conf文件
#端口号 port = 27017
#数据目录
dbpath = /export/servers/mongodb-linux-x86_64-rhel62-3.4.3/data/db
#日志目录
logpath = /export/servers/mongodb-linux-x86_64-rhel62-3.4.3/data/logs/mongodb.log
#设置后台运行
fork = true
#日志输出方式
logappend = true
#开启认证
#auth = true
6)启动mongodb服务器
[root@ha-01 mongodb]# sudo /export/servers/mongodb/bin/mongod
-config /export/servers/mongodb/data/mongodb.conf
7)访问mongodb
[root@ha-01 mongodb]# bin/mongo
8)停止mongodb服务器
[root@ha-01 mongodb]# sudo bin/mongod -shutdown
-config /export/servers/mongodb/data/mongodb.conf
3、Redis单节点安装
1)下载解压
[root@ha-01 software]# wget http://download.redis.io/releases/redis-4.0.13.tar.gz
[root@ha-01 software]# tar -xf redis-4.0.13.tar.gz -C /export/servers/
2)编译安装
进入 Redis 源代码目录,安装 GCC,编译安装
[root@ha-01 redis-4.0.13]# yum install gcc
[root@ha-01 redis-4.0.13]# make MALLOC=libc
[root@ha-01 redis-4.0.13]# sudo make install
3)创建并修改配置文件
[root@ha-01 redis-4.0.13]# sudo cp redis.conf /etc/
[root@ha-01 redis-4.0.13]# vi /etc/redis.conf
4)启动redis
[root@ha-01 redis-4.0.13]# redis-server /etc/redis.conf
[root@ha-01 redis-4.0.13]# redis-cli
[root@ha-01 redis-4.0.13]# redis-cli shutdown
4、Spark单节点安装
1)下载解压安装包
[root@ha-01 software]#
wget https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.7.tgz
[root@ha-01 software]# tar -xf spark-2.1.1-bin-hadoop2.7.tgz -C /export/servers/cluster/
2)配置单点spark环境
复制 slave 配置文件修改
[root@ha-01 spark-2.1.1-bin-hadoop2.7]# cp ./conf/slaves.template ./conf/slaves
复制Spark-Env 配置文件修改
[root@ha-01 conf]# cp ./conf/spark-env.sh.template ./conf/spark-env.sh
3)启动sparkWebui查看
[root@ha-01 spark-2.1.1-bin-hadoop2.7]# sbin/start-all.sh
5、Azkaban单节点配置
1)下载azkaban资源包
[root@ha-01 ~]# yum install git
[root@ha-01 software]# sudo git config --global http.postBuffer 5242880000
[root@ha-01 software]# git clone GitHub - azkaban/azkaban: Azkaban workflow manager.
切换版本
[root@ha-01 servers]# cd azkaban/
[root@ha-01 azkaban]# git checkout -b 3.36.0
2)配置
安装编译环境
[root@ha-01 azkaban]# yum install -y gcc-c++*
执行编译命令
[root@ha-01 azkaban]# ./gradlew clean build
3)部署Azkaban Solo
将编译好的 azkaban 中的 azkaban-solo-server-3.36.0.tar.gz 拷贝到根目录
解压 azkaban-solo-server-3.36.0.tar.gz 到安装目录
4)编译Azkaban Solo
编译
[root@ha-01 azkaban]# ./gradlew build -x test
[root@ha-01 azkaban]# cp
azkaban-solo-server/build/distributions/azkaban-solo-server-3.91.0-329-g98d70e0.tar.gz /export/software/
[root@ha-01 azkaban]# tar -xf
/export/software/azkaban-solo-server-3.91.0-329-g98d70e0.tar.gz
-C /export/servers/cluster/
5)启动服务
[root@ha-01 azkaban-solo-server-3.91.0-329-g98d70e0]# bin/start-solo.sh
6、zookeeper单节点安装
1)下载解压
[root@ha-01 software]# tar -xf zookeeper-3.4.10.tar.gz -C /export/servers/cluster/
2)配置环境
创建data目录
[root@ha-01 zookeeper-3.4.10]# mkdir data/
修改配置文件
[root@ha-01 zookeeper-3.4.10]# cp ./conf/zoo_sample.cfg ./conf/zoo.cfg
3)启动zookeeper
7、 Flume、kafka安装
1)flume-ng单节点配置
安装包获取解压
[root@ha-01 software]# wget
http://www.apache.org/dyn/closer.lua/flume/1.8.0/apache-flume-1.8.0-bin.tar.gz --no-check-certificate
[root@ha-01 software]# tar -zvxf apache-flume-1.8.0-bin.tar.gz -C /export/servers/cluster/
2)kafka单点配置
安装包上传解压
[root@ha-01 software]# tar -zvxf kafka_2.11-0.10.2.1.tgz -C /export/servers/cluster/
配置文件
启动kafka(启动前需要先启动zookeeper)
[root@ha-01 zookeeper-3.4.10]# bin/zkServer.sh start
[root@ha-01 kafka_2.11-0.10.2.1]#
bin/kafka-server-start.sh -daemon ./config/server.properties
关闭kafka
[root@ha-01 kafka_2.11-0.10.2.1]#
bin/kafka-server-stop.sh -daemon ./config/server.properties
8、开发环境搭建(idea)
1)项目框架搭建
2)prom依赖管理
父项目的prom文件
引入共同的日志管理工具
引入公有插件
Recommender的prom文件
DataLocader的prom文件
四、数据加载部分
1、DataLoader-加载数据模块项目
1)项目目录
2)项目依赖
2、Mongodb加载数据
1)定义样例类
2) 定义参数配置
3)编程实现数据处理与写入
4)远程写入mongodb
可以看见数据已经成功加载
2.ElasticSearch加载数据
1)数据预处理
2)编程实现数据写入
3)查看数据是否加载成功
五.基于LMF离线推荐部分
1.StatisticsRecommender-统计数据模块项目创建
1)项目目录
2)项目依赖
2.离线数据统计
1)历史热门统计
2)最近热门统计
3)电影平均得分
4)每个类别优质电影统计
3.OfflineRecommender-离线推荐模块项目创建
1)项目目录
2)项目依赖
4.基于隐语义的协调过滤推荐
项目采用 ALS 作为协同过滤算法,分别根据 MongoDB 中的用户评分表和电影 数据集计算用户电影推荐矩阵以及电影相似度矩阵
1)用户电影推荐矩阵
通过 ALS 训练出来的 Model 来计算所有当前用户电影的推荐矩阵,主要思路为:
1. UserId 和 MovieID 做笛卡尔积,产生(uid,mid)的元组
2. 通过模型预测(uid,mid)的元组。
3. 将预测结果通过预测分值进行排序。
4. 返回分值最大的 K 个电影,作为当前用户的推荐。
最后生成的数据保存到 MongoDB 的 UserRecs 表中
编码实现:
2)电影相似度矩阵
编码实现
5. ALS模型参数选择-隐语义
1)ALS模型参数选择概念
als算法参数_推荐算法之ALS_钟离舟的博客-CSDN博客
RMSE(均方根误差)、MSE(均方误差)、MAE(平均绝对误差)、SD(标准差)_敲代码的quant的博客-CSDN博客_rmse
上述模型训练的过程中,我们直接给定了隐语义模型的 rank,iterations,lambda 三个参数。对于我们的模型,这并不一定是最优的参数选取,所以我们需要对模型 进行评估。通常的做法是计算均方根误差(RMSE),考察预测评分与实际评分之 间的误差。有了 RMSE,我们可以就可以通过多次调整参数值,来选取 RMSE 最小的一组 作为我们模型的优化选择。
2)编写代码
六、实现推荐部分
1.StreamingRecommender-实施推荐模块项目建立
1)项目目录
2)项目依赖
2.实施推荐部分算法
实时推荐算法的前提: 在 Redis 集群中存储了每一个用户最近对电影的 K 次评分。实时算法可以 快速获取。 离线推荐算法已经将电影相似度矩阵提前计算到了 MongoDB 中。 Kafka 已经获取到了用户实时的评分数据。
实时推荐算法输入为一个评分,而执行的核心 内容包括:获取 userId 最近 K 次评分、获取 movieId 最相似 K 个电影、计算候选 电影的推荐优先级、更新对 userId 的实时推荐结果。
1)数据连接环境
mongodb连接
Redies连接
kafka连接
2)测试kafka环境是否连通
创建主题
[root@ha-01 kafka_2.11-0.10.2.1]#
bin/kafka-topics.sh --create --zookeeper ha-01:2181 --replication-factor 1 --partitions 1 --topic recommender
启动消费者生产者
生产者
[root@ha-01 kafka_2.11-0.10.2.1]#
bin/kafka-console-producer.sh --broker-list ha-01:9092 --topic recommender
消费者
[root@ha-01 kafka_2.11-0.10.2.1]#
bin/kafka-console-consumer.sh --bootstrap-server ha-01:9092 --topic recommender
自身流通性测试
自身流通性无误
与程序流通性
3)推荐算法编程
获取用户的k次最近评分
获取当前电影最相似的 K 个电影
电影推荐优先级计算
4)程序运行
1|1271|4.5|1554276432
2|10|4.0|835355493
5)mongodb查看推荐结果
七、基于内容的推荐模块
1.ContentRecommender项目建立
1)项目目录
2)项目依赖
2.特征工程的选取
将标签内容进行提取,得到电影的内容特征向量,进 而可以通过求取相似度矩阵。这部分可以与实时推荐系统直接对接,计算出与用户 当前评分电影的相似电影,实现基于内容的实时推荐,通过 TF-IDF 算法对标签的权重进行调整,从而尽可能地接近 用户偏好。
1)代码实现
2)得出特征向量结果
3.编码实现基于内容的推荐模块
1)得到特征矩阵
2)基于内容推荐
3)mongodb查看结果
八、 项目总结
1.项目可视化问题
经过我的研究,在mongodb中得到的数据都可以使用springboot微服务结合网页EChars进行可视化,尝试着新建了一个子项目专门用于表的可视化,以下为项目目录结构。
MoviesController
使用注解的形式构建网页父域子域
Movies
@Document("RateMoreMovies"),这个注解的意思就是连接数据库中指定的表
MoviesService
最后可以在网页中获取数据
对获取到的json数据可以灵活使用EChars进行可视化,但是由于时间关系,获取到数据后的可视化就没有继续进行了,但是已经可以充分实现。
2.项目实时系统联调问题
在尚硅谷的视频中有提到后台业务系统,业务系统连接flume日志采集传入kafka做sparkstreaming处理,过程中使用azkaban调度,在本项目中flume和azkaban的业务环境其实已经搭好,但是由于时间关系,没有太多时间进行程序的部署和运行。
因此业务后台与前端项目不做跟进与展示。
3.学习总结
此次项目其实是参照尚硅谷的学习视频一步一步做下来的,其实属于站在前人的肩膀上看世界,没有用熟悉的python语言去做,是因为作为大数据的学生最终走向的岗位还是后端偏多一些,java作为必不可少的语言其实在这几年的学习中已经略显生疏了。
秋招将临,而八股和基础mysql和java反而还不太熟练,这无疑在秋招是竞争不过别人的,所以我萌生出了此次推荐系统使用大数据处理的方式,linux操作系统下重新搭建这些环境,并且使用spark,这学期刚学的进行数据处理。最后呈现出来的实验报告就是上文这些。
历时一周,有因为基础问题跑不出代码,无法理解底层机制,也有想创新但是没有时间充分实现,总而言之这次项目意义非凡,希望后续有时间可以接着完善。
我是个理想主义,我的学习,进步不想仅仅只是因为培养方案的倒逼,而是我愿意投身于学习进步的知识海洋,哲文政史、公式建模、代码编写,我喜欢吸收一切的知识,我也坚信在这短暂的一生中,大概率逃脱不了普通人命运的我,依旧会产生自己的价值。
勿忘昨日的苦难辉煌,无愧今天的使命担当,不负明天的伟大梦想。共勉。
九、完整项目代码
jiangjiang913/Recommendation-system: 消费者行为分析-推荐系统 (github.com)