hadoop无法分配内存java.io.IOException:error = 12

时间:2013-09-27 09:55:55

标签: java linux hadoop

我在hadoop greenplum上收到以下错误

java.lang.Throwable: Child Error
    at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271)
Caused by: java.io.IOException: Cannot run program "ln": java.io.IOException: error=12, Cannot allocate memory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:488)
    at java.lang.Runtime.exec(Runtime.java:610)
    at java.lang.Runtime.exec(Runtime.java:448)
    at java.lang.Runtime.exec(Runtime.java:386)
    at org.apache.hadoop.fs.FileUtil.symLink(FileUtil.java:567)
    at org.apache.hadoop.mapred.TaskLog.createTaskAttemptLogDir(TaskLog.java:109)
    at org.apache.hadoop.mapred.DefaultTaskController.createLogDir(DefaultTaskController.java:71)
    at org.apache.hadoop.mapred.TaskRunner.prepareLogFiles(TaskRunner.java:316)
    at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:228)
Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
    at java.lang.ProcessImpl.start(ProcessImpl.java:81)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:470)
    ... 8 more

服务器有7G内存和1G交换。

堆大小为1024m,mapred.child.opts设置为512m。

任何想法?

2 个答案:

答案 0 :(得分:0)

将tasktracker内存减少到256M并将每个节点的tasktrackers数量限制为1,任何更高的值都会导致子级错误并花费更多时间来运行mapreduce作业。

答案 1 :(得分:0)

无论你想出什么样的记忆安排,Hadoop都可能会抛出这个。问题是,对于简单的文件系统任务,如创建符号链接或检查可用磁盘空间,Hadoop会从TaskTracker中分配一个进程。该进程将拥有与其父进程一样多的内存分配。

防止出现此问题的典型方法是将未分配的物理内存留给TT,为主机添加一些交换以进行这类任务,或允许“过度提交”。