ECommerceRecommendSystem
基於spark的商品推薦系統
項目體系架構設計
1.1 項目系統架構
項目以推薦系統建設領域知名的經過修改過的中文亞馬遜電商數據集作爲依託,以某電商網站真實業務數據架構爲基礎,構建了符合教學體系的一體化的電商推薦系統,包含了離線推薦與實時推薦體系,綜合利用了協同過濾算法以及基於內容的推薦方法來提供混合推薦。提供了從前端應用、後臺服務、算法設計實現、平臺部署等多方位的閉環的業務實現。
用戶可視化:主要負責實現和用戶的交互以及業務數據的展示,主體採用AngularJS2進行實現,部署在Apache服務上。
綜合業務服務:主要實現JavaEE層面整體的業務邏輯,通過Spring進行構建,對接業務需求。部署在Tomcat上。
【數據存儲部分】
業務數據庫:項目採用廣泛應用的文檔數據庫MongDB作爲主數據庫,主要負責平臺業務邏輯數據的存儲。
緩存數據庫:項目採用Redis作爲緩存數據庫,主要用來支撐實時推薦系統部分對於數據的高速獲取需求。
【離線推薦部分】
離線統計服務:批處理統計性業務採用Spark Core + Spark SQL進行實現,實現對指標類數據的統計任務。
離線推薦服務:離線推薦業務採用Spark Core + Spark MLlib進行實現,採用ALS算法進行實現。
【實時推薦部分】
日誌採集服務:通過利用Flume-ng對業務平臺中用戶對於商品的一次評分行爲進行採集,實時發送到Kafka集羣。
消息緩衝服務:項目採用Kafka作爲流式數據的緩存組件,接受來自Flume的數據採集請求。並將數據推送到項目的實時推薦系統部分。
實時推薦服務:項目採用Spark Streaming作爲實時推薦系統,通過接收Kafka中緩存的數據,通過設計的推薦算法實現對實時推薦的數據處理,並將結構合併更新到MongoDB數據庫。
1.2 項目數據流程
【系統初始化部分】
- 通過Spark SQL將系統初始化數據加載到MongoDB中。
【離線推薦部分】
-
可以通過Azkaban實現對於離線統計服務以離線推薦服務的調度,通過設定的運行時間完成對任務的觸發執行。
-
離線統計服務從MongoDB中加載數據,將【商品平均評分統計】、【商品評分個數統計】、【最近商品評分個數統計】三個統計算法進行運行實現,並將計算結果回寫到MongoDB中;離線推薦服務從MongoDB中加載數據,通過ALS算法分別將【用戶推薦結果矩陣】、【影片相似度矩陣】回寫到MongoDB中。
【實時推薦部分】
- Flume從綜合業務服務的運行日誌中讀取日誌更新,並將更新的日誌實時推送到Kafka中;Kafka在收到這些日誌之後,通過kafkaStream程序對獲取的日誌信息進行過濾處理,獲取用戶評分數據流【UID|MID|SCORE|TIMESTAMP】,併發送到另外一個Kafka隊列;Spark Streaming監聽Kafka隊列,實時獲取Kafka過濾出來的用戶評分數據流,融合存儲在Redis中的用戶最近評分隊列數據,提交給實時推薦算法,完成對用戶新的推薦結果計算;計算完成之後,將新的推薦結構和MongDB數據庫中的推薦結果進行合併。
【業務系統部分】
-
推薦結果展示部分,從MongoDB中將離線推薦結果、實時推薦結果、內容推薦結果進行混合,綜合給出相對應的數據。
-
商品信息查詢服務通過對接MongoDB實現對商品信息的查詢操作。
-
商品評分部分,獲取用戶通過UI給出的評分動作,後臺服務進行數據庫記錄後,一方面將數據推動到Redis羣中,另一方面,通過預設的日誌框架輸出到Tomcat中的日誌中。
-
商品標籤部分,項目提供用戶對商品打標籤服務。
1.3 數據模型
- Product【商品數據表】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
productId | Int | 商品的ID | |
name | String | 商品的名稱 | |
categories | String | 商品所屬類別 | 每一項用“|”分割 |
imageUrl | String | 商品圖片的URL | |
tags | String | 商品的UGC標籤 | 每一項用“|”分割 |
- Rating【用戶評分表】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
userId | Int | 用戶的ID | |
productId | Int | 商品的ID | |
score | Double | 商品的分值 | |
timestamp | Long | 評分的時間 |
- Tag【商品標籤表】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
userId | Int | 用戶的ID | |
productId | Int | 商品的ID | |
tag | String | 商品的標籤 | |
timestamp | Long | 評分的時間 |
- User【用戶表】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
userId | Int | 用戶的ID | |
username | String | 用戶名 | |
password | String | 用戶密碼 | |
timestamp | Lon0067 | 用戶創建的時間 |
- RateMoreProductsRecently【最近商品評分個數統計表】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
productId | Int | 商品的ID | |
count | Int | 商品的評分數 | |
yearmonth | String | 評分的時段 | yyyymm |
- RateMoreProducts【商品評分個數統計表】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
productId | Int | 商品的ID | |
count | Int | 商品的評分數 |
- AverageProductsScore【商品平均評分表】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
productId | Int | 商品的ID | |
avg | Double | 商品的平均評分 |
- ProductRecs【商品相似性矩陣】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
productId | Int | 商品的ID | |
recs | Array[(productId:Int,score:Double)] | 該商品最相似的商品集合 |
- UserRecs【用戶商品推薦矩陣】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
userId | Int | 用戶的ID | |
recs | Array[(productId:Int,score:Double)] | 推薦給該用戶的商品集合 |
- StreamRecs【用戶實時商品推薦矩陣】
字段名 | 字段類型 | 字段描述 | 字段備註 |
---|---|---|---|
userId | Int | 用戶的ID | |
recs | Array[(productId:Int,score:Double)] | 實時推薦給該用戶的商品集合 |
1.4傳送門
本案例基於實際生產環境給出,包含源碼、測試數據、文檔、筆記、詳細的備註說明,最後大家別忘了小星星!
github地址