2015-04-23 57 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作爲洗牌過程中發生的數據有寫入磁盤。

或使用磁盤空間,但請確保不要使作業失敗並使用它的任何空間,但由於我提到的任何錯誤而不會崩潰?

您必須有足夠的磁盤空間用於羣集上的中間任務輸出才能處理作業。