基於Spark的電商推薦系統

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 項目數據流程

在這裏插入圖片描述
【系統初始化部分】

  1. 通過Spark SQL將系統初始化數據加載到MongoDB中。

【離線推薦部分】

  1. 可以通過Azkaban實現對於離線統計服務以離線推薦服務的調度,通過設定的運行時間完成對任務的觸發執行。

  2. 離線統計服務從MongoDB中加載數據,將【商品平均評分統計】、【商品評分個數統計】、【最近商品評分個數統計】三個統計算法進行運行實現,並將計算結果回寫到MongoDB中;離線推薦服務從MongoDB中加載數據,通過ALS算法分別將【用戶推薦結果矩陣】、【影片相似度矩陣】回寫到MongoDB中。

【實時推薦部分】

  1. Flume從綜合業務服務的運行日誌中讀取日誌更新,並將更新的日誌實時推送到Kafka中;Kafka在收到這些日誌之後,通過kafkaStream程序對獲取的日誌信息進行過濾處理,獲取用戶評分數據流【UID|MID|SCORE|TIMESTAMP】,併發送到另外一個Kafka隊列;Spark Streaming監聽Kafka隊列,實時獲取Kafka過濾出來的用戶評分數據流,融合存儲在Redis中的用戶最近評分隊列數據,提交給實時推薦算法,完成對用戶新的推薦結果計算;計算完成之後,將新的推薦結構和MongDB數據庫中的推薦結果進行合併。

【業務系統部分】

  1. 推薦結果展示部分,從MongoDB中將離線推薦結果、實時推薦結果、內容推薦結果進行混合,綜合給出相對應的數據。

  2. 商品信息查詢服務通過對接MongoDB實現對商品信息的查詢操作。

  3. 商品評分部分,獲取用戶通過UI給出的評分動作,後臺服務進行數據庫記錄後,一方面將數據推動到Redis羣中,另一方面,通過預設的日誌框架輸出到Tomcat中的日誌中。

  4. 商品標籤部分,項目提供用戶對商品打標籤服務。

1.3 數據模型

  1. Product【商品數據表】
字段名 字段類型 字段描述 字段備註
productId Int 商品的ID
name String 商品的名稱
categories String 商品所屬類別 每一項用“|”分割
imageUrl String 商品圖片的URL
tags String 商品的UGC標籤 每一項用“|”分割
  1. Rating【用戶評分表】
字段名 字段類型 字段描述 字段備註
userId Int 用戶的ID
productId Int 商品的ID
score Double 商品的分值
timestamp Long 評分的時間
  1. Tag【商品標籤表】
字段名 字段類型 字段描述 字段備註
userId Int 用戶的ID
productId Int 商品的ID
tag String 商品的標籤
timestamp Long 評分的時間
  1. User【用戶表】
字段名 字段類型 字段描述 字段備註
userId Int 用戶的ID
username String 用戶名
password String 用戶密碼
timestamp Lon0067 用戶創建的時間
  1. RateMoreProductsRecently【最近商品評分個數統計表】
字段名 字段類型 字段描述 字段備註
productId Int 商品的ID
count Int 商品的評分數
yearmonth String 評分的時段 yyyymm
  1. RateMoreProducts【商品評分個數統計表】
字段名 字段類型 字段描述 字段備註
productId Int 商品的ID
count Int 商品的評分數
  1. AverageProductsScore【商品平均評分表】
字段名 字段類型 字段描述 字段備註
productId Int 商品的ID
avg Double 商品的平均評分
  1. ProductRecs【商品相似性矩陣】
字段名 字段類型 字段描述 字段備註
productId Int 商品的ID
recs Array[(productId:Int,score:Double)] 該商品最相似的商品集合
  1. UserRecs【用戶商品推薦矩陣】
字段名 字段類型 字段描述 字段備註
userId Int 用戶的ID
recs Array[(productId:Int,score:Double)] 推薦給該用戶的商品集合
  1. StreamRecs【用戶實時商品推薦矩陣】
字段名 字段類型 字段描述 字段備註
userId Int 用戶的ID
recs Array[(productId:Int,score:Double)] 實時推薦給該用戶的商品集合

1.4傳送門

本案例基於實際生產環境給出,包含源碼、測試數據、文檔、筆記、詳細的備註說明,最後大家別忘了小星星!
github地址

發佈了32 篇原創文章 · 獲贊 42 · 訪問量 7873
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章