系統設計:使用Scala、Spark和Hadoop構建推薦系統

banq發表於2022-02-03

推薦系統是一種廣泛使用的機器學習技術,在電子商務(亞馬遜、阿里巴巴)、影片流(Netflix、Disney+)、社交網路(Facebook、Linkedin)和許多其他領域都有很多應用。由於這些服務中的資料量很大,現在大多數行業級推薦系統都是建立在 Spark 和 Hadoop 等大資料框架中的。因此,在這篇部落格中,我想向您展示我是如何使用 Scala、Spark 和 Hadoop 構建電影推薦系統的。

目錄


 

推薦系統介紹
推薦系統演算法可以分為兩大類:基於內容的推薦和協同過濾。

  • 基於內容的推薦

利用產品特徵向使用者推薦與之前喜歡的產品相似的產品。
如果人 P1 和人 P2 對產品 D1 有相同的看法,那麼 P1 對產品 D2 的看法與 P2 的看法相同的可能性比與隨機選擇的人 Px 的看法相同。
適合新聞/文章推薦
好處:
  1. - 該模型不需要任何使用者資料輸入,因此更容易擴充套件。- 能夠透過特徵工程捕捉小眾物品。

缺點:
  1. - 需要領域知識。
  2. - 擴充套件使用者興趣的能力有限。

 
  • 協同過濾

透過收集許多其他使用者的偏好資訊來預測使用者的興趣。
如果一個人喜歡具有一系列屬性的產品D1,他/她更有可能喜歡具有這些屬性的產品D2,而不是沒有這些屬性的產品D3。
應用:電影推薦,亞馬遜產品推薦
優點:
  1. - 不需要領域知識,高度可轉移的模式。
  2. - 能夠幫助使用者發現新的興趣。

缺點:
  1. - 冷啟動問題:需要用現有的資料工作,不能處理新的專案/使用者。
  2. - 難以擴充套件專案的功能。

 

協同過濾和Spark ALS
在這篇文章中,我們將使用協同過濾作為推薦演算法。
協同過濾的工作原理是這樣的。
首先,我們把所有使用者對所有物品的評分看作是一個矩陣,
這個矩陣可以被因子化為兩個獨立的矩陣,一個是使用者矩陣,行代表使用者,列代表潛在因素;
另一個是物品矩陣,行是潛在因素,列代表物品。
在這個因式分解過程中,評分矩陣中的缺失值可以被填補,作為使用者對物品評分的預測,然後我們可以用它們來給使用者推薦。

ALS(交替最小二乘法)是協同過濾的數學最佳化實現,它使用帶有加權拉姆達正則化 (ALS-WR) 的交替最小二乘法 (ALS) 來找到最小二乘預測和實際評級之間的最小二乘的最佳因子權重。Spark 的 MLLib 包有一個內建的 ALS 功能,我們將在這篇文章中使用它。
 

系統設定

  • Ubuntu 20.04.3
  • JDK 11.0.13
  • Scala 2.12.11
  • Spark 3.2.0
  • Hadoop 3.2.2
  • IntelliJ IDEA (2021.3.1)

 

資料集
在這個專案中,我們將使用來自明尼蘇達大學雙城分校的MovieLens 資料集。您可以透過執行以下命令下載ml-100k (4.7M):
wget https://files.grouplens.org/datasets/movielens/ml-100k.zip
執行以下命令解壓縮 zip 檔案:
unzip ml-100k.zip
您將看到解壓縮ml-100k的資料夾包含多個檔案。
我們主要使用兩個資料檔案:

  • u.data:使用者評分資料,包括使用者id、物品id、評分、時間戳。
  • u.item:電影資料,包括專案id、電影名稱、上映日期、imdb url等。

 

在 Spark 中執行
在 Spark 中執行之前,請使用以下命令將程式碼從我的Github 儲存庫克隆到您的本地目錄:
git clone https://github.com/haocai1992/MovieRecommender.git
 

準備HDFS中的資料
在我們開始之前,我們需要在終端中啟動 hadoop HDFS 和 YARN 服務)。
$ hadoop namenode -format $ start-all.sh
然後我們需要將 ml-100k 資料集上傳到 Hadoop HDFS:
$ hadoop fs -put ~/Downloads/ml-100k /user/caihao/movie
  

Spark中訓練推薦模型
使用以下方法在 Spark 中訓練推薦模型:

$ spark-submit --driver-memory 512m --executor-cores 2 --class RecommenderTrain --master yarn --deploy-mode client ~/Desktop/spark_test/MovieRecommender/out/artifacts/MovieRecommender_jar/MovieRecommender.jar

使用以下命令檢查您在 HDFS 中訓練的模型:
$ hadoop fs -ls -h /user/caihao/movie
 

在 Spark 中生成推薦
使用以下方法在 Spark 中推薦電影:

$ spark-submit --driver-memory 512m --executor-cores 2 --class Recommend --master yarn --deploy-mode client ~/Desktop/spark_test/MovieRecommender/out/artifacts/MovieRecommender_jar2/MovieRecommender.jar --U 100

 

在 Databricks 中執行 PySpark 版本
如果你不瞭解 Scala,我還建立了一個 Python 版本的推薦系統!它使用 PySpark 並在 Databricks 上執行。
在此處檢查我的程式碼:我的 Databricks 筆記本
 

推薦系統設計
我們的系統設計如下。

系統設計:使用Scala、Spark和Hadoop構建推薦系統
有兩個 Scala 物件:

  • RecommenderTrain.scala:讀取評級檔案(u.data),準備資料,訓練 ALS 模型並儲存模型。
  • Recommender.scala:讀取電影檔案(u.item),載入 ALS 模型,生成電影推薦。

更詳細點選標題
 

相關文章