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

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

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

webapp使用JobInProgress对象查看当前Job的信息,而JobInProgress是包访问权限,没有公共接口。而且,要获得JobInProgress得先得到JobTracker对象,让我们看看webapp是如何获得这些对象的。比如,在job tracker.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信息写入到一个文件。而实时证明不管是标准输出还是写入文件,都没反应。

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

扫描二维码关注公众号,回复: 813648 查看本文章

参考:

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

猜你喜欢

转载自richardj.iteye.com/blog/1098244