在 Linux 上优化 Hadoop,通常从 系统层、HDFS、YARN/MapReduce、硬件与架构 四个方面入手。下面给你一套实用、可落地的优化清单,适合生产环境。
# 查看
ulimit -n
ulimit -u
# 修改
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
swapoff -a
永久禁用:
vi /etc/fstab
# 注释 swap 行
noatime,nodiratime
vi /etc/sysctl.conf
vm.swappiness = 0
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
sysctl -p
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
export HADOOP_NAMENODE_OPTS="-Xmx16g"
dfs.namenode.heartbeat.recheck-interval=300000
yarn.nodemanager.resource.memory-mb=64GB
yarn.scheduler.maximum-allocation-mb=16GB
yarn.scheduler.minimum-allocation-mb=1GB
yarn.nodemanager.resource.cpu-vcores=16
mapreduce.map.memory.mb=4096
mapreduce.reduce.memory.mb=8192
mapreduce.map.java.opts=-Xmx3072m
mapreduce.reduce.java.opts=-Xmx6144m
mapreduce.job.reduces = (输入数据量 / 256MB)
✅ 使用:
mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
mapreduce.map.speculative=true
mapreduce.reduce.speculative=true
export HADOOP_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=200"
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar TestDFSIO
| 问题 | 原因 | 解决 |
|---|---|---|
| 任务慢 | 小文件多 | 合并小文件 |
| OOM | 内存不足 | 增大 container 内存 |
| CPU 空转 | reduce 数太少 | 增加 reduce |
| 磁盘 IO 高 | 副本多 | 调副本数 |
| 卡在 0% | 资源不足 | 检查 YARN |
yarn.nodemanager.resource.memory-mb=56GB
yarn.scheduler.maximum-allocation-mb=12GB
mapreduce.map.memory.mb=4096
mapreduce.reduce.memory.mb=8192
dfs.blocksize=256MB
如果你愿意,我可以:
给你一份 定制 Hadoop 优化方案。