1、大数据技术之电商推荐系统尚硅谷大数据技术之电商推荐系统第 1 章 项目体系架构设计1.1项目系统架构项目以推荐系统建设领域知名的经过修改过的中文亚马逊电商数据集作为依 托,以某电商网站真实业务数据架构为基础,构建了符合教学体系的一体化的电商 推荐系统,包含了离线推荐与实时推荐体系,综合利用了协同过滤算法以及基于内 容的推荐方法来提供混合推荐。提供了从前端应用、后台服务、算法设计实现、平 台部署等多方位的闭环的业务实现。用户可视化:主要负责实现和用户的交互以及业务数据的展示,主体采用 AngularJS2 进行实现,部署在 Apache 服务上。综合业务服务: 主要实现 JavaEE 层面整体的
2、业务逻辑,通过 Spring 进行构建, 对接业务需求。部署在 Tomcat 上。数据存储部分】 责平台业务逻辑数据的存储。业务数据库: 项目采用广泛应用的文档数据库MongDB 作为主数据库,主要负缓存数据库: 项目采用 Redis 作为缓存数据库,主要用来支撑实时推荐系统部 分对于数据的高速获取需求。【离线推荐部分】离线统计服务: 批处理统计性业务采用 Spark Core + Spark SQL 进行实现,实 现对指标类数据的统计任务。离线推荐服务: 离线推荐业务采用 Spark Core + Spark MLlib 进行实现,采用 ALS 算法进行实现。【实时推荐部分】日志采集服务:
3、通过利用 Flume-ng 对业务平台中用户对于商品的一次评分行为 进行采集,实时发送到 Kafka 集群。消息缓冲服务: 项目采用 Kafka 作为流式数据的缓存组件,接受来自 Flume 的 数据采集请求。并将数据推送到项目的实时推荐系统部分。实时推荐服务: 项目采用 Spark Streaming 作为实时推荐系统,通过接收 Kafka 中缓存的数据,通过设计的推荐算法实现对实时推荐的数据处理,并将结构合并更 新到 MongoDB 数据库。1.2项目数据流程【系统初始化部分】0. 通过 Spark SQL将系统初始化数据加载到 MongoDB 中。 【离线推荐部分】1.可以通过 Azka
4、ban 实现对于离线统计服务以离线推荐服务的调度,通过设定的运行 时间完成对任务的触发执行。2.离线统计服务从 MongoDB 中加载数据,将【商品平均评分统计】、 【商品评分个数 统计】、【最近商品评分个数统计】三个统计算法进行运行实现,并将计算结果回 写到 MongoDB 中;离线推荐服务从 MongoDB 中加载数据, 通过 ALS算法分别将 【用 户推荐结果矩阵】、【影片相似度矩阵】回写到 MongoDB 中。【实时推荐部分】3.Flume 从综合业务服务的运行日志中读取日志更新,并将更新的日志实时推送到 Kafka 中; Kafka 在收到这些日志之后, 通过 kafkaStream
5、 程序对获取的日志信息进行 过滤处理,获取用户评分数据流【 UID|MID|SCORE|TIMESTAMP】,并发送到另外一 个 Kafka 队列; Spark Streaming 监听 Kafka 队列,实时获取 Kafka 过滤出来的用户评 分数据流,融合存储在 Redis 中的用户最近评分队列数据,提交给实时推荐算法, 完成对用户新的推荐结果计算;计算完成之后,将新的推荐结构和 MongDB 数据库 中的推荐结果进行合并。【业务系统部分】4.推荐结果展示部分, 从 MongoDB 中将离线推荐结果、 实时推荐结果、 内容推荐结果 进行混合,综合给出相对应的数据。5.商品信息查询服务通过对
6、接 MongoDB 实现对商品信息的查询操作。6.商品评分部分,获取用户通过 UI 给出的评分动作,后台服务进行数据库记录后,一 方面将数据推动到 Redis群中,另一方面,通过预设的日志框架输出到 Tomcat 中的日志中。7.商品标签部分,项目提供用户对商品打标签服务。1.3数据模型1. Product 【商品数据表】字段名字段类型字段描述字段备注productIdInt商品的 IDnameString商品的名称categoriesString商品所属类别每一项用“ |”分割imageUrlString商品图片的 URLtagsString商品的 UGC 标签每一项用“ |”分割2.Rat
7、ing 【用户评分表】字段名字段类型字段描述字段备注userIdInt用户的 IDproductIdInt商品的 IDscoreDouble商品的分值timestampLong评分的时间3. Tag【商品标签表】字段名字段类型字段描述字段备注userIdInt用户的 IDproductIdInt商品的 IDtagString商品的标签timestampLong评分的时间4. User 【用户表】字段名字段类型字段描述字段备注userIdInt用户的 IDusernameString用户名passwordString用户密码timestampLon0067用户创建的时间5. RateMorePr
8、oductsRecently 【最近商品评分个数统计表】字段名字段类型字段描述字段备注productIdInt商品的 IDcountInt商品的评分数yearmonthString评分的时段yyyymm6. RateMoreProducts 【商品评分个数统计表】字段名字段类型字段描述字段备注productIdInt商品的 IDcountInt商品的评分数7. AverageProductsScore 【商品平均评分表】字段名字段类型字段描述字段备注productIdInt商品的 IDavgDouble商品的平均评分8. ProductRecs 【商品相似性矩阵】字段名字段类型字段描述字段备
9、注productIdInt商品的 IDrecsArray(productId:Int,score:Double)该商品最相似的商品集合9. UserRecs 【用户商品推荐矩阵】字段 名字段类型字段描述字段备 注userIdInt用户的 IDrecsArray(productId:Int,score:Double)推荐给该用户的商品集合10. StreamRecs 【用户实时商品推荐矩阵】字段字段类型字段描述字段备名注userIdInt用户的 IDrecsArray(productId:Int,score:Double)实时推荐给该用户的商品集合第 2 章 工具环境搭建我们的项目中用到了多种工
10、具进行数据的存储、计算、采集和传输,本章主要 简单介绍设计的工具环境搭建。如果机器的配置不足,推荐只采用一台虚拟机进行配置,而非完全分布式,将 该虚拟机 CPU 的内存设置的尽可能大,推荐为 CPU 4 、 MEM 4GB2.1MongoDB (单节点)环境配置/ 通过 WGET 下载 Linux 版本的 MongoDB bigdatalinux $ wget https:/fastdl.mongodb.org/linux/mongodb-linux-x86 64-rhel62-3.4.3.tgz/ 将压缩包解压到指定目录 bigdatalinux backup$ tar -xf mongod
11、b-linux-x86_64-rhel62-3.4.3.tgz -C / / 将解压后的文件移动到最终的安装目录 bigdatalinux $ mv mongodb-linux-x86_64-rhel62-3.4.3/ /usr/local/mongodb/ 在安装目录下创建 data 文件夹用于存放数据和日志 bigdatalinux mongodb$ mkdir /usr/local/mongodb/data/ / 在 data 文件夹下创建 db 文件夹,用于存放数据 bigdatalinux mongodb$ mkdir /usr/local/mongodb/data/db/ / 在
12、data 文件夹下创建 logs 文件夹,用于存放日志 bigdatalinux mongodb$ mkdir /usr/local/mongodb/data/logs/ 在 logs 文件夹下创建 log 文件bigdatalinux mongodb$ touch /usr/local/mongodb/data/logs/ mongodb.log/ 在 data 文件夹下创建 mongodb.conf 配置文件 bigdatalinux mongodb$ touch /usr/local/mongodb/data/mongodb.conf/ 在 mongodb.conf 文件中输入如下内容
13、bigdatalinux mongodb$ vim ./data/mongodb.conf#端口号 port = 27017#数据目录dbpath = /usr/local/mongodb/data/db#日志目录logpath = /usr/local/mongodb/data/logs/mongodb.log#设置后台运行 fork = true# 日志输出方式 logappend = true#开启认证#auth = true完成 MongoDB 的安装后,启动 MongoDB 服务器:/ 启动 MongoDB 服务器bigdatalinux mongodb$ sudo /usr/loc
14、al/mongodb/bin/mongod -config /usr/local/mongodb/data/mongodb.conf/ 访问 MongoDB 服务器bigdatalinux mongodb$ /usr/local/mongodb/bin/mongo/ 停止 MongoDB 服务器bigdatalinux mongodb$ sudo /usr/local/mongodb/bin/mongod -shutdown -config /usr/local/mongodb/data/mongodb.conf2.2Redis (单节点)环境配置/ 通过 WGET 下载 REDIS 的源码b
15、igdatalinux $wget http:/download.redis.io/releases/redis-4.0.2.tar.gz/ 将源代码解压到安装目录bigdatalinux $ tar -xf redis-4.0.2.tar.gz -C / 进入 Redis 源代码目录,编译安装bigdatalinux $ cd redis-4.0.2/ 安装 GCCbigdatalinux $ sudo yum install gcc/ 编译源代码bigdatalinux redis-4.0.2$ make MALLOC=libc/ 编译安装bigdatalinux redis-4.0.2$
16、 sudo make install/ 创建配置文件bigdatalinux redis-4.0.2$ sudo cp /redis-4.0.2/redis.conf/etc/ 修改配置文件中以下内容bigdatalinux redis-4.0.2$ sudo vim /etc/redis.conf daemonize yes #37 行 #是否以后台 daemon 方式运行,默认不是后台运行 pidfile /var/run/redis/redis.pid #41 行 #redis 的 PID 文件路径(可选) bind 0.0.0.0 #64 行 #绑定主机 IP ,默认值为 127.0.
17、0.1 ,我们是跨机器运行,所 以需要更改logfile /var/log/redis/redis.log #104 行 #定义 log 文件位置,模式 log 信息定向到 stdout ,输出到 /dev/null (可选)dir “/usr/local/rdbfile ” #188 行 #本地数据库存放路径,默认为 ./ ,编译安装默认存在在 /usr/local/bin 下(可选)在安装完 Redis 之后,启动 Redis/ 启动 Redis 服务器bigdatalinux redis-4.0.2$ redis-server /etc/redis.conf / 连接 Redis 服务器
18、bigdatalinux redis-4.0.2$ redis-cli/ 停止 Redis 服务器bigdatalinux redis-4.0.2$ redis-cli shutdown2.3Spark (单节点)环境配置/ 通过 wget 下载 zookeeper 安装包bigdatalinux $ wget / 将 spark 解压到安装目录bigdatalinux $ tar xf spark-2.1.1-bin-hadoop2.7.tgz C ./cluster/ 进入 spark 安装目录bigdatalinux cluster$ cd spark-2.1.1-bin-hadoop2
19、.7/ 复制 slave 配置文件bigdatalinux spark-2.1.1-bin-hadoop2.7$ cp ./conf/slaves.template ./conf/slaves / 修改 slave 配置文件bigdatalinux spark-2.1.1-bin-hadoop2.7$ vim ./conf/slaves linux #在文件最后将本机主机名进行添加cp ./conf/spark-env.sh.template ./conf/s#添加 spark master 的主机名#添加 spark master 的端口号/ 复制 Spark-Env 配置文件 bigdat
20、alinux spark-2.1.1-bin-hadoop2.7$ park-env.sh SPARK_MASTER_HOST=linux SPARK_MASTER_PORT=7077安装完成之后,启动 Spark / 启动 Spark 集群bigdatalinux spark-2.1.1-bin-hadoop2.7$ sbin/start-all.sh/ 访问 Spark 集群,浏览器访问 http:/linux:8080/ 关闭 Spark 集群bigdatalinux spark-2.1.1-bin-hadoop2.7$ sbin/stop-all.sh2.4Zookeeper (单节点
21、)环境配置/ 通过 wget 下载 zookeeper 安装包bigdatalinux $ wget -3.4.10.tar.gz/ 将 zookeeper 解压到安装目录bigdatalinux $ tar xf zookeeper-3.4.10.tar.gz C ./cluster/ 进入 zookeeper 安装目录bigdatalinux cluster$ cd zookeeper-3.4.10/ 创建 data 数据目录bigdatalinux zookeeper-3.4.10$ mkdir data/ 复制 zookeeper 配置文件bigdatalinux zookeeper-
22、3.4.10$ cp ./conf/zoo_sample.cfg ./conf/zoo.cfg / 修改 zookeeper 配置文件bigdatalinux zookeeper-3.4.10$ vim conf/zoo.cfg dataDir=/home/bigdata/cluster/zookeeper-3.4.10/data # 将数据目录地址修 改为创建的目录/ 启动 Zookeeper 服务bigdatalinux zookeeper-3.4.10$ bin/zkServer.sh start/ 查看 Zookeeper 服务状态bigdatalinux zookeeper-3.4.
23、10$ bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /home/bigdata/cluster/zookeeper-3.4.10/bin/./conf/zoo.cfgMode: standalone/ 关闭 Zookeeper 服务bigdatalinux zookeeper-3.4.10$ bin/zkServer.sh stop2.5Flume-ng (单节点)环境配置/ 通过 wget 下载 zookeeper 安装包 bigdatalinux $ wget http:/www.apache.or
24、g/dyn/closer.lua/flume/1.8.0/apache-flume-1.8.0- bin.tar.gz/ 将 zookeeper 解压到安装目录bigdatalinux $ tar xf apache-flume-1.8.0-bin.tar.gz C ./cluster/ 等待项目部署时使用2.6Kafka (单节点)环境配置/ 通过 wget 下载 zookeeper 安装包bigdatalinux $ wget 0.10.2.1/kafka_2.11-0.10.2.1.tgz / 将 kafka 解压到安装目录bigdatalinux $ tar xf kafka_2.12
25、-0.10.2.1.tgz C ./cluster/ 进入 kafka 安装目录bigdatalinux cluster$ cd kafka_2.12-0.10.2.1/ 修改 kafka 配置文件bigdatalinux kafka_2.12-0.10.2.1$ vim config/server.properties host.name=linux #修改主机名port=9092 #修改服务端口号zookeeper.connect=linux:2181 #修改 Zookeeper 服务器地址/ 启动 kafka 服务 ! 启动之前需要启动 Zookeeper 服务bigdatalinux
26、kafka_2.12-0.10.2.1$ bin/kafka-server-start.sh-daemon ./config/server.properties/ 关闭 kafka 服务bigdatalinux kafka_2.12-0.10.2.1$ bin/kafka-server-stop.sh/ 创建 topicbigdatalinux kafka_2.12-0.10.2.1$ bin/kafka-topics.sh -create-zookeeper linux:2181 -replication-factor 1 -partitions 1 -topic recommender/
27、kafka-console-producerbigdatalinux kafka_2.12-0.10.2.1$ bin/kafka-console-producer.sh-broker-list linux:9092 -topic recommender/ kafka-console-consumerbigdatalinux kafka_2.12-0.10.2.1$ bin/kafka-console-consumer.sh-bootstrap-server linux:9092 -topic recommender第 3章 创建项目并初始化业务数据我们的项目主体用 Scala 编写,采用 I
28、DEA 作为开发环境进行项目编写,采用 maven 作为项目构建和管理工具。3.1在 IDEA 中创建 maven 项目打开 IDEA ,创建一个 maven 项目,命名为 ECommerceRecommendSystem 。为 了方便后期的联调,我们会把业务系统的代码也添加进来,所以我们可以以ECommerceRecommendSystem 作为父项目,并在其下建一个名为 recommender 的子 项目,然后再在下面搭建多个子项目用于提供不同的推荐服务。3.1.1项目框架搭建在 ECommerceRecommendSystem新建一个maven module 作为子项目,命名maven module 作DataLoader 。为 recommender 。同样的,再以 recommender 为父项目,新建一个 为子项目。我们的第一步是初始化业务数据,所以子项目命名为父项目只是为了规范化项目结构,方便依赖管理,本身是不需要代码实现的,所以 ECommerceRecommendSystem 和 recommender 下的 src 文件夹都可以删掉。目前的整体项目框架如下:3.1.2声明项目中工具的版本信息我们整个项目需要用到多个工具, 它们的不同版本可能会对程序运行造成影响, 所以应该在最外层的 ECommerceRecommendSy
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1