java.lang.OutOfMemoryError:无法为大数据集创建新的本机线程

hja*_*i52 6 hadoop hive

我有运行配置单元查询,它运行正常的小数据集.但我正在运行2.5亿条记录,我已经在日志中遇到错误

 FATAL org.apache.hadoop.mapred.Child: Error running child : java.lang.OutOfMemoryError:   unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:640)
    at org.apache.hadoop.mapred.Task$TaskReporter.startCommunicationThread(Task.java:725)
    at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:362)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1136)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)



 2013-03-18 14:12:58,907 WARN org.apache.hadoop.mapred.Child: Error running child
 java.io.IOException: Cannot run program "ln": java.io.IOException: error=11, Resource temporarily unavailable
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
    at java.lang.Runtime.exec(Runtime.java:593)
    at java.lang.Runtime.exec(Runtime.java:431)
    at java.lang.Runtime.exec(Runtime.java:369)
    at org.apache.hadoop.fs.FileUtil.symLink(FileUtil.java:567)
    at org.apache.hadoop.mapred.TaskRunner.symlink(TaskRunner.java:787)
    at org.apache.hadoop.mapred.TaskRunner.setupWorkDir(TaskRunner.java:752)
    at org.apache.hadoop.mapred.Child.main(Child.java:225)
 Caused by: java.io.IOException: java.io.IOException: error=11, Resource temporarily unavailable
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:148)
    at java.lang.ProcessImpl.start(ProcessImpl.java:65)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
    ... 7 more
2013-03-18 14:12:58,911 INFO org.apache.hadoop.mapred.Task: Runnning cleanup for the task
2013-03-18 14:12:58,911 INFO org.apache.hadoop.mapred.Child: Error cleaning up
  java.lang.NullPointerException
    at org.apache.hadoop.mapred.Task.taskCleanup(Task.java:1048)
    at org.apache.hadoop.mapred.Child.main(Child.java:281)
Run Code Online (Sandbox Code Playgroud)

需要帮助.

quu*_*x00 7

我一般都经历过MapReduce.根据我的经验,它实际上不是内存不足错误 - 系统用完文件描述符来启动线程,这就是为什么它说"无法创建新的本机线程".

对我们(在Linux上)的修复是通过以下方式将ulimit(设置为1024)增加到2048 ulimit -n 2048.您需要具有执行此操作的权限 - sudo或root访问权限或具有2048或更高的硬限制,以便您可以将其设置为系统上的自己的用户.您可以在您的.profile.bashrc设置文件中执行此操作.

您可以使用以下方式检查当前设置ulimit -a.有关更多详细信息,请参阅此参考:https://stackoverflow.com/a/34645/871012

我也看到很多人谈论改变/etc/security/limits.conf文件,但我还没有那么做.这是一个谈论它的链接:https://stackoverflow.com/a/8285278/871012


hja*_*i52 -1

谢谢大家..你是对的。这是因为文件描述符,因为我的程序在目标表中生成了大量文件。由于多级分区结构。

我增加了 ulimit 和 xceivers 属性。它确实有帮助。但在我们的情况下,这些限制也被突破了

然后我们决定按照分区分配数据,然后每个分区仅获得一个文件。

它对我们有用。我们将系统扩展到 500 多亿条记录,它对我们有用