1. 程式人生 > >基於Spark ALS線上推薦系統

基於Spark ALS線上推薦系統

所用技術:

Bootstrap、flat-ui 、 Servlet、Spark1.4.1、Hadoop2.6.0、JDK
說明:本系統不涉及ssh相關內容,只有簡單的Servlet和JSP、HTML頁面,系統架構相對簡單。

系統部署:

1. 拷貝spark-assembly-1.4.1-hadoop2.6.0.jar到WebContent/WEB-INF/lib目錄;
(spark-assembly-1.4.1-hadoop2.6.0.jar檔案由原生spark-assembly-1.4.1-hadoop2.6.0.jar刪除javax/servlet包獲得,由於太大,所以就沒有上傳了);
2. 拷貝原生spark-assembly-1.4.1-hadoop2.6.0.jar檔案到HDFS(目錄和程式碼中一致);
3. 拷貝WebContent/WEB-INF/lib目錄中的Spark141-als.jar到HDFS(目錄和程式碼中保持一致);
4. 拷貝Hadoop叢集(呼叫所使用的叢集,每個人不一樣)配置檔案yarn-site.xml到HDFS(目錄和程式碼中保持一致);
5. 修改相關配置檔案,由於hadoop相關配置、系統的一些屬性需要修改為實際的配置及屬性,所以針對這些需要進行修改(後面版本中會對此單獨一個配置檔案),例如:


系統使用資料為movielens上面的資料,下載地址為:http://grouplens.org/datasets/movielens/ ,本測試使用的資料是:


可以根據自己叢集的實際情況選擇下載資料集的大小。
程式碼下載地址:https://github.com/fansy1990/movie_recommend ;

系統介面及相關功能實現

1. 系統首頁

系統首頁如下圖所示

首頁直接使用bootstrap的tab介面,分為三欄,分別對應:首頁介紹、演算法呼叫和推薦;

2. 初始化後臺任務

在啟動tomcat的時候,後臺會列印相關日誌: [plain] 
view plain
 copy
  1. 資訊: Starting Servlet Engine: Apache Tomcat/7.0.52  
  2. initial begin...  
  3. 2016-08-23 12:33:28,189 WARN [org.apache.hadoop.util.NativeCodeLoader] - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable  
  4. 2016-08-23 12:33:29,836 INFO [util.Utils] - Movies data size:3883  
  5. 2016-08-23 12:33:33,638 INFO [util.Utils] - Users data size:6040  
  6. initial end!  
  7. 八月 23, 2016 12:33:33 下午 org.apache.coyote.AbstractProtocol start  
這裡是初始化的相關列印,初始化使用InitServlet,在裡面呼叫了Utils的init方法,init方法主要初始化了movies變數和userWithRatedMovies變數和allMovieIds變數,各個變量表示意思如下:
  • movies:所有的電影ID和電影所有相關資訊的Map對映;
  • userWithRatedMovies:使用者ID和當前使用者所有評分過的電影ID集合的Map對映;
  • allMovieIds:所有電影ID的Set集合;
這裡看到初始化的電影有3883個,而使用者數有6040個;

3. 建模前臺與後臺功能實現

 建模介面如下所示:


使用者輸入或選擇對應的引數,即可點選“建模”,提交Spark ALS任務到YARN(Hadoop叢集),進行演算法呼叫。 建模流程:
  1. 使用者輸入相關演算法引數後,點選建模;
  2. 後臺RunALS Servlet獲取提交的演算法引數,封裝Spark ALS演算法,然後提交給YARN;
  3. YARN在分配了相關資源後,會返回一個任務ID:applicationID,這時啟動一個執行緒,專門獲取該applicationId的任務進度,更新全域性allAppStatus變數(Map變數<applicationId,任務狀態>),後臺返回前臺此applicationId;
  4. 前臺獲取到此applicationId後,如果獲取的applicationId為Null,那麼就會彈出一個模態框提示建模提交任務失敗;否則,會彈出一個進度條模態框(此進度條模態框下面會有詳細介紹);
  5. 前臺啟動定時任務,去後臺獲取全域性allAppStatus變數對應applicationId的狀態,返回前臺,更新進度條模態框對應進度;
  6. 一直到任務成功或失敗,給出對應的提示;

3.1進度條模態框實現

1. 進度條模態框div定義如下: [html]  view plain  copy
  1. <div class="modal fade" id="myModal1" tabindex="-1" role="dialog"  
  2.                             aria-labelledby="myModalLabel">  
  3.                             <div class="modal-dialog" role="document">  
  4.                                 <div class="modal-content">  
  5.                                     <div class="progress progress-striped active"  
  6.                                         style="margin-bottom: 0px; height: 25px; border-radius: 5px;">  
  7.                                         <div id="progressId" class="progress-bar"  
  8.                                             style="width: 1%; height: 100%;">0%</div>  
  9.                                     </div>  
  10.                                 </div>  
  11.                             </div>  
  12.                         </div>  
全部使用bootstrap的基本樣式; 2. 彈出該模態框以及更新進度相關程式碼: [javascript]  view plain  copy
  1. // 彈出窗提示程式正在執行  
  2.                 setProgress("progressId""0%");  
  3.                   
  4.                 // 開啟進度條模態框  
  5.                 openModal("myModal1");  
  6.                   
  7.                 // 定時請求任務進度  
  8.                 t=setTimeout("queryTaskProgress('"+ret+"')",1000);  

相關函式: [javascript]  view plain  copy
  1. /** 
  2.  * 設定進度條 
  3.  * @param id 
  4.  * @param value 
  5.  */  
  6. function setProgress(id,value){  
  7.     $("#"+id).css("width",value);  
  8.     $("#"+id).html(value);  
  9. }  
  10.   
  11. /** 
  12.  * 開啟模態框 
  13.  * @param id 
  14.  */  
  15. function openModal(id){  
  16.     $('#'+id).on('show.bs.modal'function(){  
  17.         var $this = $(this);  
  18.         var $modal_dialog = $this.find('.modal-dialog');  
  19.         // 關鍵程式碼,如沒將modal設定為 block,則$modala_dialog.height() 為零  
  20.         $this.css('display''block');  
  21.         $modal_dialog.css({'margin-top': Math.max(0, ($(window).height() - $modal_dialog.height()) / 2) });  
  22.    });  
  23.     $('#'+id).modal({backdrop: 'static', keyboard: false});  
  24. }  

定時函式,檢視進度: [javascript]  view plain  copy
  1. /** 
  2.      * 請求任務進度 
  3.      */  
  4. function queryTaskProgress(appId){  
  5.     // ajax 傳送請求獲取任務執行狀態,如果返回執行失敗或成功則關閉彈框  
  6.     $.ajax({  
  7.         type : "POST",  
  8.         url : "Monitor",  
  9. //          dataType : "json",  
  10.         async:false,// 同步執行  
  11.         data:{APPID:appId},  
  12.         success : function(data) {  
  13. //          console.info("success:"+data);  
  14.             if(data.indexOf("%")==-1){// 不包含 ,任務執行完成(失敗或成功)  
  15.                 clearTimeout(t);// 關閉計時器  
  16.                 // 關閉彈窗進度條  
  17.                 $('#myModal1').modal("hide");  
  18.                 // 開啟提示條模態框  
  19.               
  20.                 $('#tipId').html(data=="FINISHED"?"模型訓練完成!":   
  21.                     (data=="FAILED"?"呼叫建模失敗!":"模型訓練被殺死!"));  
  22.                   
  23.                 openModal("myModal2");  
  24.                 console.info("closed!");  
  25.                 return ;  
  26.             }  
  27.               
  28.             setProgress("progressId", data);  
  29.             // 進度查詢每次間隔1500ms  
  30.             t=setTimeout(

    相關推薦

    基於Spark ALS線上推薦系統

    所用技術: Bootstrap、flat-ui 、 Servlet、Spark1.4.1、Hadoop2.6.0、JDK 說明:本系統不涉及ssh相關內容,只有簡單的Servlet和JSP、HTML頁面,系統架構相對簡單。 系統部署

    基於Spark的電影推薦系統(電影網站)

    第一部分-電影網站: 軟體架構: SpringBoot+Mybatis+JSP 專案描述:主要實現電影網站的展現 和 使用者的所有動作的地方 技術選型: 技術 名稱 官網 Spring Boot 容器 https

    基於Spark的電影推薦系統(實戰簡介)

    寫在前面 一直不知道這個專欄該如何開始寫,思來想去,還是暫時把自己對這個專案的一些想法 和大家分享 的形式來展現。有什麼問題,歡迎大家一起留言討論。 這個專案的原始碼是在https://github.com/LuckyZXL2016/Movie_Recommend這個位置。 基於原始碼做了一些簡單的調整。

    基於Spark的電影推薦系統

    首先給出程式碼: import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.ml.recommendation._ import

    基於Spark的電影推薦系統推薦系統~2)

    第四部分-推薦系統-資料ETL 本模組完成資料清洗,並將清洗後的資料load到Hive資料表裡面去 前置準備: spark +hive vim $SPARK_HOME/conf/hive-site.xml <?xml version="1.0"?> <?xml

    基於ALS演算法的簡易線上推薦系統

        繼前期完成廣義線性模型的線上流式機器學習的程式碼後,我們對spark的mllib中的推薦系統這一部分比較感興趣,因為推薦系統這一部分在現實生活中也非常實用,尤其是基於地理位置的線上推薦系統目前非常火熱,很多商業軟體如大眾點評,淘點點等都希望能根據使用者以往的一些行為

    下載基於大數據技術推薦系統實戰教程(Spark ML Spark Streaming Kafka Hadoop Mahout Flume Sqoop Redis)

    大數據技術推薦系統 推薦系統實戰 地址:http://pan.baidu.com/s/1c2tOtwc 密碼:yn2r82課高清完整版,轉一播放碼。互聯網行業是大數據應用最前沿的陣地,目前主流的大數據技術,包括 hadoop,spark等,全部來自於一線互聯網公司。從應用角度講,大數據在互聯網領域主

    基於Spark ALS演算法的個性化推薦

    今天來使用spark中的ALS演算法做一個小推薦。需要資料的話可以點選檢視,在文末點選閱讀原文即可獲取。其實在R中還有一個包可以做推薦,那就是recommenderlab。如果資料量不大的時候可以使用r

    基於模型融合的推薦系統實現(3):模型融合

    基本思路很簡單,最小二乘法就好了: 我們假設兩個演算法得到的結果權重分別是a,b利用最小二乘法和我們分出來的第二部分資料就可以獲取a,b使得誤差最小。其實最小二乘法就是求一個廣義的逆即可。最後的RMSE比起單一的模型有所提高,變成了(0.86~~~~) import numpy

    基於模型融合的推薦系統實現(2):迭代式SVD分解

    SVD演算法的原理網路上也有很多,不再細說了,關鍵是我們得到的資料是不完整的資料,所以要算SVD就必須做一次矩陣補全。補全的方式有很多,這裡推薦使用均值補全的方法(用每一行均值和每一列均值的平均來代替空白處),然後可以計算SVD,作PCA分析,然後就可以得到預測結果。 但是我們這裡有

    基於模型融合的推薦系統實現(1):基於SGD的PMF

    (1)PMF演算法 PMF的基本的思路,就是定義兩個基本的引數W,U,然後對於任意一個組合(u,m),利用 Wi∗Uj W^i*U^j,來獲取預測值。這些基本的演算法思路網上很多,就不細說了。簡單說一下程式 [0]:一開始我們要將訓練資料劃分為3部分,第一部

    [大資料專案]-0011-基於大資料技術推薦系統演算法案例實戰視訊教

    2018最新最全大資料技術、專案視訊。整套視訊,非那種淘寶雜七雜八網上能免費找到拼湊的亂八七糟的幾年前的不成體系浪費咱們寶貴時間的垃圾,詳細內容如下,視訊高清不加密,需要的聯絡QQ:3164282908(加Q註明51CTO)。     [大資料專案]-0010-基於大資料技術

    基於深度學習的推薦系統綜述 (arxiv 1707.07435) 譯文 3.1 ~ 3.3

    基於深度學習的推薦:最先進的技術 在本節中,我們首先介紹基於深度學習的推薦模型的類別,然後突出最先進的研究原型,旨在確定近年來最顯著和最有希望的進步。 基於深度學習的推薦模型的類別 **圖 1:**基於深度神經網路的推薦模型的類別。 為了提供該領域的全景圖,

    基於深度學習的推薦系統(二)MLP based

    在第二部分,我們總結MLP基礎上的推薦系統,我在這裡只截取了原文的一部分內容。這篇部落格中所使用的註解字元和參考文獻目錄可以在基於深度學習的推薦系統(一)Overview中找到。我們把這些工作分為如下幾部分: 傳統推薦演算法的神經網路擴充套件 許多現有的推薦模型

    基於深度學習的推薦系統研究綜述》_黃立威——閱讀筆記

    一、常用的深度學習模型和方法介紹 1.自編碼器 自編碼器通過一個編碼和一個解碼過程來重構輸入資料,學習資料的隱表示。基本的自編碼器可視為一個三層的神經網路結構.下圖是自編碼器結構示意圖: 自編碼器的目的是使得輸入 x 與輸出 y 儘可能接近,這種接近程度通過重構誤差表示,根據資料的

    spark機器學習筆記:(三)用Spark Python構建推薦系統

    輸出結果: [[Rating(user=789, product=1012, rating=4.0), Rating(user=789, product=127, rating=5.0), Rating(user=789, product=475, rating=5.0), Rating(us

    基於JSP的小說推薦系統,java畢業設計

    **基於JSP的小說推薦系統,java畢業設計** 基於JSP的小說推薦系統mysql資料庫建立語句 基於JSP的小說推薦系統oracle資料庫建立語句 基於JSP的小說推薦系統sqlserver資料庫建立語句 基於JSP的小說推薦系統spring springMV

    基於深度學習的推薦系統:綜述與新視角

    原文:Deep Learning based Recommender System: A Survey and New Perspectives 作者:張帥, 新南威爾士大學 翻譯:沈春旭,清華大學   隨著線上資訊量的不斷增加,推薦系統已經成為克服這種資訊過載的有效策略。

    基於Mahout的電影推薦系統

    參考資料: 1 Mahout介紹 Apache Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源專案,提供一些可擴充套件的機器學習領域經典演算法的實現,旨在幫助開發人員更加方便快捷地建立智慧應用程式。經典演算法包括聚類、分類、協同

    開發基於約束條件的推薦系統---《推薦系統技術、評估及高效演算法》---讀書筆記(6)

    一、目錄組織圖(單擊可放大)二、補充筆記1、基於約束的推薦系統是在資訊不完全的情況下,導致基於內容和協同過濾的方法可能失效情況下的一種推薦系統設計方法。它建立在使用者的需求和願望能夠明確表述的情況下。我認為這個實際上可以看成一個多型別關鍵字搜尋的過程(比如在X東購買膝上型電腦