“基于 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.jar在Tomcat5.5.20\common\lib下就自带有的。但是在Tomcat6.0版本后lib包的位置调整了,现在只有lib在跟目录下。jasper-runtime.jar和jasper-compiler-jdt.jar、jasper-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如下:
<?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.