我正在使用Hadoop单节点,稍后可能会继续使用多节点。现在,同一个节点既是主节点又是从节点,因此namenode
,datanode
resource manager
和node manager
在同一台PC上运行。
每当我在terasort
上安装的单独测试磁盘上触发/home/hadoop/hdfs
时(这里hadoop
是用户名),它就会失败并出现以下错误:
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 failed
,Disk checker
,no space left
等
当我调查此问题时,继续在单独的终端中运行df -h
,告知它正在使用/
目录进行某些内部操作,因为作业正在进行中。如果/
上没有剩余空间,则作业失败。
我尝试将hadoop.tmp.dir
更改为其他已安装的磁盘。它工作正常,但再次失败,因为该磁盘也没有足够的空间。
我的问题是为什么会发生这种情况,我们可以完全避免这个问题吗?或者,在.xml
配置文件中配置哪些确切参数,以便将其限制在RAM
内或使用磁盘空间,但请确保不要使作业失败并使用它所具有的任何空间但不会因为崩溃而崩溃我提到的任何错误?
提前致谢。
PS:我已经研究过alomst所有的配置参数,并大致上了各种各样的命中和放大器。审判但仍然失败了。因此,我想在这里问,希望你能帮忙。答案 0 :(得分:3)
我的问题是它为什么会发生
为了让您更好地理解,Mapper一旦完成任务,中间输出就会溢出到磁盘(由yarn.nodemanager.local-dirs
指定,其默认值为${hadoop.tmp.dir}/nm-local-dir
),当然,如果数据不适合Mapper的内存,然后进行溢出并在任务结束时合并并最终写回磁盘。
类似地,reducer必须将中间数据从Mapper的本地文件系统复制到它自己的本地文件系统来处理数据。
因此,例如,如果您使用4个映射器和&amp ;;运行100G数据的terasort。一个reducer然后假设你的mapper生成了25G的中间数据,那么reducer必须在其本地文件系统上有100G可用空间来处理它。
我们可以完全避免这个问题吗?
在你的情况下,增加任务不会有帮助,因为它是一台机器。
唯一可以避免此问题的方法是添加更多NodeManager,以便从该节点获得更多磁盘空间来处理作业。
在.xml配置文件中配置了哪些确切参数,以便将其限制在RAM
中
您不能将MapReduce作业限制为仅使用RAM,因为shuffle过程必须将数据写入磁盘。
或使用磁盘空间,但请确保不要使作业失败并使用它所拥有的任何空间但不会因为我提到的任何错误而崩溃?
您必须有足够的磁盘空间用于群集上的中间任务输出才能处理作业。