我遇到了一个配置Hadoop集群时相当常见的问题(实际上,它使用Cloudera的伪分布式集群在单台机器上,hadoop 打开的文件数量超出了文件系统的限制。Cloudera 建议添加以下几行到/etc/security/limits.conf
:
hdfs hard nofile 16384 # hdfs is my 'hadoop' user equivalent
并且,由于我运行的是内核 2.6.32,因此还编辑了/etc/sysctl.conf
:
fs.epoll.max_user_instances = 4096
进行这些更改并重新启动服务器后,我仍然收到相同的错误!看来 hdfs 的打开文件限制尚未超过默认值 1024:
[bash]$ sudo lsof | awk '{print $3}' | sort | uniq -c | sort -nr
2145 root
1495 hdfs
610 mapred
359 www-data
305 rdm
116 mysql
83 rabbitmq
32 messagebus
30 snmp
25 ntp
23 syslog
16 daemon
1 USER
随着我做了更多的研究,我发现增加文件大小限制高度依赖于系统(即使在 Ubuntu 中;这里,这里, 和这里),所以想看看 Ubuntu 的方法是什么。有人知道如何在 Ubuntu 10.04 中增加这些限制吗?
我当然更喜欢不增加所有用户限制的解决方案,但目前我愿意尝试任何方法。感谢您的帮助!
答案1
为了设定这些限制,我做了一些事情这里和这里。因为我想将这些文件限制限制在hdfs
和mapred
用户,所以我将每个用户添加到hadoop
我的系统组并进行编辑/etc/security/limits.conf
以包含以下行:
@hadoop hard nofile 16384
这允许两个用户同时打开多达 16384 个文件,这在伪分布式模式下显然很重要。我还必须将以下行添加到/etc/pam.d/common-session
:
session required pam_limits.so
这使得这些文件限制在 hdfs 和 mapred 等守护进程中持续存在。重新启动服务器后,一切似乎都运行正常,因为 hdfs 当前打开的文件数超过了默认数量 (1024):
[dsftar01 ~]$ sudo lsof | awk '{if(NR>1) print $3}' | sort | uniq -c | sort -nr
1972 root
1530 hdfs
608 mapred
360 www-data
166 rdm
97 mysql
83 rabbitmq
41 nobody
35 syslog
31 messagebus
30 snmp
25 ntp
16 daemon
答案2
添加ulimit -n 16384
到 hdfs 用户.bashrc
(或者/etc/profile
这将为所有用户设置值)
如果用户没有主目录附加ulimit -n 16384
到/etc/profile
然后你必须重新启动计算机。