“基于 Apache Mahout 构建社会化推荐引擎”-电影推荐引擎建立

一,参考文章:

(1)基于 Apache Mahout 构建社会化推荐引擎:http://www.ibm.com/developerworks/cn/java/j-lo-mahout/

(2)“基于 Apache Mahout 构建社会化推荐引擎”一文例子运行纪实 :http://blog.csdn.net/softwarehe/article/details/7465151

(3)对 基于 Apache Mahout 构建社会化推荐引擎 一文的补充http://www.cnblogs.com/abelstronger/articles/2093847.htm

二,说明:

    运行环境是:linux下myeclipse8.0+tomcat6.0,用的时mahout0.5。

    由于是linux环境,所以可能js代码有警告,这里先忽略。

    整个过程主要参考了原文一(1),这是基础,原始代码也是从原文下载的;

    搭建过程主要参考一(2),基本上大的问题在该文中都给出了解决办法;

    数据导入过程参考了一(3),不过由于时linux下,所以数据路径稍微修改了一下。

    这里主要是对以上作者的工作做一个稍微的补充,希望对以后的同学能有一定帮助。

 

三,具体建立工程过程

(1)在myeclipse下建立web project 工程,命名为MovieSite。

(2)在WebRoot/WEB-INF/lib下导入各种包,具体如下图:

这里做一下说明

说明1:

lib 下的包主要是将 demo 时生成的推荐引擎 Web 应用的 war 包解压缩,将 lib 下的 jar 文件拷贝到 MovieSite 的 lib 目录下,同时将jasper.jar,mysql-connector-java-5.0.6-bin.jar考入lib中。

说明2:

由于采用的时tomcat6.0,Tomcat6.0之前的版本以Tomcat5.5.20 压缩版为例,jasper-runtime.jarTomcat5.5.20\common\lib下就自带有的。但是在Tomcat6.0版本后lib包的位置调整了,现在只有lib在跟目录下。jasper-runtime.jarjasper-compiler-jdt.jarjasper-compiler.jar等都集成到jasper.jar包中去了,所以直接包含jasper.jar就可以了。

参考:http://wenku.baidu.com/view/f4f3fa0190c69ec3d5bb7557.html

说明3:

lib下并没有servlet-api.jar和jsp.jar,主要原因是jsp-api.jar和servlet-api.jar这两个包tomcat的common\lib已经有了,必须将\WEB-INF\lib\目录下的去掉,否则会冲突的,会引起validateJarFile(/usr/local/src/tomcat6/webapps/MovieSite/WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class。

参考:End2012的 http://hi.baidu.com/lpzsybgekvbdkrd/item/f975beac2a08b59b14107302    一文。

(3)在src下导入原来工程的各种包,具体如下:

    其中前面的6个包是原来的MovieSite工程已经有的,,dataimporter是向数据库插入数据的几个class,主要是参考一(3)的数据导入部分,包括ImportMovies.java,ImportRatings.java,ImportUsers.java,这里

说明1:

有一点需要注意的,由于数据是后来导入的,导入movies数据的时候没有问题,不过在导入movie_preferences的时候注意去掉对users表的外键参考(因为此时users表为空呢)。

说明2:

导入数据之后会报DBUtils.java下赵不到getJDBCConnection,解决办法就是在DBUtils.java下添加getJDBCConnection()类,(参考一(2)的数据导入部分)

说明3:

这个时候会提示com.ibm.taste.example.movie.recommender中的几个class出现错误,,主要是类型错误,将类中参数Rescorer<long>rescorer 修改为IDRescorer rescorer即可。

说明4:

这时候可能会提示MovieDataModel.java有问题,在MovieDataModel.java,添加一行public final static String TIMESTAMP_COLUMN = "timestamp";这里的timestamp对应的是数据库表里边的字段名,不能乱写,再出错的super函数最后加上一个参数 TIMESTAMP_COLUMN,这个编译错误消失(参考一(2))

(4)配置web.xml

不知道是什么原因,我参考一(2)配置web.xml总是出现错误,所以,我就直接在新项目的web.xml中手动添加各个参数,最终web.xml如下:

 

View Code
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <servlet>
  <description>Movie recommender servlet</description>
  <display-name>Movie Recommender</display-name>
  <servlet-name>movie-recommender</servlet-name>
  <servlet-class>com.ibm.taste.example.movie.servlet.MovieRecommenderServlet</servlet-class>
  <init-param>
   <param-name>recommender-class</param-name>
   <param-value>com.ibm.taste.example.movie.recommender.UserBasedRecommender</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet>
  <display-name>Apache-Axis Servlet</display-name>
  <servlet-name>axis</servlet-name>
  <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
 </servlet>
 <servlet>
  <display-name>User Servlet</display-name>
  <servlet-name>user</servlet-name>
  <servlet-class>com.ibm.taste.example.movie.servlet.UserServlet</servlet-class>
 </servlet>
 <servlet>
  <display-name>Movie Servlet</display-name>
  <servlet-name>movie</servlet-name>
  <servlet-class>com.ibm.taste.example.movie.servlet.MovieServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>movie-recommender</servlet-name>
  <url-pattern>/recommend</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>user</servlet-name>
  <url-pattern>/user</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>movie</servlet-name>
  <url-pattern>/movies</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>axis</servlet-name>
  <url-pattern>*.jws</url-pattern>
 </servlet-mapping>
 <!-- The rest of the config is adapted from Axis's default web app -->
 <session-config>
  <session-timeout>5</session-timeout>
 </session-config>
 <mime-mapping>
  <extension>wsdl</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>
 <mime-mapping>
  <extension>xsd</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
 </welcome-file-list>
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
 
 <resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/movie</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
 
</web-app>

 

(5)将index.html文件,style文件夹,images文件夹,script文件夹拷贝到WebRoot下,修改index.html的一些警告。

(6)部署项目运行

 

 在Email中输入users表中的数据例如:test1@gmail.com  ,  Password中不用输入,Login即可,结果如下:

四,总结

    虽然可以看到结果,不过还有几个问题,现在正在修改中,,,

    (1)警告:You are not using ConnectionPoolDataSource. Make sure your DataSource pools connections to the database itself, or database performance will be severely reduced.,看来连接池还有问题,

    (2)关闭项目时:The web application [/MovieSite] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

    (3)关闭项目时:The web application [/MovieSite] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.

posted @ 2012-12-19 10:51  lpshou  阅读(3573)  评论(2编辑  收藏  举报