我在一个由多台大小未知的机器组成的集群上运行hadoop作业(每台机器的主内存、内核数量、大小等)。在不使用任何特定于操作系统的库(我指的是*.so文件)的情况下,有没有用于hadoop本身的类或工具,或者一些其他库,我可以在其中收集信息,比如hadoop MR作业正在执行时:
- 内核总数/作业使用的内核数
- 总可用主内存/分配的可用主内存
- 每台机器上的总存储空间/分配的存储空间 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.
主节点可以通过ssh访问所有从节点,并且所有节点的列表应该在slaves
文件中。因此,编写一个脚本,遍历slaves
文件中的节点列表,并使用scp
将该文件复制到master。
像这样的脚本应该可以
对于"cat/home/praveensripati/Installations/hadoop-0.210/conf/slaves"中的i
做
scp praveensripati@$i:/proc/cpuinfo-cpuinfo_$i
scp praveensripati@$i:/proc/meminfo meminfo_$i
完成
hos-name/ip($i)将被附加到cpuinfo和meminfo文件中。MR的工作对这项任务来说太过分了。
假设您所在的集群部署在Linux节点上,则可以从/proc/cpuinfo
和/proc/meminfo
文件中提取CPU和内存信息。您需要编写一个自定义输入格式,以确保您接触集群中的每个节点(或者只处理一个具有拆分大小的文本文件,以确保生成足够的地图任务,从而确保每个任务跟踪器节点至少有一个任务要执行。
您可以将映射器中的信息(主机名、信息)和reducer 中的重复数据消除成对输出
请注意,cpuinfo将报告超线程内核的数量(如果您有兼容的CPU),而不是内核的数量,因此4核超线程CPU可能会在/proc/cpuinfo中显示8个"处理器"
大海图书馆(Opscode Chef的一部分)非常棒;它将从机器输出各种统计数据的JSON转储。
过去有一个标志——mapred.max.maps.per.node
——来限制任何一个作业可以在一个节点上同时运行的任务数量,但它被删除了。喝倒采您必须运行经过修改的计划程序才能提供该功能。