如何收集Hadoop集群大小/核心数量信息

时间:2012-07-17 13:24:47

标签: hadoop mapreduce cluster-computing

我正在一个群集上运行我的hadoop作业,该群集由多个机器组成,这些机器的大小未知(主机内存,内核数量,大小等等。每台机器)。如果不使用任何特定于操作系统的库(我的意思是* .so文件),是否有任何用于hadoop的类或工具或一些其他库,我可以在其中收集信息,例如在执行Hadoop MR作业时:

  1. 核心总数/作业使用的核心数
  2. 可用主内存总量/已分配可用主内存
  3. 每台计算机/已分配存储空间的总存储空间
  4. 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.
    

3 个答案:

答案 0 :(得分:1)

主节点将具有对所有从属的ssh访问权限,并且slaves文件中应包含所有节点的列表。因此,编写一个脚本,遍历slaves文件中的节点列表,并使用scp将文件复制到主文件。

像这样的脚本应该可以工作

  

for i in`cat / home / praveensripati / Installations / hadoop-0.21.0 / conf / slaves`;
  做
  scp praveensripati @ $ i:/ proc / cpuinfo cpuinfo_ $ i
  scp praveensripati @ $ i:/ proc / meminfo meminfo_ $ i
  完成

主机名/ ip($ i)将附加到cpuinfo和meminfo文件。 MR工作对于这项任务来说太过分了。

答案 1 :(得分:0)

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

您可以从映射器(主机名,信息)和reducer中的重复数据删除输出成对的信息

请注意,cpuinfo将报告超线程内核的数量(如果您有兼容的CPU)而不是内核数量,因此4核超线程CPU可能会在/ proc / cpuinfo中显示8个'处理器'

答案 2 :(得分:0)

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

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