我有运行的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)
需要帮助。
答案 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亿条记录,它对我们有用