我运行的配置单元查询对于小数据集运行良好。但我正在运行的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条答案
按热度按时间q9rjltbz1#
谢谢大家。。你说得对。这是因为文件描述符,因为我的程序在目标表中生成了很多文件。由于多层的分区结构。
我增加了ulimit和xceivers属性。确实有帮助。但在我们的情况下,这些限制还是被超越了
然后我们决定按分区分发数据,然后每个分区只得到一个文件。
它对我们有用。我们将我们的系统扩展到500多亿个记录,它为我们工作
vh0rcniy2#
我在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/871012ylamdve63#
如果您的作业由于节点上的outofmemory而失败,您可以查看maxMap和reducer的数量以及每个节点的jvm选项。mapred.child.java.opts(默认值为200xmx)通常必须根据特定于数据节点的硬件增加。