java调用Linux mahout,Mahout算法调用展示平台2.1

问题导读

1、如何使用Web工程调用Mahout的相关算法?

2、Mahout的相关算法有哪些?

3、推荐算法使用item的什么?

thread-10591-1-1.html

软件版本:

windows7: Tomcat7、JDK7、Spring4.0.2、Struts2.3、Hibernate4.3、myeclipse10.0、easyui;Linux(centos6.5):Hadoop2.4、Mahout1.0、JDK7;

使用Web工程调用Mahout的相关算法,提供监控,查看任务的执行状态。

自建Web项目,项目首页如下:

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (37.38 KB, 下载次数: 10)

2014-12-12 22:30 上传

1. 准备

项目可以在http://download.csdn.net/detail/fansy1990/7600427(第一部分)、http://download.csdn.net/detail/fansy1990/7600463(第二部分)、http://download.csdn.net/detail/fansy1990/7600489(第三部分)下载。

Hadoop使用官网提供的2.4版本,直接下载即可,然后配置(配置这里不再赘述)、启动各个服务,使用jps,可以看到下面的服务:

[root@node33 data]# jps

6033 NodeManager

5543 NameNode

5629 DataNode

5942 ResourceManager

41611 Jps

5800 SecondaryNameNode

6412 JobHistoryServer复制代码

1.1 Hadoop包

可以使用eclipse新建一个java项目,然后导入Hadoop的包,测试是否可以连接集群,导入的包如下:

6cbb977928e529ff6f0e46249f365cb1.gif

2.png (69.11 KB, 下载次数: 10)

2014-12-12 22:30 上传

修改红色框里面的mapred-default.xml、yarn-default.xml中的如下配置(node33是伪分布式Hadoop集群机器的机器名):

mapred-default.xml:

mapreduce.jobhistory.address

node33:10020

MapReduce JobHistory Server IPC host:port

yarn-default.xml:复制代码

yarn.application.classpath

$HADOOP_CONF_DIR,

$HADOOP_COMMON_HOME/share/hadoop/common/*,

$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,

$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,

$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,

$HADOOP_YARN_HOME/share/hadoop/yarn/*,

$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*

yarn.resourcemanager.hostname

node33复制代码

注意classpath的路径是集群的相应路径;

还有是新建YARNRunner文件,参考:http://blog.csdn.net/fansy1990/article/details/27526167。

首先这样测试,看是否可以连接集群(直接运行一个MR任务,看是否执行),如果不行,肯定是有地方没有设置对。

1.2 Mahout包

导入Mahout的包,Mahout的包获取采用官网提供的方式,自行使用git下载,编译得到,参考:http://mahout.apache.org/developers/buildingmahout.html(注意选择使用Hadoop2的方式,由于这里使用的是2.4 ,所以

mvn -Dhadoop2.version=2.4.1 -DskipTests clean install

)导入的包有:

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (40.11 KB, 下载次数: 8)

2014-12-12 22:31 上传

新建文件进行测试,看调用Mahout的算法包是否可以正常运行,并不会报不兼容JobContext和Job不兼容的错误,如果报错,说明编译有问题(可以下载lz编译好的)

2.配置

项目可以在 http://download.csdn.net/detail/fansy1990/7600427(第一部分)、http://download.csdn.net/detail/fansy1990/7600463(第二部分)、http://download.csdn.net/detail/fansy1990/7600489(第三部分)下载,下载后需要配置:

2.1 Hadoop相关配置

(1)在1.准备中的把对应的node33改为自己的机器名;

(2)去掉工程中WebRoot/lib/mahout-*-job.jar 中去掉javax.servlet 和javax.el目录(不然无法启动Tomcat,如果是自己编译的话,如果是下载的则不用,已经去掉了);

(3)修改工程中src/com/fz/util/HadoopUtils文件中的node33以及端口号改为自己的集群机器名/IP和端口;

(4)把工程src目录的所有文件打jar包上传到云平台mapreduce目录下(否则会报类找不到的错误,lib目录下面的mh2.1.jar);

2.2 数据库相关配置

修改工程中Configuration/db.properties文件中数据库相应配置(数据库暂时没有使用到);

2.3 Tomcat部署

tomcat部署使用配置文件的方式:

path ="/mh"  docBase ="D:\workspase\hadoop_hbase\MahoutAlgorithmPlatform2.1\WebRoot"

privileged ="true"  reloadable ="false"  >

复制代码

项目部署名使用mn。

3. 功能

功能主要包括四个方面:集群配置、集群算法监控、Hadoop模块、Mahout模块,data目录提供测试数据;

3.1 集群配置模块

启动工程,打开浏览器访问http://localhost:8080/mh ,即可访问项目,首页看到的即是集群配置。这里需要说明的是在src/com/fz/util/HadoopUtils中不一定要修改,可以在集群配置页面中进行配置亦可;

验证集群是否可以连接的代码:

public int checkConnection(String fsStr,String rm) throws IOException{

Configuration conf = new Configuration();

conf.set("fs.defaultFS", fsStr);

conf.set("yarn.resourcemanager.address", rm);

conf.set("mapreduce.framework.name", "yarn");

FileSystem fs = FileSystem.get(conf);

boolean fsOnline=fs.exists(new Path("/"));

if(!fsOnline){

return 1;

}

JobClient jc = new JobClient(conf);

ClusterStatus cs = jc.getClusterStatus();

if(!"RUNNING".equals(cs.getJobTrackerStatus().toString())){

return 0;

}

// 集群验证成功

HadoopUtils.setConf(conf);

HadoopUtils.setFs(fs);

// 通过判断Hadoop.getConf()是否为null来确定是否已经配置过集群

return 3;

}复制代码

主要通过两个方面:1、检查HDFS文件;2、检查集群状态是否是running;

配置完成后,点击验证,如果验证成功,即可提示验证成功:

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (2.98 KB, 下载次数: 7)

2014-12-12 22:32 上传

3.2集群算法监控模块

在集群配置中,点击验证成功后,就会在任务监控页面不停的发送消息,获取集群任务运行的状态(间隔1.2秒,Ajax方式);

当没有任务运行的时候,获取任务运行状态,会直接返回null。在Mahout模块或者Hadoop模块运行MR任务的时候,如果任务成功提交,那么首先会根据此次提交运行的MR任务的个数初始化任务信息类。初始化,做的工作就是找到当前已经运行的任务的ID,然后初始化接下来要运行任务的ID,如下代码:

public static void initialCurrentJobs(int nextJobNum) throws IOException{

/*if(list!=null&&list.size()==10){

list.clear();

}*/

list.clear(); // 清空上次遗留

JobStatus[] jbs=getJc().getAllJobs();

JobID jID = findLastJob(jbs).getJobID();

if(jID==null){

// the first time start the cluster , will be fixed next time

// TODO fix the bug

log.info("The cluster is started before and not running any job !!!");

}

log.info("The last job id is :{}", jID.toString());

for(int i=1;i<=nextJobNum;i++){

CurrentJobInfo cj = new CurrentJobInfo();

cj.setJobId(new JobID(jID.getJtIdentifier(),jID.getId()+i));

list.add(cj);

}

}复制代码

这里需要注意的是,如果集群是第一次启动,且没有运行MR任务的话,那么获取的任务ID为空,无法初始化(这个在下个版本修复);

获取当前运行任务的代码如下:

public static List getCurrentJobs() throws IOException{

for(int i=0;i

CurrentJobInfo iJob = list.get(i);

RunningJob runningJob =findGivenJob(iJob.getJobId().toString());

if(runningJob==null){

break;

}

if(i==list.size()-1){ // 放在设置的前面

finished=runningJob.isComplete();

}

iJob.setJobName(runningJob.getJobName());

iJob.setJobIdStr(runningJob.getJobStatus().getJobID().toString());

iJob.setMapProgress(Utils.toPercent(runningJob.mapProgress(),2));

iJob.setRedProgress(Utils.toPercent(runningJob.reduceProgress(), 2));

iJob.setState(JobStatus.getJobRunState(runningJob.getJobState()));  // 有时map和reduce都到1时,此值仍是Running,需处理

}

return list;

}复制代码

获取到任务信息后,在任务监控界面就可以监控到任务的运行状态。

3.3 Hadoop模块

Hadoop模块目前包括5个小功能:上传、下载、读取、读取聚类中心点、文本转换为序列向量文件。

3.3.1 上传、下载

上传下载都使用FileSystem的方法,分别是copyFromLocal 和copyToLocal 。界面只有两个参数:

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (8.57 KB, 下载次数: 9)

2014-12-12 22:32 上传

3.3.2 读取、读取聚类中心点

读取是按照每行数据来读取的,可以选择读取的行数;读取聚类中心,则是直接读取序列文件;

读取聚类中心向量代码如下:

/**

* 读取聚类中心向量

* @param conf

* @param centerPathDir

* @return

* @throws IOException

*/

public static String readCenter(Configuration conf,String centerPathDir) throws IOException{

StringBuffer buff = new StringBuffer();

Path input = new Path(centerPathDir, "part-*");

if(!HadoopUtils.getFs().exists(input)){

return input+" not exist ,please check the input";

}

for(ClusterWritable cl:new SequenceFileDirValueIterable(input, PathType.GLOB, conf)){

buff.append(cl.getValue().asFormatString(null)).append("\n");

}

return buff.toString();

}复制代码

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (16.1 KB, 下载次数: 7)

2014-12-12 22:33 上传

3.3.3文本转换为序列向量

这个功能点是一个MR任务,提交任务后,可以在任务监控模块看到任务监控。主要的功能是把文本文件转换为序列向量,为聚类提供输入数据。需设置文本分隔符:

6cbb977928e529ff6f0e46249f365cb1.gif

3.png (15.8 KB, 下载次数: 7)

2014-12-12 22:33 上传

监控信息:

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (14.68 KB, 下载次数: 7)

2014-12-12 22:34 上传

3.4 Mahout模块

Mahout算法模块主要是调用Mahout算法库中相关算法,然后监控算法运行状态;

3.4.1 聚类算法

聚类算法暂时使用kmeans算法,提供算法相关参数(数据在data目录的wine_kmeans.txt):

6cbb977928e529ff6f0e46249f365cb1.gif

2.png (20.24 KB, 下载次数: 9)

2014-12-12 22:34 上传

这里提交任务使用多线程提交,这样可以方便监控;

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (21.68 KB, 下载次数: 6)

2014-12-12 22:35 上传

3.4.2 分类算法

分类算法暂时使用随机森林算法(数据在data/galss.txt);

分为两个部分,建树、测试;建树使用MR算法,测试使用单机模式;

建树输出模型路径使用相对路径,使用绝对路径会报错!

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (19.58 KB, 下载次数: 6)

2014-12-12 22:35 上传

点击确定,打开任务监控页面,查看任务提交情况:

6cbb977928e529ff6f0e46249f365cb1.gif

1.png (15.4 KB, 下载次数: 10)

2014-12-12 22:36 上传

测试随机森林,可以看到随机森林的参数以及测试数据的正确率和模糊矩阵;

6cbb977928e529ff6f0e46249f365cb1.gif

2.png (20.71 KB, 下载次数: 7)

2014-12-12 22:36 上传

3.4.3 推荐算法

推荐算法使用item的RecommenderJob,设置参数,提交任务:

6cbb977928e529ff6f0e46249f365cb1.gif

3.png (19.16 KB, 下载次数: 17)

2014-12-12 22:36 上传

点击确定,成功提交任务后,可以查看监控:

6cbb977928e529ff6f0e46249f365cb1.gif

4.png (31.12 KB, 下载次数: 8)

2014-12-12 22:37 上传

3.5 帮助模块

在首页的右边,可以看到三个帮助页面,可以获取不同模块的帮助信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值