hadoop任务监控实现,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