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

时间:2013-03-19 08:37:45

标签: hadoop hive

我有运行的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)

需要帮助。

3 个答案:

答案 0 :(得分:7)

我在MapReduce中经历过这种情况。根据我的经验,它实际上不是内存不足错误 - 系统用完文件描述符来启动线程,这就是为什么它说“无法创建新的本机线程”。

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

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

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

答案 1 :(得分:1)

如果您的作业由于节点上的OutOfMemmory而失败,您可以调整最大映射和缩减器的数量,并为每个映射选择JVM。 mapred.child.java.opts(默认值为200Xmx)通常必须根据您的数据节点特定硬件进行增加。

答案 2 :(得分:-1)

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

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

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

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