欢迎投稿

今日深度:

hadoop任务监控实现,hadoop任务监控

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


www.htsjk.Com true http://www.htsjk.com/Hadoop/32069.html NewsArticle hadoop任务监控实现,hadoop任务监控 hadoop1.0.4,struct2.3。 本工程仿效hadoop 50030监控界面,取得任务信息,并显示出来。工程可以在http://download.csdn.net/detail/fansy1990/6737451下载。 一、先看效...
相关文章
    暂无相关文章
评论暂时关闭