阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Mahout实战案例–Dating Recommender 系统

46次阅读
没有评论

共计 9169 个字符,预计需要花费 23 分钟才能阅读完成。

软件版本

Hadoop:2.6.0;Mahout:1.0(自行编译,只使用了两个 jar 文件);Spring:4.0.2;Struts:2.3;Hibernate:4.3;jQuery EasyUI:1.3.6;MySql:5.6;浏览器:chrome;MyEclipse:10.0;

Hadoop 平台配置

node1:  NameNode/ResourceManger/DataNode/NodeManager    Memory:2G

node2: NodeManager/DataNode/SecondaryNameNode/JobHistoryServer Memory:1.5G

node3: NodeManager/DataNode  Memory:1.5G

代码下载

—————————————— 分割线 ——————————————

FTP 地址:ftp://ftp1.linuxidc.com

用户名:ftp1.linuxidc.com

密码:www.linuxidc.com

在 2015 年 LinuxIDC.com\3 月 \Mahout 实战案例 –Dating Recommender 系统

下载方法见 http://www.linuxidc.com/Linux/2013-10/91140.htm

—————————————— 分割线 ——————————————

系统运行

(其中 ratings.dat 和 gender.dat 文件需要从 http://www.occamslab.com/petricek/data/ 下载)

1. 数据库部分:

   1)修改 configuration/db.properties 文件,改为用户自己的用户名、密码以及数据库;

   2)启动 tomcat,让 Hibernate 自动生成相关表。启动后可以看到数据库中有下面的表:

Mahout 实战案例 --Dating Recommender 系统

 拷贝 sql/treenode.sql 中的第 49 行语句到命令行执行,然后浏览器访问 tomcat 发布的项目,比如这里的 http://localhost:80/rec/ (或者 http://localhost/rec/basic.jsp) 即可访问项目主页,界面如下:

Mahout 实战案例 --Dating Recommender 系统

   3) 下载相关数据文件,下载解压后文件如下:

Mahout 实战案例 --Dating Recommender 系统

修改 configuration/util.properties 文件中相应文件的路径,修改 rating.proportion,该比例为数据 ratings.dat 分隔的比例,由于云平台运行协同过滤算法比较耗时,而且消耗内存较大,如果使用全部数据(245M)那么运行 CF 算法时会比较慢,这里采取上传一部分数据的方法,即先对 ratings.dat 进行分割,然后上传较小比例到云平台进行计算。如果使用的云平台计算资源较充分,可以设置该比例为 1,同时上传较大的文件;

   4)初始化用户基本信息表(即 gender.dat 数据入库)

     在浏览器导航列表中选择“用户表初始化”或者在右上角系统设置中点击“初始化用户表”进行用户表数据导入;插入完成后,浏览器会有提示:

Mahout 实战案例 --Dating Recommender 系统

tomcat 会有日志提示有插入耗时以及数据量,在数据库中查询 t_user 表中的记录数和此数据量相同;

   5)插入用户评分数据(即 ratings.dat 数据入库)

   由于此数据量较大,所以不使用 Hibernate 插入,而直接使用命令行的方式插入。拷贝 sql/import_ratings.sql 中的第 4 行命令(需修改 ratings.dat 文件位置)到 mysql 编辑器执行(或者dos 命令窗口执行 也行),一般耗时 300s 左右;插入完成后,可以查询到表 t_user_item_pref 有 17359346 条记录。

  由于后面会根据 userid 进行查询,所以这里加上索引,运行第 16 行命令,一般耗时:4mins。

2. 云平台数据部分

   1)分割 ratings.dat 文件 

     点击浏览器右上角系统设置的“分割 Rating 数据”,即可分割数据,分割完成后会给出下面的提示:

Mahout 实战案例 --Dating Recommender 系统,后台也会提示数据分割完成!

    分割后的数据在原始的 ratings.dat 所在的文件夹中,分为两部分,一个 big 为较大部分,一个为 small 为较小部分;

   2)云平台验证:

       点击导航中的“云平台验证”,在 Tab 页中相应的位置输入 NameNode、Resourcemanager 的 ip 以及端口(由于这里本机做了 ip 和机器名的映射,所以使用机器名亦可),验证成功给出提示:

Mahout 实战案例 --Dating Recommender 系统

   3)上传 ratings.dat 文件到云平台

   点击导航中的“数据上传”,在出现的 Tab 中选择刚才分割产生的 small 较小部分点击上传,即可上传数据到云平台;

Mahout 实战案例 --Dating Recommender 系统Mahout 实战案例 --Dating Recommender 系统

3. 云平台算法部分

  0)拷贝 WebRoot/WEB-INF/lib 下面的三个包到集群所有节点的目录:

Mahout 实战案例 --Dating Recommender 系统

  1)Top 算法:计算所有评分中平均分最高的 Top 个,在页面设置,比如:

Mahout 实战案例 --Dating Recommender 系统

由于集群有三个节点,所以这里设置 reducer 的个数为 3,最小评分人数是指评分的人数,如果某个 item 只有一个人评分,而且是 10 分(最高分),那么其平均分也是 10 分,这样明显不合适,所以设置这个值可以剔除一些不合理的值;

设置好参数后,点击提交,会给出正在提交任务到云平台的提示,任务提交完成,即可打开算法监控界面,如下:

Mahout 实战案例 --Dating Recommender 系统

任务运行完成,会进行 Top 数据解析入库:

Mahout 实战案例 --Dating Recommender 系统

入库成功后,在表 t_rec_top 中查询到 300 条记录;

  2)调用协同过滤算法

点击导航中的“协同过滤算法”,在弹出的 Tab 页面设置参数,点击提交,与 Top 算法类似,不过其监控界面不同,一般如下(此算法运行事件比较长):

运行过程 1:

Mahout 实战案例 --Dating Recommender 系统

运行过程 2:

Mahout 实战案例 --Dating Recommender 系统

运行过程 3:

Mahout 实战案例 --Dating Recommender 系统

CF 算法解析主要是更新用户的推荐数据。

 

3)调用单用户推荐

单用户推荐就是把云平台上推荐的结果展示而已,比如下面的数据

Mahout 实战案例 --Dating Recommender 系统

在单用户推荐界面可以看到下图:

Mahout 实战案例 --Dating Recommender 系统

4)新用户推荐界面:

注意在调用新用户推荐算法前,需要先调用 CF 算法,因为新用户推荐算法的输入数据是 CF 算法中间的一个步骤产生的数据;

新用户推荐先选择需要展示的 top 用户的性别:

Mahout 实战案例 --Dating Recommender 系统

然后确定后,会显示 top 用户,可以对其进行评分(这里只能是盲目的评分,因为没有其他信息)

Mahout 实战案例 --Dating Recommender 系统

评分默认是 5,可以进行编辑,编辑后保存即可,最后点击推荐。点击推荐类似 Top 算法,会向云平台提交新用户推荐任务,然后是监控界面:

Mahout 实战案例 --Dating Recommender 系统

查询相似推荐后,会给出推荐的列表(暂时设置为 5 个):

Mahout 实战案例 --Dating Recommender 系统

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2015-03/114832p2.htm

 

Mahout 驾驭 Hadoop 之详解 http://www.linuxidc.com/Linux/2013-09/89921.htm

Ubuntu 10.04 下 Mahout 安装步骤详解 http://www.linuxidc.com/Linux/2011-10/44550.htm

Mahout 的安装配置与使用 http://www.linuxidc.com/Linux/2013-10/92026.htm

Hadoop2.2+Mahout0.9 实战 http://www.linuxidc.com/Linux/2014-04/99856.htm

4. 部分代码思路及实现

1)云平台算法提交并监控

   采用多线程的方式提交任务。首先初始化 JobID 为空(null),接着新线程启动云平台任务后,会初始化 JobID,然后间隔一定时间去获得该 JobID,如果获得则说明任务提交成功,前台返回。前台接收到返回的正确信息后,打开监控界面,并开启 timer,每隔一定时间向后台请求 JobID 任务运行情况,得到返回结果进行显示。任务运行完成,则关闭 timer,并提示。

其代码如下:

public void cf() throws IOException{
     try{
      // 初始化 JobID
      Utils.initialJobID();
      // 提交任务
      new Thread(new CFThread(numRecommenderations,similarityClassname,maxPerfPerUser,
        minPerfPerUser,maxSimilaritiesPerItem,maxPrefsPerUserInItemSimilarity,
        Integer.parseInt(reducerSize))).start();
      while(Utils.getJobID()==null){
       Thread.sleep(500); // 暂停 500 毫秒,初始化 JObID
      }
     }catch(Exception e){
      Utils.stringToWriter(Utils.FIALCHECK);
      return ;
     }
     Utils.stringToWriter(Utils.PASSCHECK);
     // 任务提交成功,初始化 jobIDList
  Utils.initialJobIDList(Utils.CFJOBNUM);
     return ;
    }

这里需要注意的是,在 JobSubmitter 类中增添了获取 JobID 的方法,因为 JobID 是私有变量,所以添加了一个 static 方法,可以在外面直接获取;

同时,在 CF 算法中由于有多个 MR 任务,所以需要根据当前的 JobID 或 MR 的任务个数提前初始化将要运行的 JobID,这样在运行那个 JObID 时就不需要再次获取了。

2)页面监控前台后台:

前台,定时 Ajax 刷新,重新 reload datagrid 的数据

function monitor_cf_refresh() {
 // console.info(“monitor_cf_refresh()函数 ”); // 不要打开,会重复多次
 $.ajax({// ajax 提交
  url : ‘cloud/cloud_cfmonitor.action’,
  // data : “id=” + row,
  dataType : “json”,
  success : function(data) {
   if (data.finished == ‘error’) {// 获取信息错误,返回数据设置为 0,否则正常返回
   // $.messager.alert(‘ 提示 ’, ‘ 获取任务信息错误,请查看后台日志!’);
    // 设置提示:
    clearInterval(monitor_cf_interval);
    $(‘#returnMsg_monitorcf’).html(‘ 获取任务信息错误!’);
    // console.info(data);
   } else if(data.finished == ‘true’){
   
//    $(‘#returnMsg_monitorcf’).html(‘ 任务运行中 …’);// 直接显示任务运行中即可
    // 所有任务运行成功则停止 timer
    $(‘#cfMonitorId’).datagrid(‘loadData’, data.rows);// 设置多一遍
    clearInterval(monitor_cf_interval);
    $(‘#returnMsg_monitorcf’).html(‘ 任务运行完成!’);
    // 这里向后台请求解析 CF 结果,并入库,直接调用 cfresult2db() 函数即可
    cfresult2db();
   }else{
    // 设置提示,并更改页面数据, 多行显示 job 任务信息
    // —— 设置 datagrid 的数据
    $(‘#cfMonitorId’).datagrid(‘loadData’, data.rows);
   }
  }
 });

后台:后台获得任务信息后,在附加一个属性值 finished,表明此次返回任务状态数据时所有任务是否都已经完成,其代码如下:

 /**
    * 测试监控页面
    * @throws IOException
    */
    public void cftmp() throws IOException{
     Utils.stringToWriter(Utils.PASSCHECK);
     return ;
    }
    /**
    * CF 监控
    * @date 2015/2/27 23:56 算法监控完成,页面未完善
    * @throws IOException
    */
    public void cfmonitor() throws IOException{
     Map<String ,Object> jsonMap = new HashMap<String,Object>();
     List<CurrentJobInfo> currJobList =null;
     try{
//      log.info(“cfmonitor…”);
      currJobList = Utils.getJobList(Utils.CFJOBNUM);
      jsonMap.put(“rows”, currJobList);// 放入数据
     
      if (currJobList==null||currJobList.size()<=0){
       jsonMap.put(“finished”, “error”);
       log.info(“CF 算法运行失败!”);
      }else if(currJobList.size()==Utils.CFJOBNUM){
      // 当所有的任务都运行完成,需要发送完成消息
         // 完成消息后,需要进行数据解析入库
         // 入库使用前台发送请求到 UserAction
          CurrentJobInfo lastJob = currJobList.get(Utils.CFJOBNUM-1);
          if(Utils.isJobFinished(lastJob)){
           jsonMap.put(“finished”, “true”);
           log.info(“CF 算法运行完成!”);
          }
         }else{
          jsonMap.put(“finished”, “false”);
         }
//      currJobList = Utils.getTmpJobList(Utils.CFJOBNUM);// 测试代码
//      log.info(JSON.toJSONString(currJobList)); // 打印查看
      Utils.stringToWriter(JSON.toJSONString(jsonMap));// 使用 JSON 数据传输
     }catch(Exception e){
      e.printStackTrace();
      Utils.stringToWriter(Utils.FIALCHECK);
      return ;
     }
     return ;
    }

更多 Hadoop 相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

软件版本

Hadoop:2.6.0;Mahout:1.0(自行编译,只使用了两个 jar 文件);Spring:4.0.2;Struts:2.3;Hibernate:4.3;jQuery EasyUI:1.3.6;MySql:5.6;浏览器:chrome;MyEclipse:10.0;

Hadoop 平台配置

node1:  NameNode/ResourceManger/DataNode/NodeManager    Memory:2G

node2: NodeManager/DataNode/SecondaryNameNode/JobHistoryServer Memory:1.5G

node3: NodeManager/DataNode  Memory:1.5G

代码下载

—————————————— 分割线 ——————————————

FTP 地址:ftp://ftp1.linuxidc.com

用户名:ftp1.linuxidc.com

密码:www.linuxidc.com

在 2015 年 LinuxIDC.com\3 月 \Mahout 实战案例 –Dating Recommender 系统

下载方法见 http://www.linuxidc.com/Linux/2013-10/91140.htm

—————————————— 分割线 ——————————————

系统运行

(其中 ratings.dat 和 gender.dat 文件需要从 http://www.occamslab.com/petricek/data/ 下载)

1. 数据库部分:

   1)修改 configuration/db.properties 文件,改为用户自己的用户名、密码以及数据库;

   2)启动 tomcat,让 Hibernate 自动生成相关表。启动后可以看到数据库中有下面的表:

Mahout 实战案例 --Dating Recommender 系统

 拷贝 sql/treenode.sql 中的第 49 行语句到命令行执行,然后浏览器访问 tomcat 发布的项目,比如这里的 http://localhost:80/rec/ (或者 http://localhost/rec/basic.jsp) 即可访问项目主页,界面如下:

Mahout 实战案例 --Dating Recommender 系统

   3) 下载相关数据文件,下载解压后文件如下:

Mahout 实战案例 --Dating Recommender 系统

修改 configuration/util.properties 文件中相应文件的路径,修改 rating.proportion,该比例为数据 ratings.dat 分隔的比例,由于云平台运行协同过滤算法比较耗时,而且消耗内存较大,如果使用全部数据(245M)那么运行 CF 算法时会比较慢,这里采取上传一部分数据的方法,即先对 ratings.dat 进行分割,然后上传较小比例到云平台进行计算。如果使用的云平台计算资源较充分,可以设置该比例为 1,同时上传较大的文件;

   4)初始化用户基本信息表(即 gender.dat 数据入库)

     在浏览器导航列表中选择“用户表初始化”或者在右上角系统设置中点击“初始化用户表”进行用户表数据导入;插入完成后,浏览器会有提示:

Mahout 实战案例 --Dating Recommender 系统

tomcat 会有日志提示有插入耗时以及数据量,在数据库中查询 t_user 表中的记录数和此数据量相同;

   5)插入用户评分数据(即 ratings.dat 数据入库)

   由于此数据量较大,所以不使用 Hibernate 插入,而直接使用命令行的方式插入。拷贝 sql/import_ratings.sql 中的第 4 行命令(需修改 ratings.dat 文件位置)到 mysql 编辑器执行(或者dos 命令窗口执行 也行),一般耗时 300s 左右;插入完成后,可以查询到表 t_user_item_pref 有 17359346 条记录。

  由于后面会根据 userid 进行查询,所以这里加上索引,运行第 16 行命令,一般耗时:4mins。

2. 云平台数据部分

   1)分割 ratings.dat 文件 

     点击浏览器右上角系统设置的“分割 Rating 数据”,即可分割数据,分割完成后会给出下面的提示:

Mahout 实战案例 --Dating Recommender 系统,后台也会提示数据分割完成!

    分割后的数据在原始的 ratings.dat 所在的文件夹中,分为两部分,一个 big 为较大部分,一个为 small 为较小部分;

   2)云平台验证:

       点击导航中的“云平台验证”,在 Tab 页中相应的位置输入 NameNode、Resourcemanager 的 ip 以及端口(由于这里本机做了 ip 和机器名的映射,所以使用机器名亦可),验证成功给出提示:

Mahout 实战案例 --Dating Recommender 系统

   3)上传 ratings.dat 文件到云平台

   点击导航中的“数据上传”,在出现的 Tab 中选择刚才分割产生的 small 较小部分点击上传,即可上传数据到云平台;

Mahout 实战案例 --Dating Recommender 系统Mahout 实战案例 --Dating Recommender 系统

3. 云平台算法部分

  0)拷贝 WebRoot/WEB-INF/lib 下面的三个包到集群所有节点的目录:

Mahout 实战案例 --Dating Recommender 系统

  1)Top 算法:计算所有评分中平均分最高的 Top 个,在页面设置,比如:

Mahout 实战案例 --Dating Recommender 系统

由于集群有三个节点,所以这里设置 reducer 的个数为 3,最小评分人数是指评分的人数,如果某个 item 只有一个人评分,而且是 10 分(最高分),那么其平均分也是 10 分,这样明显不合适,所以设置这个值可以剔除一些不合理的值;

设置好参数后,点击提交,会给出正在提交任务到云平台的提示,任务提交完成,即可打开算法监控界面,如下:

Mahout 实战案例 --Dating Recommender 系统

任务运行完成,会进行 Top 数据解析入库:

Mahout 实战案例 --Dating Recommender 系统

入库成功后,在表 t_rec_top 中查询到 300 条记录;

  2)调用协同过滤算法

点击导航中的“协同过滤算法”,在弹出的 Tab 页面设置参数,点击提交,与 Top 算法类似,不过其监控界面不同,一般如下(此算法运行事件比较长):

运行过程 1:

Mahout 实战案例 --Dating Recommender 系统

运行过程 2:

Mahout 实战案例 --Dating Recommender 系统

运行过程 3: