我在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。
任何想法?
答案 0 :(得分:0)
将tasktracker内存减少到256M并将每个节点的tasktrackers数量限制为1,任何更高的值都会导致子级错误并花费更多时间来运行mapreduce作业。
答案 1 :(得分:0)
无论你想出什么样的记忆安排,Hadoop都可能会抛出这个。问题是,对于简单的文件系统任务,如创建符号链接或检查可用磁盘空间,Hadoop会从TaskTracker中分配一个进程。该进程将拥有与其父进程一样多的内存分配。
防止出现此问题的典型方法是将未分配的物理内存留给TT,为主机添加一些交换以进行这类任务,或允许“过度提交”。