在 Linux 上部署和调优 Hadoop(HDFS / YARN / MapReduce)性能,通常从 操作系统、HDFS、YARN、MapReduce、网络与磁盘 几个层面入手。下面给你一套实用向的调优清单,偏生产环境。
Hadoop 会打开大量文件。
# /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
swap 会导致 JVM GC 卡顿。
swapoff -a
# 永久:注释 /etc/fstab 中 swap 行
对 HDD 用 deadline,SSD 用 noop
echo deadline > /sys/block/sda/queue/scheduler
defaults,noatime,nodiratime
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
NameNode 内存 ≈ 文件数 × 150–300 Byte
export HADOOP_NAMENODE_OPTS="-Xmx16g"
dfs.replication=2
dfs.client.write.packet.size=65536
dfs.datanode.max.transfer.threads=8192
yarn.nodemanager.resource.memory-mb=64GB
yarn.nodemanager.resource.cpu-vcores=16
yarn.scheduler.minimum-allocation-mb=1024
yarn.scheduler.maximum-allocation-mb=32768
mapreduce.job.jvm.numtasks=-1
mapreduce.job.maps=节点数 × cpu核数
mapreduce.job.reduces=0.95 × reducetask槽位
mapreduce.map.memory.mb=4096
mapreduce.reduce.memory.mb=8192
mapreduce.map.java.opts=-Xmx3072m
mapreduce.reduce.java.opts=-Xmx6144m
mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
dfs.datanode.data.dir=/data1/dfs,/data2/dfs,/data3/dfs
dfs.datanode.handler.count=20
mapreduce.task.io.sort.factor=64
| 现象 | 可能原因 |
|---|---|
| Map 慢 | 小文件多 / 数据倾斜 |
| Reduce 慢 | Shuffle 大 / 内存不足 |
| 整体卡 | GC / swap / 磁盘 IO |
| 任务失败 | Container 内存超了 |
jstat -gc如果你愿意,可以告诉我:
我可以直接给你一份可复制的调优配置。