6

我正在运行 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)

在这方面需要帮助。

4

3 回答 3

8

总的来说,我在 MapReduce 上体验过这一点。以我的经验,这实际上不是内存不足错误 - 系统正在用完文件描述符来启动线程,这就是为什么它说“无法创建新的本机线程”。

我们(在 Linux 上)的解决方法是通过以下方式将设置为 1024 的 ulimit 增加到 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

于 2013-10-11T19:54:49.700 回答
1

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

于 2013-03-21T08:20:15.903 回答
-1

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

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

然后我们决定根据分区分配数据,然后每个分区只获取一个文件。

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

于 2013-10-12T04:00:02.430 回答