在 Linux 上运行 HDFS 出现“内存溢出(OOM,Out Of Memory)”,通常不是“HDFS 本身有 bug”,而是进程内存配置不合理 + 数据/负载特征不匹配。下面按常见原因 → 对应机制 → 解决方向说明。
| 角色 | 进程 | 常见 OOM 原因 |
|---|---|---|
| NameNode | NameNode |
元数据过多、堆太小 |
| DataNode | DataNode |
块报告过大、线程过多 |
| JournalNode | JournalNode |
editlog 积压 |
| ZKFC | DFSZKFailoverController |
一般较少 |
机制
现象
java.lang.OutOfMemoryError: Java heap space
解决
<!-- hdfs-site.xml -->
<property>
<name>dfs.namenode.heapsize</name>
<value>8g</value>
</property>
并:
建议
机制
解决
dfs.datanode.max.transfer.threads
dfs.datanode.handler.count
dfs.datanode.max.concurrent.reads
JVM 使用:
OOM 但堆没满,常见于:
OutOfMemoryError: unable to create new native thread
原因
ulimit -u检查
ulimit -a
cat /proc/<pid>/limits
cat /proc/sys/vm/overcommit_memory
2 + 内存不足 → 直接 kill JVMdmesg | grep -i oom
NameNode OOM
原因:2 亿小文件
解决:NameNode 堆 4G → 16G + 小文件合并
DataNode 被 Linux kill
原因:vm.overcommit_memory=2
解决:调整内核参数
unable to create new native thread
原因:ulimit -u太小
解决:提高用户线程限制
# JVM OOM?
grep -i "OutOfMemory" /var/log/hadoop/*
# Linux kill?
dmesg | grep -i oom
# 进程内存
jmap -heap <pid>
# 线程数
ps -eLf | wc -l
如果你愿意,可以告诉我:
我可以直接帮你算内存该配多大。