hadoop任务监控实现


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);
jobClient=new JobClient(jobTracker, getConf());
JobStatus[] jobStatusAll=jobClient.getAllJobs();
上面是获得所有的job信息(已经运行完成的),然后使用:

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



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号