4

我的减速器出现以下异常:

EMFILE: Too many open files
    at org.apache.hadoop.io.nativeio.NativeIO.open(Native Method)
    at org.apache.hadoop.io.SecureIOUtils.createForWrite(SecureIOUtils.java:161)
    at org.apache.hadoop.mapred.TaskLog.writeToIndexFile(TaskLog.java:296)
    at org.apache.hadoop.mapred.TaskLog.syncLogs(TaskLog.java:369)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:257)
    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:1059)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)

每个 reducer 正在创建大约 10,000 个文件。有没有办法可以设置每个盒子的ulimit。

我尝试使用以下命令作为引导脚本: ulimit -n 1000000

但这根本没有帮助。

我还在引导操作中尝试了以下操作来替换 /usr/lib/hadoop/hadoop-daemon.sh 中的 ulimit 命令:

#!/bin/bash
set -e -x
sudo sed -i -e "/^ulimit /s|.*|ulimit -n 134217728|" /usr/lib/hadoop/hadoop-daemon.sh

但即便如此,当我们登录到主节点时,我仍可以看到 ulimit -n 返回:32768。我还确认在 /usr/lib/hadoop/hadoop-daemon.sh 中进行了所需的更改,并且它具有:ulimit -n 134217728。

我们对此有任何 hadoop 配置吗?或者有解决方法吗?

我的主要目的是根据每条记录的id将记录拆分成文件,现在有15亿条记录,肯定会增加。

在每个从属服务器上运行此守护程序之前,有什么方法可以编辑此文件?

4

4 回答 4

3

好的,看来亚马逊 EMR 设置中默认设置的 ulimit : 32768 已经太多了,如果有任何工作需要更多,那么应该重新审视他们的逻辑。因此,我没有将每个文件都直接写入 s3,而是将它们写入本地,然后分批 1024 个文件移动到 s3。这解决了too many open files问题。

也许当打开文件描述符以写入 s3 时,并没有像写入本地文件时那样释放/关闭。欢迎对此进行任何更好的解释。

于 2012-12-16T21:22:37.373 回答
0

可能有一种方法可以通过引导操作来执行此操作,特别是预定义的操作之一。如果预定义不起作用,自定义脚本可以做任何你通常可以在任何 linux 集群上做的事情。但首先我会问你为什么要输出这么多文件?HDFS/Hadoop 绝对针对更少的大文件进行了更多优化。如果您希望进行某种索引,写出具有不同名称的原始文件可能不是最好的方法。

于 2012-10-19T23:51:04.727 回答
0

我认为这里正确的解决方案是拥有一个序列文件,其内容是每个二进制文件,由文件名键入。可以将记录拆分为文件,但这些文件可以存储为 blob,由文件名键入,在一个大序列文件中。

于 2012-10-19T23:57:45.340 回答
-1

我有这个问题,但它是一个linux设置。

去这里解决它并按照以下步骤操作:

http://www.cyberciti.biz/faq/linux-unix-nginx-too-many-open-files/

于 2012-10-18T11:13:31.783 回答