Ubuntu16.04下Hadoop JMX服务器文件描述符显示异常求助
咱们先把问题核心理清楚:你已经在系统层面把文件描述符上限调到了128000,命令行验证也没问题,但Hadoop进程里的JMX属性还是显示默认的4096——这说明Hadoop进程根本没继承到你设置的资源限制,大概率是启动方式或者配置加载的问题,下面给你一步步排查解决:
1. 先确认Hadoop进程的实际限制
别光看全局设置,直接查Hadoop进程的真实资源上限:
- 用
jps命令找到NameNode/DataNode等Hadoop进程的PID - 执行
cat /proc/<PID>/limits,查看Max open files这一行的数值
如果显示4096,那实锤是进程没拿到128000的设置,接下来针对性解决。
2. 修正limits.conf的配置问题
你提到的配置里有个明显的拼写错误:start soft nproc 128000应该是笔误吧?正确的配置应该针对Hadoop运行的用户(比如hadoop用户)或者所有用户(用*),比如:
# 针对hadoop用户设置 hadoop soft nofile 128000 hadoop hard nofile 128000 hadoop soft nproc 128000 hadoop hard nproc 128000
如果用*表示所有用户,要注意它对root用户不生效,但Hadoop一般用普通用户运行,所以没问题。修改后记得重新登录Hadoop用户,或者直接重启系统让配置生效。
3. 确保PAM模块加载limits配置
Ubuntu 16.04需要PAM模块来读取limits.conf的设置,检查这两个文件:
/etc/pam.d/common-session/etc/pam.d/common-session-noninteractive
确保里面都有这一行:
session required pam_limits.so
如果没有就加上,然后重启系统或者重新登录。
4. 针对systemd启动的Hadoop服务
如果你的Hadoop是用systemd管理的(比如systemctl start hadoop-namenode),默认会忽略limits.conf的设置,必须在systemd服务文件里手动指定:
- 找到Hadoop的systemd服务文件(比如
/etc/systemd/system/hadoop-namenode.service) - 在
[Service]段落里添加:
LimitNOFILE=128000 LimitNPROC=128000
然后执行以下命令生效:
systemctl daemon-reload systemctl restart hadoop-namenode.service
5. 针对init.d脚本启动的Hadoop
如果是用传统init.d脚本启动(比如service hadoop start),需要在启动脚本里直接设置ulimit:
- 打开Hadoop的init.d脚本(比如
/etc/init.d/hadoop) - 在启动Hadoop进程的代码前,加上:
ulimit -n 128000 ulimit -u 128000
然后重启服务:service hadoop restart
6. 解决/proc/sys/fs/file-max被覆盖的问题
这个是系统级的全局文件描述符上限,建议设置得比用户级更高(比如200000),并写入/etc/sysctl.conf保证重启后不丢失:
fs.file-max = 200000
执行sysctl -p让配置立即生效。
验证修复效果
做完以上步骤后,重启Hadoop服务,再做两个验证:
- 再次执行
cat /proc/<HADOOP_PID>/limits,确认Max open files是128000 - 查看Hadoop JMX的OS属性"MaxFileDescriptorCount",应该已经显示128000了
内容的提问来源于stack exchange,提问作者Soheil Pourbafrani

