在 Linux 上调整 HDFS(Hadoop Distributed File System)相关内存配置,通常是从 Hadoop 各组件 JVM 堆内存 和 系统层面 两方面入手。下面按常见场景说明。
HDFS 中主要吃内存的有:
| 组件 | 作用 | 关键参数 |
|---|---|---|
| NameNode | 元数据管理 | HADOOP_HEAPSIZE / HADOOP_NAMENODE_OPTS |
| DataNode | 数据存储 | HADOOP_HEAPSIZE / HADOOP_DATANODE_OPTS |
| SecondaryNameNode | 元数据合并 | HADOOP_SECONDARYNAMENODE_OPTS |
| JournalNode | HA 日志 | HADOOP_JOURNALNODE_OPTS |
文件路径(视版本而定):
$HADOOP_HOME/etc/hadoop/hadoop-env.sh
export HADOOP_HEAPSIZE=4096
表示 所有 Hadoop 进程默认 4G 堆内存
export HADOOP_NAMENODE_OPTS="-Xms4g -Xmx8g -XX:+UseG1GC"
export HADOOP_DATANODE_OPTS="-Xms2g -Xmx4g"
export HADOOP_SECONDARYNAMENODE_OPTS="-Xms2g -Xmx4g"
export HADOOP_JOURNALNODE_OPTS="-Xms1g -Xmx2g"
✅ 建议:
-Xms=-Xmx(避免动态扩容)- NameNode 内存要足够大(元数据 ≈ 文件数 × 150~300 Byte)
NameNode 内存主要受 文件/块数量 影响:
内存 ≈ 文件数 × 300 Bytes
例如:
✅ 经验配置:
NameNode: 8G ~ 32G
DataNode: 2G ~ 4G
<property>
<name>dfs.namenode.handler.count</name>
<value>20</value>
</property>
swapoff -a
并在 /etc/fstab 中注释 swap 行
sysctl -w vm.swappiness=1
sysctl -w vm.overcommit_memory=1
ulimit -n 65536
HDFS 对文件描述符要求很高
jps
jmap -heap <nn_pid>
或:
ps -aux | grep NameNode
| 报错 | 原因 |
|---|---|
Java Heap Space |
NameNode 内存太小 |
OutOfMemoryError: GC overhead limit |
GC 参数不合理 |
| DataNode 频繁掉线 | DN 内存不足或 swap 开启 |
# hadoop-env.sh
export HADOOP_NAMENODE_OPTS="-Xms8g -Xmx8g -XX:+UseG1GC"
export HADOOP_DATANODE_OPTS="-Xms4g -Xmx4g"
export HADOOP_SECONDARYNAMENODE_OPTS="-Xms4g -Xmx4g"
如果你能告诉我:
我可以给你一套精准内存配置方案。