Mahout案例实战--Dating Recommender 系统

软件版本:

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

代码下载:(下载地址明天更新,今晚上传太慢)

系统运行:

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

1. 数据库部分:

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

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

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

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

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

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

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

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数据” ,即可分割数据,分割完成后会给出下面的提示:

,后台也会提示数据分割完成!

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

2)云平台验证:

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

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

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

3. 云平台算法部分

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

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

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

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

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

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

2)调用协同过滤算法

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

运行过程1:

运行过程2:

运行过程3:

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

3) 调用单用户推荐

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

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

4) 新用户推荐界面:

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

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

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

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

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

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 ;
    }

以上,如有疑问,可发邮件到fansy1990@foxmail.com , 欢迎交流。。。

分享,成长,快乐

脚踏实地,专注

转载请注明blog地址:http://blog.csdn.net/fansy1990

时间: 2024-11-04 01:02:09

Mahout案例实战--Dating Recommender 系统的相关文章

【案例实战】餐饮企业分店财务数据分析系统解决方案:系统功能开发

[案例实战]餐饮企业分店财务数据分析系统解决方案:系统功能开发 建设目的 某餐饮集团需要将每个分店的财务状况进行分析,目前使用的是excel来存储查看各区域的收入情况,每个区域各年月的收入情况汇总数据都是通过多sheet的方式展示,由于此餐饮集团是一个比较大型的餐饮集团,很多区域都有分店.所以,单是针对收入情况,就需要做很多个excel来进行收入情况汇总存储.这样导致查询历史数据非常麻烦.不利于数据的存档规整.制作成本太高,浪费有效人力资源等很多弊端,因此采用数据分析系统来解决这些弊端. 业务需

【案例实战】餐饮企业分店財务数据分析系统解决方式:业务需求

[案例实战]餐饮企业分店財务数据分析系统解决方式:业务需求 一.建设目的 某餐饮集团须要将每一个分店的財务状况进行分析,眼下使用的是excel来存储查看各区域的收入情况,每一个区域各年月的收入情况汇总数据都是通过多sheet的方式展示,因为此餐饮集团是一个比較大型的餐饮集团,非常多区域都有分店.所以,单是针对收入情况,就须要做非常多个excel来进行收入情况汇总存储.这样导致查询历史数据非常麻烦.不利于数据的存档规整.制作成本太高,浪费有效人力资源等非常多弊端.因此採用数据分析系统来解决这些弊端

基于大数据技术推荐系统算法案例实战视频教程(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

(升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课程会涵盖Scala编程详解.Spark核心编程.Spark SQL和Spark Streaming.Spark内核以及源码剖析.性能调优.企业级案例实战等部分.完全从零起步,让学员可以一站式精通Spark企业级大数据开发,提升自己的职场竞争力,实现更好的升职或者跳槽,或者从j2ee等传统软件开发工程

Hadoop Mahout数据挖掘实战视频教程

深入浅出Hadoop Mahout数据挖掘实战(算法分析.项目实战.中文分词技术) 适合人群:高级 课时数量:17课时 用到技术:MapReduce并行分词程序 Mahout 涉及项目:Hadoop综合实战-文本挖掘项目 Mahout数据挖掘工具 咨询QQ:1840215592 课程介绍 本课程主要涉及以下内容的讲解: 1.Mahout数据挖掘工具 2.Hadoop实现推荐系统的综合实战,涉及到MapReduce.Pig和Mahout的综合实战 课程针对人群 1.本课程适合于有一定java基础知

《图解CSS3:核心技术与案例实战》

<图解CSS3:核心技术与案例实战> 基本信息 作者: 大漠 丛书名: Web开发技术丛书 出版社:机械工业出版社 ISBN:9787111469209 上架时间:2014-7-2 出版日期:2014 年7月 开本:16开 页码:486 版次:1-1 所属分类:计算机 > 数码/设计 > CSS 更多关于>>> <图解CSS3:核心技术与案例实战> 编辑推荐 资深Web前端专家历时两载的经验与心血之作,旨在根据最新CSS3规范撰写最权威的CSS3学习资

第93讲:Spark Streaming updateStateByKey案例实战和内幕源码

本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战 二.Spark Streaming updateStateByKey源码解密 第一部分: updateStateByKey它的主要功能是随着时间的流逝,在Spark Streaming中可以为每一个key可以通过CheckPoint来维护一份state状态,通过更新函数对该key的状态不断更新:在更新的时候,对每一个新批次的数据(batch)而言,Spark Streaming通过使用upda

福大软工1816 &#183; 团队现场编程实战(抽奖系统)

福大软工1816 · 团队现场编程实战(抽奖系统) 队员职责分工 团队成员 分工 张扬 预处理算法.抽奖算法.解决其他问题.本次博客撰写 韫月 "创建抽奖活动"页面的开发."已发布""已结束"等页面的动态生成 愈明 "创建抽奖活动"页面的开发.弹窗交互 文婧 "已发布"."已结束"页面的开发 地秀 "已发布"."已结束"页面的开发 全炯 各个页面的

Power BI教程_Power BI数据分析快速上手及案例实战

Power BI数据分析快速上手及案例实战 课程学习地址:http://www.xuetuwuyou.com/course/194 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本课程在<Power BI 数据分析快速上手>基础上结合大量的实例,深入讲解PowerBI中看似难懂的各种概念.操作, 并结合行业中的典型案例贯穿了从初级的数据透视表工具.数据透视表选项.数据透视表的刷新.数据透视表中的排序,到中级的动 态数据透视表的创建.数据透视表函数 GETPI