【新鲜出炉的个人项目】基于 Flink 的商品推荐系统
FlinkCommodityRecommendationSystem
Recs FlinkCommodityRecommendationSystem(基于 Flink 的商品推荐系统)
1. 前言
系统取名为 Recs
,灵感源于 Recommendation System
。logo 使用在线 logo 网站制作。
作者开发该项目,是为了学习 Flink
以及相关大数据中间件。出于展示目的,使用 Springboot + Vue 开发了配套的 web。
作者有过 python + django + JavaScript 的 web 开发的经历,考虑到项目使用 java 开发,为了技术栈的统一,现学了 Springboot 框架以及 Vue。
本项目借鉴了 ECommerceRecommendSystem 开源学习项目,前端部分借鉴较多,在作者搭建好的框架基础上进行优化。修改了 ui 以及部分 bug,并且新增部分功能。
经过本项目的开发锻炼,作者对大数据相关的技术有了较为系统的理解,收获较大。在开发过程中,遇到过很多问题,但都逐一攻克了。作者的经验是,解决问题最好的办法就是阅读官方文档和积极使用 Google。
最后,相关的技术都是现学现用,知识比较片面,因此本项目存在很多待优化的地方,欢迎大家 issue,一起学习,一起进步。
2. 项目简介
2.1 Recs 系统架构
系统主要工作流程:
用户登录/注册系统。
用户对商品进行评分。
评分数据通过 Kafka 发送到推荐模块的实时推荐任务中。
系统执行实时推荐任务,并且将数据存储到 hbase 的 rating 和 userProduct 表中。实时任务包括:实时 topN 以及 基于用户行为推荐。
实时 topN 将计算结果存储到 hbase 的 onlineHot 表中,基于用户行为推荐将计算结果存储到 hbase 的表 onlineRecommend 中。
web 端通过查询 hbase 获取相关模块所需数据并展示结果。
2.2 首页
共有四个模块:
- 猜你喜欢:基于用户行为推荐,当用户对商品进行评分时,Flink 根据用户历史评分商品,结合 itemCF 计算推荐结果。
- 热门商品:历史热门商品
- 好评商品:评分较高的商品
- 实时热门商品: 使用 Flink 时间滑动窗口,对过去一个小时热门商品进行统计,每 5 分钟滑动一次。
2.3 商品详情
展示商品详细信息
看过该商品的人还看了:基于 itemCF 进行推荐
2.4 登录
3. 模块说明
3.1 推荐模块 (recommendation)
开发环境: IDEA + Maven + git + windows && wsl
软件架构:flink + hbase + kafka + mysql + redis
开发指导: flink 的计算任务都存放在 task 包下,DataLoader 为加载数据任务,OfflineRecommender 为离线推荐任务, OnlineRecommender 为实时推荐任务。以模块为单位阅读代码。
3.1.1 猜你喜欢
实时推荐:
- 从 redist 中查询用户最近评分商品列表 , redis key 为
“ONLINE_PREFIX_” + userId
- 从 hbase 表
userProduct
中查询用户历史评分商品列表。 - 根据用户刚评分的
productId
从 hbase 表itemCFRecommend
表中查询相关的商品列表 - 对相关商品列表根据之前查出的最近评分商品列表和历史评分商品列表过滤。
- 根据最近评分商品与本次商品的相似度以及用户历史评分对推荐商品重新排序。
3.1.2 热门商品
对所有时间用户评分的商品根据评分次数进行逆序排序,选出热门商品。
- flink 将 hbase
rating
表加载到内存中,根据 productId group,并且统计出现次数 - 根据出现次数逆序排序。
3.1.3 好评商品
根据商品评分均分逆序排序,
3.1.4 实时热门商品
采用 flink timeWindow
对过去一个小时的数据进行排序,选出热门的商品。时间窗口每五分钟滑动一次。
3.1.5 看过该商品的人还看了
基于物品推荐 (itemCF)
3.1.6 数据装载模块
消费 kafka topic 为 rating
的数据,并且将数据存储到 hbase rating
表中,为了保证数据的唯一性rowKey
格式为:
userId_productId_timestamp
3.2 后端 (recommend_backend)
开发环境: IDEA + Maven + git + windows && wsl(ubuntu 20.4)+ postwomen
技术架构: Springboot + hibernate + mysql + hbase
开发指导: Controller 模块是后端的核心,从 restFul api 入手。
项目架构:
3.3 前端 (recommend_front)
开发环境: VScode + nodejs + windows && wsl
技术架构: Vue + typescript + element-ui
4. 开发运行步骤
4.1 环境搭建
- mysql
- hbase
- flink
- redis
- kafka
- zookeeper
4.2 创建数据表
- mysql
共有两张表,一个是 product
用于存储商品的详细信息,另一个是 user
用于存储用户信息。
建表 sql 脚本在 recommendation/src/main/resources/mysql.sql
中
hbase
- rating
- userProduct
- itemCFRecommend
- goodProducts
- historyHotProducts
- onlineRecommend
- onlineHot
建表语句在 recommendation/src/main/resources/hbase.txt
中
4.3 数据入库
商品信息存储在recommendation/src/main/resources/product.csv
文件里,我们运行一个 flink 任务将数据装载到 mysql 中。对应的表是我们之前创建的 product
表
- 启动 flink ,运行
recommendation/.../task/DataLoader/DataLoaderTask.java
- 商品信息存储到 mysql 中
4.4 启动开发环境
- 执行启动脚本
启动脚本是为了一键启动之前部署的 hbase、kafka、flink、redis、zookeeper 等
为了方便开发,作者写了启动和停止环境的 shell 脚本,在 recommendation/main/resources
目录下,分别为 startAll.sh 和 stopAll.sh
- 启动 springboot 后端项目
- 启动 vue 前端
- 启动实时推荐任务
- 离线任务定时启动
最后,作者正在经历2020秋招,如果您觉得本项目不错,欢迎给个 star!
【新鲜出炉的个人项目】基于 Flink 的商品推荐系统的更多相关文章
- 新鲜出炉的30个精美的 jQuery & CSS3 效果【附演示和教程】
新鲜出炉的30个精美的 jQuery & CSS3 效果[附演示和教程] 作为最流行的 JavaScript 开发框架,jQuery 在现在的 Web 开发项目中扮演着重要角色,它简化了 ...
- 20个新鲜出炉的网站模板【HTML & PSD】
这里给大家分享20 个新鲜出炉的免费网站模板.这些设计元素将成为你下一个项目的重要素材,可以帮你节省很多的时间.与往常一样,我们经常漫游网络,寻找最好的资源, HTML.CSS 和 PSD 等等,记得 ...
- Onsen UI – 新鲜出炉的 PhoneGap 界面框架
Onsen UI 是一个基于元素自定义的 HTML5 UI 框架,用于构建你的移动前端.这个一个基于 Web 组件的概念的框架,让构建应用程序变得更加轻松.Onsen UI 专门针对 PhoneGap ...
- 微信小程序开发视频教程新鲜出炉
微信小程序开发公测了,可是对于新手来说,不同的框架不同的开发机制,如何快速适应呢?微信小程序开发视频教程新鲜出炉了,从零开始一步一步搭建微信小程序,每个章节都会涉及到不同的知识点,等教程学习完你不但掌 ...
- 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面.
刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面.
- 23套新鲜出炉的网站和手机界面 PSD 素材
Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面.这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型. 在这篇文章 ...
- 22套新鲜出炉的 Web & Mobile PSD 用户界面素材
在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件.这些线框图和 UI 设计工具包让设计师在设计用户界面原型的时候能够非常便利. Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这 ...
- 分享25个新鲜出炉的 Photoshop 高级教程
网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...
- PS教程:20个新鲜出炉的 Photoshop 中级教程
Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享最新20个 Photoshop 进阶教程,提高你的图片处理技巧,制作时尚的效果.这些教程可以帮助把你的想法 ...
随机推荐
- PHP is_scalar() 函数
is_scalar() 函数用于检测变量是否是一个标量.高佣联盟 www.cgewang.com 标量变量是指那些包含了 integer.float.string 或 boolean 的变量,而 ar ...
- 《Python与量化投资:从基础到实战》PDF高清完整版-PDF|网盘下载附提取码
本书主要讲解如何利用Python进行量化投资,包括对数据的获取.整理.分析挖掘.信号构建.策略构建.回测.策略分析等.本书也是利用Python进行数据分析的指南,有大量的关于数据处理分析的应用,并将重 ...
- PV与UV你的网站也可以
个人博客网站分析 阅读前面的文章,有助于理解本文. 1.是时候来一个个人博客网站了 2.什么?你还没有自己的域名? 3.你的个人博客网站该上线了! 为什么需要流量分析? 各位小伙伴,请看下图,你们发现 ...
- 服务消费者(RestTemplate+Ribbon+feign)
负载均衡 spring cloud 体系中,我们知道服务之间的调用是通过http协议进行调用的.注册中心就是维护这些调用的服务的各个服务列表.在Spring中提供了RestTemplate,用于访 ...
- CSS样式大全(网络收集整理)
CSS样式大全(网络收集整理 字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 { ...
- Chrome-AdGuard 无与伦比的广告拦截扩展
一款无与伦比的广告拦截扩展,对抗各式广告与弹窗. AdGuard 广告拦截器可有效的拦截所有网页上的所有类型的广告,甚至是在 Facebook.Youtube 以及其他万千网站上的广告! AdGuar ...
- Web 开发必须掌握的三个技术:Token、Cookie、Session
在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie ...
- 2020-07-16:如何获得一个链表的倒数第n个元素?
福哥答案2020-07-16: 1.快慢指针.快指针先走n步,然后快慢指针同时走,直到快指针走到尾.2.两次遍历.第一次遍历获取链表长度,然后计算出序号,然后遍历获取序号下的元素.3.数组保存.遍历一 ...
- C#LeetCode刷题之#566-重塑矩阵( Reshape the Matrix)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3720 访问. 在MATLAB中,有一个非常有用的函数 resha ...
- Vue 倒计时组件封装
项目中需要用到倒计时的功能,封装了一个组件. 代码解读: 1:created周期中获取传入参数时间的剩余秒数: this.initSecondsLeft() 并绑定间隔事件 intervalEvent ...