hadoop在运行terasort时崩溃?

8nuwlpux  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(335)

我正在使用hadoop单节点,以后可能会转到多节点。现在,同一个节点既是主节点也是从节点,因此 namenode ,
datanode resource manager 以及 node manager 在同一台电脑上运行。
每当我触发 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 或者使用磁盘空间,但确保不失败的工作,并使用任何空间,它有,但不要崩溃由于任何错误,我已经提到?
提前谢谢。
附言:我已经研究了很多配置参数,并尝试了几乎所有的点击和试用,但仍然失败了。所以,我想在这里问问,希望你能帮忙。

anauzrmj

anauzrmj1#

我的问题是为什么会这样
因此,为了让您更好地理解,Map程序的任务完成后,中间输出将溢出到磁盘(由指定) yarn.nodemanager.local-dirs 其默认值为 ${hadoop.tmp.dir}/nm-local-dir )当然,如果数据不适合Map器的内存,那么也会发生溢出,并在任务结束时合并,最后写回磁盘。
类似地,reducer必须将中间数据从mapper的本地文件系统复制到它自己的本地文件系统来处理数据。
因此,例如,如果使用4个Map器对100g数据运行terasort&一个reducer,那么假设Map器生成了25g中间数据,那么reducer必须在其本地文件系统上有100g的可用空间来处理它。
我们能避免这个问题吗?
在你的情况下,增加任务是没有帮助的,因为它是一台单独的机器。
避免这个问题的唯一方法是添加更多的节点管理器,这样就可以从该节点获得更多的磁盘空间来处理作业。
在.xml配置文件中可以配置哪些确切的参数,以便将其限制在ram中
您不能将mapreduce作业限制为仅使用ram,因为要进行无序处理,必须将数据写入磁盘。
或者使用磁盘空间,但确保不失败的工作,并使用任何空间,它有,但不要崩溃由于任何错误,我已经提到?
集群上必须有足够的磁盘空间用于中间任务的输出,才能处理作业。

相关问题