hadoop任务监控实现
来源:互联网 发布:java 循环效率最高 编辑:程序博客网 时间:2024/05/17 04:39
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
- hadoop任务监控实现
- 浏览器监控hadoop任务进度
- Quartz+Spring 实现任务监控
- Hadoop web项目使用Ajax监控MapReduce任务运行情况
- Quartz+Spring实现任务动态管理监控
- Python+Hadoop Streaming实现MapReduce任务
- C#实现看门狗监控tomcat运行、定制任务计划
- Cube-web系统之Quartz+Spring实现任务监控管理
- Hadoop好友推荐系统-原始数据去重操作(包含MapReduce任务监控)
- 用Python实现一个细粒度hadoop作业监控分析工具
- Splunk实现与Hadoop的集成与监控
- ganglia和nagios配置实现hadoop集群监控
- 用Python实现Hadoop实时作业状态监控
- hadoop任务监控页面namenode:50030(在hadoop配置中查找集群jobtracker的ip,访问50030)
- echarts实现web展示资源监控类似于windows任务管理器资源监控样子
- 基于Hadoop实现通用的并行任务处理
- Quartz任务监控管理
- Quartz任务监控管理
- 2013.12.19oracle 并行(概念) dba168 谷歌
- exit,_exit,return 的区别
- 人工智能-遗传算法解决推箱子问题现实
- JQuery(一)——初步总结
- NetBeans文件被锁,无法修改
- hadoop任务监控实现
- wikioi 1683 车厢重组
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
- adb命令、adb shell与Linux各种命令
- poj1106 Transmitters (枚举+叉积运用)
- 从GRUB恢复到MBR
- 小记1
- ThinkSNS不用登陆就可以访问的配置
- 【Unity3D】【NGUI】如何在UI上显示3D模型