1

我在由多台机器组成的集群上运行我的 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.
4

3 回答 3

1

主节点将对所有从节点进行 ssh 访问,并且所有节点的列表都应该在slaves文件中。因此,编写一个脚本,它遍历slaves文件中的节点列表并使用scp.

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

对于我在`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 工作对于这项任务来说太过分了。

于 2012-07-18T02:55:26.353 回答
0

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

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

于 2012-07-27T04:42:02.947 回答
0

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

您可以将信息作为映射器(主机名,信息)的对输出,并在化简器中进行重复数据删除

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

于 2012-07-17T13:59:07.017 回答