我有运行配置单元查询,它运行正常的小数据集.但我正在运行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)
需要帮助.
我一般都经历过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 多亿条记录,它对我们有用