我的减速器有以下例外:
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)
每台减速机大约创建10000个文件。有没有办法设置每个盒子的极限。
我尝试使用以下命令作为引导脚本:ulimit-n1000000
但这一点帮助都没有。
我还尝试了以下引导操作来替换/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-n134217728。
我们有hadoop配置吗?或者有解决办法吗?
我的主要目标是根据每个记录的ID将记录拆分成文件,现在有15亿条记录,当然可以增加。
在每个从属服务器上运行此守护程序之前,有没有方法编辑此文件?
4条答案
按热度按时间2w2cym1i1#
可能有一种方法可以通过引导操作来实现这一点,特别是其中一个预定义的操作。如果预定义脚本不起作用,那么定制脚本可以做任何您通常可以在任何linux集群上做的事情。但首先我想问你为什么要输出这么多文件?hdfs/hadoop对于更小更大的文件来说无疑是更优化的。如果您希望进行某种索引,那么用不同的名称写出原始文件可能不是最好的方法。
wqlqzqxt2#
好吧,看来amazonemr的设置中默认设置的ulimit:32768已经太多了,如果有任何作业需要更多,那么应该重新考虑它们的逻辑。因此,我没有将每个文件直接写入s3,而是在本地编写它们,并将1024个文件分批移动到s3。这个问题解决了
too many open files
问题。也许当文件描述符被打开以写入s3时,并不像写入本地文件时那样被释放/关闭。欢迎对此作出更好的解释。
6ljaweal3#
我认为正确的解决方案是使用一个序列文件,每个序列文件的内容都是二进制文件,按文件名键入。将记录拆分为文件是可以的,但是这些文件可以作为blob存储,按文件名键入,在一个大的序列文件中。
vlurs2pr4#
我有这个问题,但它是一个linux设置。
按以下步骤解决:
http://www.cyberciti.biz/faq/linux-unix-nginx-too-many-open-files/