• Mahout算法调用展示平台2.1


    软件版本号:

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

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

    自建Web项目。项目首页例如以下:


    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的包。測试能否够连接集群,导入的包例如以下:
    改动红色框里面的mapred-default.xml、yarn-default.xml中的例如以下配置(node33是伪分布式Hadoop集群机器的机器名):
    mapred-default.xml:
    <property>
      <name>mapreduce.jobhistory.address</name>
      <value>node33:10020</value>
      <description>MapReduce JobHistory Server IPC host:port</description>
    </property>
    yarn-default.xml:
    <name>yarn.application.classpath</name>
        <value>
    		$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/*
    	</value>
    <name>yarn.resourcemanager.hostname</name>
        <value>node33</value>
    注意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
    )导入的包有:
    新建文件进行測试,看调用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)去掉project中WebRoot/lib/mahout-*-job.jar 中去掉javax.servlet 和javax.el文件夹(不然无法启动Tomcat。假设是自己编译的话,假设是下载的则不用。已经去掉了);
    (3)改动project中src/com/fz/util/HadoopUtils文件里的node33以及port号改为自己的集群机器名/IP和port;
    (4)把projectsrc文件夹的全部文件打jar包上传到云平台mapreduce文件夹下(否则会报类找不到的错误。lib文件夹以下的mh2.1.jar);

    2.2 数据库相关配置

    改动project中Configuration/db.properties文件里数据库对应配置(数据库临时没有使用到)。

    2.3 Tomcat部署

    tomcat部署使用配置文件的方式:
    <Context
      path ="/mh"  docBase ="D:workspasehadoop_hbaseMahoutAlgorithmPlatform2.1WebRoot"  
      privileged ="true"  reloadable ="false"  >  
    </Context>
    

    项目部署名使用mn。

    3. 功能

    功能主要包含四个方面:集群配置、集群算法监控、Hadoop模块、Mahout模块。data文件夹提供測试数据。

    3.1 集群配置模块

    启动project,打开浏览器訪问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;
    配置完毕后,点击验证,假设验证成功。就可以提示验证成功:

    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<CurrentJobInfo> getCurrentJobs() throws IOException{
    		
    		
    		for(int i=0;i<list.size();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 。

    界面仅仅有两个參数:


    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<ClusterWritable>(input, PathType.GLOB, conf)){
    			buff.append(cl.getValue().asFormatString(null)).append("
    ");
    		}
    		return buff.toString();
    	}

    3.3.3文本转换为序列向量

    这个功能点是一个MR任务。提交任务后,能够在任务监控模块看到任务监控。基本的功能是把文本文件转换为序列向量,为聚类提供输入数据。

    需设置文本分隔符:


    监控信息:

    3.4 Mahout模块

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

    3.4.1 聚类算法

    聚类算法临时使用kmeans算法。提供算法相关參数(数据在data文件夹的wine_kmeans.txt):

    这里提交任务使用多线程提交,这样能够方便监控。

    3.4.2 分类算法

    分类算法临时使用随机森林算法(数据在data/galss.txt)。
    分为两个部分。建树、測试;建树使用MR算法,測试使用单机模式;
    建树输出模型路径使用相对路径。使用绝对路径会报错。

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

    測试随机森林。能够看到随机森林的參数以及測试数据的正确率和模糊矩阵;

    3.4.3 推荐算法

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

    点击确定。成功提交任务后,能够查看监控:

    3.5 帮助模块

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


    分享,成长,快乐

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




  • 相关阅读:
    2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest
    2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
    BZOJ5104 : Fib数列
    2017-2018 ACM-ICPC Southeast Regional Contest (Div. 1)
    2017 ACM Jordanian Collegiate Programming Contest
    BZOJ4910 : [Sdoi2017] 苹果树
    2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)
    BZOJ4912 : [Sdoi2017]天才黑客
    BZOJ4739 : 定向越野
    概率笔记11——一维正态分布的最大似然估计
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7118378.html
Copyright © 2020-2023  润新知