MovieWeb是一個電影相關的網站,它提供的功能包括搜索電影信息、排名或者電影明星資料等。它擁有10000部電影的信息,70000個用户,和超過1千萬的電影評分。借用它的搜索目錄,用户可以通過類型分類、排名和片名瀏覽等方式檢索電影。但如何解決電影智能推薦的問題呢?近日MongoDB分享了他們結合Hadoop的經驗。
MovieWeb基於Python。在構建電影推薦系統時,使用flask和PyMongo讀取數據,應用Python網頁應用瀏覽電影和評分推薦;使用Spark應用來運算處理實際的推薦,並用MLLib實現協同過濾;然後蒐集電影評分的數據,並創建和訓練數據模型,而後處理用户和電影的數據集,再反向應用訓練過的模型來嘗試預測電影排名。以上完成後,將預測結果寫入MongoDB,接下來那些網頁應用就可以將預測的排名展示出來,再收取新一輪的預測。其中用到的工具有Apache Hadoop 2.3.0(HDFS和YARN),Spark1.0和用於管理數據的MongoDB。
MovieWeb的工作流程:
以BSON的格式快速建立數據庫;在HDFS中儲存該BSON;將BSON讀取到Spark應用中;用已有的排名評分訓練模型;建立“用户—影片”對;為所有“用户—影片”對預測排名;將預測結果寫入MongoDB採集庫;網頁應用展示推薦;每週重複一次以上工作。這不是一項MapReduce的工作,其代碼量很少,加上引入語法基本上也只需要150行左右的代碼。
Spark的環境建立和架構建立的執行語句如下:
$ export SPARK_JAR=spark-assembly-1.0.0-hadoop2.3.0.jar
$ Export HADOOP_CONF_DIR=/usr/local/Hadoop/etc/Hadoop
$ bin/spark-submit
--master yarn-cluster
--class com.mongodb.hadoop.demo.Recommender demo-1.0.jar
--jars mongo-java-2.12.2.jar,mongo-hadoop-1.2.1.jar
--driver-memory 1G
--executor-memory 2G
--num-executors 4
功能實現之後的推薦系統中,“您可能喜歡的影片”一欄,那些根據預測推薦的影片是基於用户正在瀏覽的影片的第一個所屬類別。例如影片《非常嫌疑犯》,第一類別為“犯罪”,則瀏覽該片時所推薦的電影也都屬於這一類別。當用户表現出需求時,系統就會自動為用户過濾類別,再將篩選出來的結果進入給用户的推薦廣播之中。