【问题标题】:hadoop cannot allocate memory java.io.IOException: error=12hadoop 无法分配内存 java.io.IOException: error=12
【发布时间】:2013-10-07 21:17:18
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: java linux hadoop


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-02-11
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 2020-10-03
        • 2010-11-24
        • 2013-08-01
        • 1970-01-01
        • 2020-07-07
        相关资源
        最近更新 更多