Hadoop Web项目--Mahout0.10 MR算法集锦

来源:互联网 发布:网络的利与弊作文600 编辑:程序博客网 时间:2024/05/22 14:10

目录(?)[+]

1. 涉及技术及下载

项目开发使用到的软件有:Myeclipse2014,JDK1.8,Hadoop2.6,MySQL5.6,EasyUI1.3.6,jQuery2.0,Spring4.1.3,Hibernate4.3.1,Struts2.3.1,Maven3.2.1,Mahout0.10。 
项目下载地址:https://github.com/fansy1990/mahout1.0,项目部署参考:http://blog.csdn.net/fansy1990/article/details/46481409 。

2. 项目介绍

此项目是在Hadoop Web项目–Friend Find系统 基础之上整理Mahout0.10版本中MR程序的调用测试而成,重点演示如何调用Mahout0.10的MR算法、如何把MR算法嵌入到Web项目中,附带数据生成及数据查看、MR 任务监控等功能。 
Mahout0.10的MR算法主要参考下面的文件: 
driver.classes.default.props 
此文档里面含有了覆盖常用工具类、聚类算法、分类算法、推荐算法等的MR调用mahout命令以及其对应的实现类。 
此篇博客接下来将按照下面的内容进行编写:

  1. 项目部署及运行;
  2. 项目实现原理;
  3. 如何进行项目二次开发;
  4. 项目目前功能简单介绍;
  5. 总结;

3. 项目部署及运行

3.1 下载、部署

  1. 下载工程,参考上面的连接https://github.com/fansy1990/mahout1.0,并参考http://blog.csdn.net/fansy1990/article/details/46481409把它部署到Tomcat上;
  2. (默认,在上面步骤中已经配置好了mysql数据库,数据库的配置参考src/main/resources/db.properties文件)这里直接在Tomcat上运行项目,即可初始化好mysql对应的数据表(这里只有一个,即Hadoop集群配置表),打开浏览器在左边导航栏访问Hadoop集群配置表页面,进行配置(配置自己的集群);或直接在mysql数据库中进行配置即可。配置项包括(这里默认是使用node101机器的配置):

mapreduce.app-submission.cross-platform=true 
fs.defaultFS=hdfs://node101:8020 
mapreduce.framework.name=yarn 
yarn.resourcemanager.address=node101:8032 
yarn.resourcemanager.scheduler.address=node101:8030 
mapreduce.jobhistory.address=node101:10020

3.2 注意事项

  1. 设置Hadoop云平台系统linux的时间和运行tomcat的机器的时间一样,因为在云平台任务监控的时候使用了时间作为监控停止的信号。否则,监控模块将会有问题。
  2. 此项目中并没有开发任何MR程序,所以不需要拷贝源码到Hadoop的lib目录(如果在进行二次开发时,开发了相关的MR,则需要拷贝); 
    项目部署好后,访问项目url,即可看到下面的界面: 
    项目首页

4. 实现原理

项目组织架构: 
项目组织架构

4.1 页面框架

页面采用html+jQuery+easyUI开发,整个页面使用easyUI的layout标签,左边导航栏使用easyUI的tree标签,其数据使用json格式存储在src\main\webapp\tree_data.json文件中。 
针对某个页面,其json配置如下:


“id”:152, 
“text”:”fkmeans+”, 
“attributes”:{ 
“folder”:”0”, 
“url”:”clustering/fuzzykmeans.jsp” 

}

这样在点击左边导航栏fkmeans+导航时,即可在右边弹出clustering/fuzzykmeans.jsp页面。其js代码如下:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#navid'</span>).tree({        <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(0, 136, 0);">onClick</span>: <span class="hljs-reserved" style="box-sizing: border-box;">function</span>(node){<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span>          alert(node.text+<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">","</span>+node.url);  <span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">//</span> alert node text property <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">when</span> clicked            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">console</span>.info(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"click:"</span>+node.text);            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(node.attributes.folder==<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'1'</span>){                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> ;            }            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">console</span>.info(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"open url:"</span>+node.attributes.url)               <span class="hljs-reserved" style="box-sizing: border-box;">var</span> url;            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (node.attributes.url) {                url = node.attributes.url;            } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {                url = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'404.jsp'</span>;            }            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">console</span>.info(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"open "</span>+url);            layout_center_addTabFun({                title : node.text,                closable : <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>,                iconCls : node.iconCls,                href : url            });        }    }); </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

其中 layout_center_addTabFun函数如下:

function layout_center_addTabFun(opts) { 
var t = $(‘#layout_center_tabs’); 
if (t.tabs(‘exists’, opts.title)) { 
t.tabs(‘select’, opts.title); 
} else { 
t.tabs(‘add’, opts); 

console.info(“打开页面:”+opts.title); 
}

这个函数主要是判断右边窗口是否有名字为给定title的页面,如果没有,则打开这个页面。 
js全部代码如下: 
js组织

其中basic.js是首页的js文件,包含一些公共的js函数等;hconstants.js主要是针对Hadoop配置表进行的操作;jquery*.js对应的两个文件为jQuery的必须文件;mr*.js对应则是MR不同类别算法对应的js处理文件;preprocess.js为数据构造、数据查看的js处理;

4.2 请求提交逻辑

请求提交主要包括:MR算法任务提交,非MR算法任务提交,其他请求提交。这里都采用统一的提交逻辑,如下: 
请求提交逻辑

4.2.1 页面提交

这里所有页面提交都直接使用easyUI的< a > 标签,同时在js里面绑定其提交的点击触发函数。在函数里面需要首先获取页面参考(如果是MR监控任务,则需要先判断是否已经有监控页面,需要提示关闭当前监控页面),接着弹出框提示正在执行,最后统一提交到公共函数callByAJax中。这里列举三种提交的典型js代码: 
1. 提交MR任务个数固定的MR任务

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//evaluateFactorization---</span>    $(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#evaluateFactorization_submit'</span>).bind(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'click'</span>, <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>{</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 检查是否有“MR监控页面”,如果有,则退出,并提示关闭</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(exitsMRmonitor()){            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> ;        }           <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> input=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#evaluateFactorization_input'</span>).val();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> output=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#evaluateFactorization_output'</span>).val();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> userFeatures=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#evaluateFactorization_userFeatures'</span>).val();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> itemFeatures=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#evaluateFactorization_itemFeatures'</span>).val();        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 弹出进度框</span>        popupProgressbar(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'推荐MR'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'evaluateFactorization任务提交中...'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>);        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ajax 异步提交任务  </span>        callByAJax(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'cloud/cloud_submitJob.action'</span>,{algorithm:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"EvaluateFactorizationRunnable"</span>,jobnums:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'1'</span>,       arg1:input,arg2:output,arg3:userFeatures,arg4:itemFeatures});           });    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ------evaluateFactorization</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

2 提交MR个数不固定的MR任务

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// kmeans---</span>    $(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_submit'</span>).bind(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'click'</span>, <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>{</span>        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 检查是否有“MR监控页面”,如果有,则退出,并提示关闭</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(exitsMRmonitor()){            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> ;        }           <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> input=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_input'</span>).val();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> output=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_output'</span>).val();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> clusters=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_clusters'</span>).val();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> k=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_k'</span>).val();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> convergenceDelta=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_convergenceDelta'</span>).val();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> maxIter=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_maxIter'</span>).val();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> clustering=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_clustering'</span>).combobox(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"getValue"</span>);        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> distanceMeasure=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#kmeans_distanceMeasure'</span>).combobox(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"getValue"</span>);        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> jobnums_=<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">parseInt</span>(k); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 一共的MR个数</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span>==clustering){            jobnums_=jobnums_+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;        }        jobnums_=jobnums_+<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 弹出进度框</span>        popupProgressbar(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'聚类MR'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'kmeans任务提交中...'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>);        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ajax 异步提交任务</span>        callByAJax(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'cloud/cloud_submitIterMR.action'</span>,{algorithm:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"KMeansDriverRunnable"</span>,jobnums:jobnums_,            arg1:input,arg2:output,arg3:clusters,arg4:k,    arg5:convergenceDelta,arg6:maxIter,arg7:clustering,arg8:distanceMeasure});    });    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ------kmeans</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>

这里把不定MR个数的任务和定MR个数的任务区分开来了,其实是可以不用区分的,因为在返回结果都是一个Map,根据map结果来进行操作的。不过需要在不同的实现中设置标志位(具体参考下面的实现分析) 
3 提交非MR任务

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#upload_submit'</span>).bind(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'click'</span>, <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span>{</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> input=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#upload_input'</span>).val();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> output=$(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'#upload_output'</span>).val();        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 弹出进度框</span>        popupProgressbar(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'数据上传'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'数据上传中...'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>);        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ajax 异步提交任务</span>        callByAJax(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'cloud/cloud_submitJobNotMR.action'</span>,{algorithm:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Upload'</span>,            arg1:input,arg2:output});    });</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

这里要注意MR任务和非MR任务是需要区分的,因为非MR任务使用的是同步模式(这里同步模式不是指aJax的同步,而是指实现方式),即用户点击后,会一直弹出正在处理的提示,然后等后台处理完成,返回结果才会关闭弹窗,同时把结果直接展现在原网页。但是MR的任务会启动多线程,当多线程成功启动后,直接关闭提示框,同时打开MR任务监控页面,开启页面定时刷新任务,向后台获取任务执行情况信息。 
callByAJax函数如下:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 调用ajax异步提交</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 任务返回成功,则提示成功,否则提示失败的信息</span>function callByAJax(url,data_){    $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>ajax({        url : url,        <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>: data_,        async:<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>,        dataType:<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"json"</span>,        context : document<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>body,        success : function(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span>) {            closeProgressbar();            console<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>info(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"close the progressbar,flag:"</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>flag);            <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span> retMsg;            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>flag){                retMsg<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'操作成功!'</span>;                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(typeof <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>return_show <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!=</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"undefined"</span>){<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 读取文件</span>                    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span> return_id <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"#"</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>return_show<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//                  var obj=document.getElementById(data.return_show);</span>                    $(return_id)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>html(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>return_txt);                    console<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>info(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'defined:'</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>return_show);                }            }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{                retMsg<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'操作失败!'</span>;                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(typeof <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>return_show <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">!=</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"undefined"</span>){<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 读取文件</span>                    <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">var</span> return_id <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"#"</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>return_show<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>;                    $(return_id)<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>html(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>msg);                }            }            $<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>messager<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>show({                title : <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'提示'</span>,                msg : retMsg            });            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>flag<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">&&</span><span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">==</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">data</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>monitor){<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 添加监控页面</span>                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 使用单独Tab的方式</span>                layout_center_addTabFun({                    title : <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'MR算法监控'</span>,                    closable : <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>,                    href : <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'monitor/monitor.jsp'</span>                });            }        }    });}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li></ul>

4.2.2 MR实现

所有的MR任务提交到Action后,都会启动一个线程来专门运行MR任务,这样就可以直接返回前台页面,提示任务已经成功提交。 
Action中对应的代码如下:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**     * 提交变jobnum的任务,暂未添加     *      */</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">submitIterMR</span>(){        Map<String ,Object> map = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HashMap<String,Object>();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//提交一个Hadoop MR任务的基本流程</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1. 设置提交时间阈值,并设置这组job的个数</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//使用当前时间即可,当前时间往前10s,以防服务器和云平台时间相差</span>                    HUtils.setJobStartTime(System.currentTimeMillis()-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10000</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// </span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 由于不知道循环多少次完成,所以这里设置为最大值,</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 当所有MR完成的时候,在监控代码处重新设置JOBNUM;</span>            HUtils.setALLJOBSFINISHED(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);            HUtils.JOBNUM=Integer.parseInt(jobnums);            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2. 使用Thread的方式启动一组MR任务</span>            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2.1 生成Runnable接口</span>            RunnableWithArgs runJob = (RunnableWithArgs) Utils.getClassByName(                    Utils.THREADPACKAGES+algorithm);            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2.2 设置参数</span>            runJob.setArgs(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> String[]{arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11});            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2.3 启动Thread</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Thread(runJob).start();            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 3. 启动成功后,直接返回到监控,同时监控定时向后台获取数据,并在前台展示;</span>            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"flag"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span>);            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"monitor"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span>);        } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (Exception e) {            e.printStackTrace();            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"flag"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"false"</span>);            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"monitor"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"false"</span>);            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"msg"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"任务启动失败!"</span>);        }        Utils.write2PrintWriter(JSON.toJSONString(map));    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li></ul>

这里采用统一接口把所有的提交都整合到一个函数中,算法参数采用匿名的方式,不管前台传送了多少个,都用所有的参数来接收。然后使用Java反射来生成实际执行任务的类,并启动多线程。最后返回的map数据根据需要需要设置监控的flag为true(和callByAJax函数中的标识对应)。

所有MR任务都必须实现下面的接口:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** * 带有参数的Runnable接口 *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @author</span> fansy *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @date</span> 2015-8-4 */</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">RunnableWithArgs</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Runnable</span> {</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">abstract</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">setArgs</span>(String[] args);}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

该接口有两点需要注意,其一,它继承了Runnable接口;其二,它自定义了一个setArgs函数; 
下面来看一个实现,以kmeans算法的调用为例:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @author</span> fansy *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @date</span> 2015-8-4 */</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">KMeansDriverRunnable</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">implements</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">RunnableWithArgs</span> {</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String input;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String output;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String clusters;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String k;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String convergenceDelta;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String maxIter;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String clustering;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String  distanceMeasure;    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() {        String[] args=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span>.equals(clustering)){            args=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> String[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">17</span>];            args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-cl"</span>;        }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>{            args= <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> String[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>];        }        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-i"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]=input;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-o"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>]=output;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-c"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>]=clusters;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-k"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>]=k;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-cd"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>]=convergenceDelta;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-x"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">11</span>]=maxIter;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-dm"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">13</span>]=distanceMeasure;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"--tempDir"</span>;        args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>]=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"temp"</span>;        Utils.printStringArr(args);        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {            HUtils.delete(output);            HUtils.delete(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"temp"</span>);            HUtils.delete(clusters);            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ret = ToolRunner.run(HUtils.getConf()   ,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> KMeansDriver() , args);            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(ret==<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>){<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 所有任务运行完成</span>                HUtils.setALLJOBSFINISHED(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>);            }        } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (Exception e) {            e.printStackTrace();            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 任务中,报错,需要在任务监控界面体现出来</span>            HUtils.setRUNNINGJOBERROR(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>);            Utils.simpleLog(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"KMeansDriver任务错误!"</span>);        }    }    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">setArgs</span>(String[] args) {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.input=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.output=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.clusters=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.k=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.convergenceDelta=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.maxIter=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.clustering=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.distanceMeasure=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>];    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li></ul>

首先,这里需要实现setArgs函数,这个函数就是把匿名的算法参数全部实名化(实际上,这里可以不用这一步操作的,但是为了代码的可读性,还是建议这样做)。接着,在run函数中,根据传进来的算法参数构造MR算法需要使用的算法参数,然后直接提交MR任务即可。 
这里需要注意: 
1. 当任务运行出错时需要设置标志位,方便在任务监控时,前台向后台获取任务状态信息时,提示错误; 
2. 固定个数的MR任务和非固定个数的MR任务的不同点是当非固定个数的MR提前运行完成(比如kmeans算法如果设置了循环次数为10,那么假如当循环次数达到了8次时,其阈值满足条件,退出了循环),那么就要实时更改MR任务的次数(非固定个数MR任务最开始设置任务全部个数是按照最大值来设置的),并设置相关标识,即不用再进行监控。

4.2.3 非MR实现

与MR实现类似,非MR实现的Action函数如下:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**     * 提交非MR的任务     * 算法具体参数意思对照jsp页面理解,每个实体类会把arg1~arg11 转换为实际的意思     *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @throws</span> ClassNotFoundException      *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @throws</span> IllegalAccessException      *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @throws</span> InstantiationException      */</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">submitJobNotMR</span>() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> InstantiationException, IllegalAccessException, ClassNotFoundException{        Map<String ,Object> map = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HashMap<String,Object>();        INotMRJob runJob = (INotMRJob) Utils.getClassByName(                Utils.THREADNOTPACKAGES+algorithm);        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2.2 设置参数</span>        runJob.setArgs(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> String[]{arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,arg11});        map= runJob.runJob();        Utils.write2PrintWriter(JSON.toJSONString(map));        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> ;    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

所有非MR任务都要实现INotMRJob接口,该接口定义如下:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** * 提交非MR任务的基类 *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @author</span> fansy *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @date</span> 2015年8月5日 */</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">interface</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">INotMRJob</span> {</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">setArgs</span>(String[] args);    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Map<String,Object> <span class="hljs-title" style="box-sizing: border-box;">runJob</span>();}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

两个函数分别对应RunnableWithArgs的两个函数。 
一个读取HDFS文件的具体实现如下:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** * 读取HDFS txt文件 *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @author</span> fansy *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @date</span> 2015年8月5日 */</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">ReadTxt</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">implements</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">INotMRJob</span> {</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String input;    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> String lines;    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">setArgs</span>(String[] args) {        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.input=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>];        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.lines=args[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];    }    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> Map<String, Object> <span class="hljs-title" style="box-sizing: border-box;">runJob</span>() {        Map<String ,Object> map = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HashMap<String,Object>();        String txt =<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>;        map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"return_show"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"readtxt_return"</span>);        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span>{            txt = HUtils.readTxt(input, lines, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<br>"</span>);            txt =<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"文件的内容是:<br>"</span>+txt;            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"flag"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span>);                map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"return_txt"</span>, txt);        }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span>(Exception e){            e.printStackTrace();            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"flag"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"false"</span>);            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"monitor"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"false"</span>);            map.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"msg"</span>, input+<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"读取失败!"</span>);        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> map;    }}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul>

4.2.4 结果返回

非MR任务结果返回直接在原网页展示,在callByAJax中判断相应的标志位如果不为空,那么就是需要展示在原网页的,原网页中必须有相应的组件来显示,比如下面的网页代码:

<code class="hljs applescript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">div</span> <span class="hljs-property" style="box-sizing: border-box;">id</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"upload_return"</span> style=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"padding-left: 30px;font-size: 20px;padding-top:10px;"</span>></<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">div</span>></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

MR的任务则会开启监控,在监控页面展现任务的执行情况。

5. 二次开发

二次开发实际就是在此版本的基础上添加自己的功能而已。一共包含下面几个步骤: 
1. 编写测试函数 
比如要添加一个fuzzykmeans的算法,那么就在src/test/java里面编写测试函数,如下: 
fuzzykmeans测试函数

编写测试函数的主要目的是,研究算法的参数以及输入数据的格式等。 
2. 添加json导航栏数据 
在tree_data.json中添加对应的算法,如下: 
tree_data.json添加算法
3. 编写页面 
参考1.中的所有算法需要参数来编写jsp页面,如下图: 
jsp页面
4. 编写页面处理js 
根据jsp页面中的按钮,来编写按钮的触发事件,如下: 
js触发事件
5. 实现请求提交接口实现 
编写请求提交接口的实现分为两种,如果是MR任务则实现RunnableWithArgs接口,如果是非MR任务则实现INotMRJob接口即可。如下图所示: 
接口实现
6. 运行项目并测试 
打开浏览器,访问刚开发的功能,点击页面中的按钮进行测试,如下: 
算法界面

6. 项目功能介绍

  1. Hadoop集群配置连接查看、修改 
    集群配置

在这里可以进行集群参数的配置,主要是连接Hadoop集群的参数; 
2. 数据构造和查看 
文件上传界面如下: 
文件上传

文件上传主要包括两个功能,其一就是把本地文件上传到HDFS文件;其二就是针对各个算法的数据初始化,这里的初始化基本都是把本地文件(这些文件在src/main/resources/data中已经存在)上传到HDFS指定目录,这里关于目录构造可以参考Upload.java文件:

/** 
* 数据上传 
* 统一命名: 
上传本地文件:WEB-INF/classes/data//. 
上传HDFS文件:/user/root///input. 
* @author fansy 
* @date 2015年8月5日 
*/

其他的基本是数据查看之类的,最后一个分类数据生成,是针对输入数据需要是序列化的数据,所以这里直接生成序列化数据在HDFS指定的目录即可。 
3. 相关Mahout算法 
相关MR算法中,页面都有默认的参数,比如: 
mr算法

这里的输入数据路径是根据前面Upload里面生成的路径是一致的,有些MR算法需要先运行其他MR算法,然后才能运行,这时其输入路径就是上一个MR算法对应的输出了。

7. 总结

  1. Mahout MR算法调用其实并不难,难在了解算法的输入数据格式、算法的参数设置等;
  2. 本篇在 MR调用上面其实并没有很多内容,较多的是js的处理以及ssh框架的应用;
  3. 在MR的监控上面实现的思路也是可以借鉴的;
  4. 可以git该项目,然后自己编程实现某个算法的全部过程,这样学习起来乐趣更多(建议实现TrainLogistic相关);
  5. Mahout MR算法已经不再更新,建议可以在Hadoop MR的基础上学习Spark。

分享,成长,快乐

脚踏实地,专注

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

0 0
原创粉丝点击