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

Hadoop java.lang.OutOfMemoryError:无法为大数据集创建新的本机线程,hadoop,hive,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.sta

我已经运行了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)
FATAL org.apache.hadoop.mapred.Child:运行Child:java.lang.OutOfMemoryError时出错:无法创建新的本机线程
位于java.lang.Thread.start0(本机方法)
在java.lang.Thread.start(Thread.java:640)处
位于org.apache.hadoop.mapred.Task$TaskReporter.startCommunicationThread(Task.java:725)
位于org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:362)
位于org.apache.hadoop.mapred.Child$4.run(Child.java:255)
位于java.security.AccessController.doPrivileged(本机方法)
位于javax.security.auth.Subject.doAs(Subject.java:396)
位于org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1136)
位于org.apache.hadoop.mapred.Child.main(Child.java:249)
2013-03-18 14:12:58907警告org.apache.hadoop.mapred.Child:运行Child时出错
java.io.IOException:无法运行程序“ln”:java.io.IOException:错误=11,资源暂时不可用
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
位于java.lang.Runtime.exec(Runtime.java:593)
位于java.lang.Runtime.exec(Runtime.java:431)
位于java.lang.Runtime.exec(Runtime.java:369)
位于org.apache.hadoop.fs.FileUtil.symLink(FileUtil.java:567)
位于org.apache.hadoop.mapred.TaskRunner.symlink(TaskRunner.java:787)
位于org.apache.hadoop.mapred.TaskRunner.setupWorkDir(TaskRunner.java:752)
位于org.apache.hadoop.mapred.Child.main(Child.java:225)
原因:java.io.IOException:java.io.IOException:error=11,资源暂时不可用
位于java.lang.UNIXProcess(UNIXProcess.java:148)
在java.lang.ProcessImpl.start(ProcessImpl.java:65)
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
... 还有7个
2013-03-18 14:12:58911 INFO org.apache.hadoop.mapred.Task:为任务运行清理
2013-03-18 14:12:58911 INFO org.apache.hadoop.mapred.Child:清除错误
java.lang.NullPointerException
位于org.apache.hadoop.mapred.Task.taskCleanup(Task.java:1048)
位于org.apache.hadoop.mapred.Child.main(Child.java:281)

需要这方面的帮助。

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

我在使用MapReduce时通常会遇到这种情况。根据我的经验,这实际上不是一个内存不足的错误-系统没有文件描述符来启动线程,这就是为什么它说“无法创建新的本机线程”

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

您可以使用
ulimit-a
检查当前设置。有关更多详细信息,请参阅此参考:


我还看到许多其他人谈论更改
/etc/security/limits.conf
文件,但我还没有这样做。这里有一个关于它的链接:

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

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

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


这对我们有用。我们将我们的系统扩展到500多亿条记录,它为我们工作了

我以前见过这样的情况,在运行任务的任务跟踪器节点上没有更多的磁盘空间(映射或减少)。您的集群有多大,每个集群节点(在mapred存储它的临时文件的分区上)上的可用空间有多大Hi我在
hive.log
中得到这个错误,它是许多异常的子异常。在设置
ulimit
之后,我们是否需要重新启动运行hiveserver和/或metastore的机器?这更像是一个注释,而不是真正的答案。