hadoop1.0.4,struct2.3。
本工程仿效hadoop 50030监控界面,取得任务信息,并显示出来。工程可以在http://download.csdn.net/detail/fansy1990/6737451下载。
一、先看效果吧:
1. 正在运行的任务:
从上面可以看到jobId为 job_201312181939_0002正在运行;
2. 运行失败:
上面可以看到job_201312181939_0004运行失败,其中的job_201312181939_0003因为输出目录重复,所以应该是没有提交,则会跳过3,这个错误暂时没有捕捉到;
3. 点击 “点我吧” 可以回到首页,如下:
点击“开始监控吧”,跳转到监控界面,如下:
这里可以看到监控界面的列表还是10个,不过第一个任务id已经是最新的了;
二、下面是设计思路:
1. 首先是获得最新的job信息:
InetSocketAddress jobTracker=new InetSocketAddress(HOST,JOBTRACKER_PORT);上面是获得所有的job信息(已经运行完成的),然后使用:
jobClient=new JobClient(jobTracker, getConf());
JobStatus[] jobStatusAll=jobClient.getAllJobs();
jobStatus=jobStatusAll[jobStatusAll.length-1];就可以获得最近完成的一个jobStatus了,但是这里有个问题,就是如果集群是第一次启动,那么jobStatusAll就是一个null,这样的话就需要拼凑一个jobid了,但是lz还没有找到方法;
2. 根据最新的jobid,来拼凑接下来的10个jobid,如下:
int id=jobStatus.getJobID().getId();log.info("initial monitorJobs with the start jobID :"+id);String jobIden=jobStatus.getJobID().getJtIdentifier();monitorJobs=new LinkedHashMap<String,JobInfo>();for(int i=0;i<jobNums;i++){String jobId= new JobID(jobIden,id+1+i).toString();monitorJobs.put(jobId, new JobInfo(jobId));}log.info("initial monitor jobs map done !!!");3. 第一次点击 “开始监控吧”,会提交到TransFormAction中;首先判断monitorJObs是否有值:
if(MonitorUtil.monitorJobs!=null&&MonitorUtil.monitorJobs.size()>0){没有的话,就调用2.的初始化,然后显示monitoring.jsp页面:
<table class="table"> <caption>任务监控</caption> <thead> <tr> <td id="tb-username">任务ID</td> <td>任务名</td> <td>map进度</td> <td>reduce进度</td> <td>任务状态</td> </tr> </thead> <tbody> <s:iterator id="list" value="jobInfosList"> <tr> <td> <s:property value="#list.jobId" /> </td> <td><s:property value="#list.jobName" /></td> <td><s:property value="#list.mapProgress" /></td> <td><s:property value="#list.redProgress" /></td> <td><s:property value="#list.runState" /></td> </tr> </s:iterator> </tbody> </table>这个页面就是struct2的标签 显示数据,在这个页面的最后,每隔3秒会向TransformAction提交一个请求:
<script type="text/javascript">delayURL("Monitor",3000);function delayURL(url, time) { setTimeout("location.href='" + url + "'", time);} </script>4. TransFormAction再次接收到请求后,monitorJobs就会有值了,这是就会实时的取得最新的jobStatus:
JobStatus jobStatus= MonitorUtil.getNewJobStatus();
/** * 获取最新的jobStatus * @return * @throws IOException */public static JobStatus getNewJobStatus() throws IOException{log.info("Getting the newest jobStatus ... ,job interval:"+JOB_INTERVAL);JobStatus[] jobStatusAll=new JobClient(new InetSocketAddress(HOST,JOBTRACKER_PORT), getConf()).getAllJobs();JobStatus jobStatus=jobStatusAll[jobStatusAll.length-1];return jobStatus;}然后根据jobStatus的runState进行monitorJObs的更新:
/** * 判断任务状态 */if(MonitorUtil.monitorJobs.containsKey(jobStatus.getJobID().toString())){String jobName=MonitorUtil.jobClient.getJob(jobStatus.getJobID()).getJobName();if(jobStatus.getRunState()==JobStatus.RUNNING){log.info("jobid:"+jobStatus.getJobID().toString()+",status:"+JobStatus.RUNNING);MonitorUtil.monitorJobs.put(jobStatus.getJobID().toString(), new JobInfo(jobStatus.getJobID().toString(),jobName,jobStatus.mapProgress(),jobStatus.reduceProgress(),"running"));}else if(jobStatus.getRunState()==JobStatus.FAILED){log.info("jobid:"+jobStatus.getJobID().toString()+",status:"+JobStatus.FAILED);MonitorUtil.monitorJobs.put(jobStatus.getJobID().toString(), new JobInfo(jobStatus.getJobID().toString(),jobName,jobStatus.mapProgress(),jobStatus.reduceProgress(),"failed"));}else if(jobStatus.getRunState()==JobStatus.PREP){log.info("jobid:"+jobStatus.getJobID().toString()+",status:"+JobStatus.PREP);}else if(jobStatus.getRunState()==JobStatus.SUCCEEDED){log.info("jobid:"+jobStatus.getJobID().toString()+",status:"+JobStatus.SUCCEEDED);MonitorUtil.monitorJobs.put(jobStatus.getJobID().toString(), new JobInfo(jobStatus.getJobID().toString(),jobName,jobStatus.mapProgress(),jobStatus.reduceProgress(),"successed"));}else{log.info("unknown jobStatus:"+jobStatus.getRunState()+" ----------------------");}最后返回给前台,同样的显示;
5. 当这里10个任务都有信息填充后,可以点击“点我吧”,回到index.jsp页面,这个页面有一个初始化monitorJobs的方法:
<body> <br> <form action ="Monitor"><h3 align="center"><input type="submit" value="开始监控吧" /></h3> </form> <% /** * 初始化 monitorJobs */ MonitorUtil.initialMonitorJobs(); %> </body>可以对monitorJobs进行重新初始化,这样再次点击“开始监控吧”就会获得最新的信息了。
1. 修改 MonitorUtil中的HOSTNAME变量为自己使用的云平台的主机名(要在hosts文件中配置哦);
2. 如果想修改显示的列表行数,可以修改MonitorUtil的jobNums变量;
3. 浏览器中输入http://localhost:8080/monitor 即可看到工程首页,其中monitor是lz工程web根路径;
如果您觉得lz的blog或者资源还ok的话,可以选择给lz投一票,多谢。(投票地址:http://vote.blog.csdn.net/blogstaritem/blogstar2013/fansy1990 )
分享,成长,快乐
转载请注明blog地址:http://blog.csdn.net/fansy1990
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。