0

我在 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。

有任何想法吗?

4

2 回答 2

0

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

于 2013-10-07T11:41:49.237 回答
0

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

防止此问题的典型方法是保留分配给 TT 的尽可能多的未分配物理内存,为此类任务向主机添加一些交换,或允许“过度提交”。

于 2013-10-07T13:17:18.590 回答