读书人

查看Hadoop目前集群信息的方法

发布时间: 2012-06-26 10:04:13 作者: rapoo

查看Hadoop当前集群信息的方法

我想每隔几秒钟就查看Hadoop集群中有哪些正在运行的Job,每个Job正在运行着多少个Map/Reduce Task。这就牵扯到如何查看当前Hadoop集群信息的问题,我查了查相关的资料。

用过Hadoop的人肯定都使过它提供的webapp来查看集群信息。这个webapp相当强大,所以我首先想到借用webapp的代码,但发现不太可能。

webapp使用JobInProgress对象查看当前Job的信息,而JobInProgress是包访问权限,没有公共接口。而且,要获得JobInProgress得先得到JobTracker对象,让我们看看webapp是如何获得这些对象的。比如,在jobtracker.jsp中:
??JobTracker tracker = (JobTracker) application.getAttribute("job.tracker");
??...
??Vector<JobInProgress> runningJobs = tracker.runningJobs();

竟然直接用application来获得JobTracker对象,而且网页具有使用JobInProgress接口的权限。

那还有没有别的方法获得JobTracker对象吗?——还没找到。

?

既然JobInProgress用不了,有人说可以用JobClient获得Job的一些信息,但JobClient不提供查看正在运行的Task数等功能。JobClient可以获得ClusterStatus对象,能够查看集群中正在运行的Map/Reduce任务个数,但我想要的是每个Job各自的任务个数。JobClient还可以获得所有Job的JobStatus,但JobStatus也不包括正在运行Task个数。还可以从JobClient中获得RunningJob,但RunningJob也只能提供Map/Reduce完成的进度(一个float)。

?

既然JobInProgress是包访问权限,那么我修改Hadoop的源代码。在调度器(调度器和JobInProgress都在org.apache.hadoop.mapred包)中每次分配任务之前,将当前集群中的JobInProgress信息写入到一个文件。而实时证明不管是标准输出还是写入文件,都没反应。

?

我想法很简单,可是为什么那么难以实现阿

?

参考:

https://issues.apache.org/jira/browse/HADOOP-1313

1 楼 langyu 2011-06-20 我提供一种可能的方法,我没试过,你可以分析下是否可行:
1. 从JobClient.getAllJobs()获得当前JT上所有运行的job,返回的是JobStatus数组
2. 根据JobStatus得到jobID,再由JobClient.getJob(jobID)获得RunningJob对象,这个对象中包含着一个重要的数据: Job Counter (RunningJob.getCounters())
3. 从Counter中取得当前job启动了多少个map/reduce task:
counters.findCounter(JobCounter.TOTAL_LAUNCHED_MAPS).getValue()
counters.findCounter(JobCounter.TOTAL_LAUNCHED_REDUCES).getValue()

读书人网 >软件架构设计

热点推荐