2012-07-17 61 views
0

我在包含多个不知道机器大小(主内存,内核数量,大小等)的集群上运行我的hadoop作业。不使用任何操作系统特定的库(* .so文件我的意思),是有其本身或一些其他的库的任何类或工具Hadoop的,我可以收集喜欢当正在执行Hadoop的MR作业的信息:如何收集Hadoop集群大小/内核数量信息

  1. 核心总数/由作业
  2. 总可用主内存/分配的可用主内存采用的内核数量
  3. 每个机器/分配的存储空间
  4. 总存储空间
  5. 4.

我不有硬件信息离子或群集的规格,这就是为什么我想要在我的hadoop代码中以编程方式收集这类信息的原因。

我该如何做到这一点?我想知道这种信息是因为不同的原因。一个原因是由以下错误给出的:我想知道哪台机器的空间不足。

12/07/17 14:28:25 INFO mapred.JobClient: Task Id : attempt_201205221754_0208_m_001087_0, Status : FAILED 

org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for output/spill2.out 

     at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:376) 

     at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:146) 

     at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:127) 

     at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:121) 

     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1247) 

     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1155) 

     at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:582) 

     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:649) 

     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323) 

     at org.apache.hadoop.mapred.Child$4.run(Child.java:270) 

     at java.security.AccessController.doPrivileged(Native Method) 

     at javax.security.auth.Subject. 
+0

您可以通过名称节点Web UI查看可用磁盘空间 - 单击Live节点链接 – 2012-07-17 13:54:42

回答

0

假设你是部署在Linux节点群集上,您可以从中提取/proc/cpuinfo/proc/meminfo文件的CPU和内存信息。您需要编写一个自定义输入格式,以确保您可以触摸集群中的每个节点(或者仅处理具有拆分大小的文本文件,以确保生成足够的地图任务以确保每个任务跟踪器节点至少获得一项任务执行。

您可以输出的信息作为映射器对(主机名,资讯),以及去重复在减速

注意cpuinfo中会报告超线程内核的数量(如果你有一个兼容的CPU),而因此4核心超线程CPU可能会在/ proc/cpuinfo中显示8个“处理器”

+0

您的想法很好,但是如何访问主机名?我是否应该将其作为经典地图缩减工作来处理?我不能只打开主类中的文件并将其写入标准输出? – Bob 2012-07-17 16:26:50

+0

获取主机名 - http:// stackoverflow。com/questions/5596788/get-hostname-of-local-machine – 2012-07-17 17:57:11

+0

如果您想知道集群中每个节点的规格,那么您需要将其作为MR作业运行(除非您有ssh访问每个节点在这种情况下,shell脚本将更容易)。在main(String args [])方法中运行只会为您获取当前所在机器的信息 – 2012-07-17 17:58:39

1

主节点将拥有对所有从节点的ssh访问权以及所有节点都应该在slaves文件中。因此,编写一个脚本,该脚本遍历slaves文件中的节点列表,并使用scp将该文件复制到主节点。

事情是这样的脚本应该工作

for i in `cat /home/praveensripati/Installations/hadoop-0.21.0/conf/slaves`;
do
scp [email protected]$i:/proc/cpuinfo cpuinfo_$i
scp [email protected]$i:/proc/meminfo meminfo_$i
done

居屋名/ IP($ I)将被追加到cpuinfo中的和meminfo中的文件。 MR工作对于这项任务来说是一个矫枉过正的工作。

+0

我有ssh访问主节点和从节点的权限。 – Bob 2012-07-18 08:11:58

0

ohai库(Opscode Chef的一部分)非常棒;它会输出来自机器的各种统计数据的JSON转储。

曾经有一个标志 - mapred.max.maps.per.node - 限制任何一个作业可以在一个节点上同时运行的任务数量,但它被删除。嘘。您将不得不运行修改的调度程序来提供该功能。