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!
