2015-04-23 110 views
2

我正在使用Hadoop单节点,稍后可能会转移到多节点。现在,同一个节点既是主节点也是从节点,因此namenode,datanoderesource managernode manager在同一台PC上运行。Hadoop在运行terasort时崩溃?

每当我对安装在/home/hadoop/hdfs(这里hadoop是用户名)单独测试磁盘触发terasort时,出现以下错误:

INFO mapreduce.Job: Task Id : attempt_1429766544852_0001_m_001255_0, Status : FAILED 
Error: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for attempt_1429766544852_0001_m_001255_0_spill_1.out 
     at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:398) 
     at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:150) 
     at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:131) 
     at org.apache.hadoop.mapred.YarnOutputFiles.getSpillFileForWrite(YarnOutputFiles.java:159) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1573) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1467) 
     at org.apache.hadoop.mapred.MapTask$NewOutputCollector.close(MapTask.java:699) 
     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:769) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339) 
     at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:415) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491) 
     at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157) 

15/04/23 11:36:07 INFO mapreduce.Job: Task Id : attempt_1429766544852_0001_m_001258_0, Status : FAILED 
Error: java.io.IOException: No space left on device 
     at java.io.FileOutputStream.writeBytes(Native Method) 
     at java.io.FileOutputStream.write(FileOutputStream.java:345) 
     at org.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.write(RawLocalFileSystem.java:236) 
     at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
     at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 
     at java.io.FilterOutputStream.flush(FilterOutputStream.java:140) 
     at java.io.DataOutputStream.flush(DataOutputStream.java:123) 
     at java.io.FilterOutputStream.flush(FilterOutputStream.java:140) 
     at java.io.FilterOutputStream.flush(FilterOutputStream.java:140) 
     at java.io.DataOutputStream.flush(DataOutputStream.java:123) 
     at org.apache.hadoop.mapred.IFile$Writer.close(IFile.java:163) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1633) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$900(MapTask.java:852) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1510) 

Error: java.io.IOException: No space left on device 
     at java.io.FileOutputStream.writeBytes(Native Method) 
     at java.io.FileOutputStream.write(FileOutputStream.java:345) 
     at org.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.write(RawLocalFileSystem.java:236) 
     at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
     at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 
     at java.io.FilterOutputStream.flush(FilterOutputStream.java:140) 
     at java.io.DataOutputStream.flush(DataOutputStream.java:123) 
     at java.io.FilterOutputStream.flush(FilterOutputStream.java:140) 
     at java.io.FilterOutputStream.flush(FilterOutputStream.java:140) 
     at java.io.DataOutputStream.flush(DataOutputStream.java:123) 
     at org.apache.hadoop.mapred.IFile$Writer.close(IFile.java:163) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1633) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$900(MapTask.java:852) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1510) 

Error: java.io.IOException: Spill failed 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.checkSpillException(MapTask.java:1540) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$300(MapTask.java:852) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$Buffer.write(MapTask.java:1352) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$Buffer.write(MapTask.java:1329) 
     at java.io.DataOutputStream.writeByte(DataOutputStream.java:153) 
     at org.apache.hadoop.io.WritableUtils.writeVLong(WritableUtils.java:273) 
     at org.apache.hadoop.io.WritableUtils.writeVInt(WritableUtils.java:253) 
     at org.apache.hadoop.io.Text.write(Text.java:323) 
     at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:98) 
     at org.apache.hadoop.io.serializer.WritableSerialization$WritableSerializer.serialize(WritableSerialization.java:82) 
     at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1127) 
     at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691) 
     at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89) 
     at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112) 
     at org.apache.hadoop.mapreduce.Mapper.map(Mapper.java:124) 
     at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145) 
     at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763) 
     at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339) 
     at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at javax.security.auth.Subject.doAs(Subject.java:415) 
     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491) 

基本上spill failedDisk checkerno space left

当我研究了这个问题,继续运行df -h在单独的终端上给出了线索​​,它正在使用/目录进行一些内部操作。在/上没有剩余空间时,作业失败。

我试着将hadoop.tmp.dir更改为某些其他安装的磁盘。它运行良好,但再次失败,因为该磁盘还没有足够的空间。

我的问题是为什么会发生,我们可以避免这个问题吗?或者,在.xml配置文件中配置了什么确切的参数,以便将其限制在RAM之内或使用磁盘空间,但请确保不会使作业失败并使用它拥有的任何空间,但由于我提到的任何错误而不会崩溃?

在此先感谢。 PS:我已经研究过关于所有配置参数的所有配置参数,并且几乎完成了所有类型的尝试,但仍然失败。因此,我想到这里来问,希望你能帮忙。

+0

你可以在这里发布你的配置文件吗? – Ashrith

+0

我在配置文件中有很多更改。我将尝试运行所需的最小更改,并将其放在此处。但事情是,如果你知道任何可以设置的参数以避免泄漏,那么请在这里发帖。 – Omkant

+0

我忘了提及,我正在使用Hadoop 2.2.0 – Omkant

回答

3

我的问题是为什么会发生

所以给你一个更好的理解,映射的,只要他们的任务就完成了中间输出溢出到磁盘上(由yarn.nodemanager.local-dirs其指定的默认值是${hadoop.tmp.dir}/nm-local-dir),当然如果数据不适合Mapper的内存,那么也会产生溢出,并在任务结束时合并并最终写回到磁盘。

类似地,reducer必须将中间数据从Mapper的本地文件系统复制到它自己的本地文件系统来处理数据。

因此,例如,如果您正在使用4个映射器的&一个reducer,然后假设您的映射器已经生成了25G的中间数据,那么这个reducer必须在其本地文件系统上有100G的可用空间来处理它。

我们可以避免这个问题吗?

在你的情况下增加任务将无法帮助,因为它是一台机器。

避免此问题的唯一方法是添加更多NodeManager,以便您可以从该节点获取更多磁盘空间来处理作业。

什么确切的参数为.xml配置文件进行配置,以便将其限制于内部RAM

你不能限制MapReduce工作只使用RAM作为洗牌过程中发生的数据有写入磁盘。

或使用磁盘空间,但请确保不要使作业失败并使用它的任何空间,但由于我提到的任何错误而不会崩溃?

您必须有足够的磁盘空间用于群集上的中间任务输出才能处理作业。