在 Linux 上运行 Hadoop(通常是 HDFS + YARN + MapReduce/Spark)时,调优分为操作系统层、HDFS 层、YARN 层、MapReduce/计算层以及硬件与架构层。下面按“由下而上”的方式给你一个较系统的调优指南。
Hadoop 会打开大量文件和网络连接。
# 查看
ulimit -n
ulimit -u
# 修改 /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
Swap 会严重影响 HDFS / YARN 性能。
swapoff -a
# 永久禁用:注释 /etc/fstab 中的 swap 行
mount -o noatime,nodiratime /dev/sdb /data
# /etc/sysctl.conf
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 8192
sysctl -p
echo mq-deadline > /sys/block/sda/queue/scheduler
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
NameNode 内存 ≈ 文件数 × 150–300 bytes
export HADOOP_NAMENODE_OPTS="-Xmx12g"
dfs.datanode.max.transfer.threads=8192
dfs.datanode.balance.bandwidthPerSec=50M
yarn.nodemanager.resource.memory-mb=64G
yarn.nodemanager.resource.cpu-vcores=16
yarn.scheduler.minimum-allocation-mb=1G
yarn.scheduler.maximum-allocation-mb=32G
mapreduce.job.jvm.numtasks=-1
mapreduce.input.fileinputformat.split.minsize
mapreduce.job.maps
mapreduce.job.reduces
经验:
mapreduce.map.memory.mb=4G
mapreduce.reduce.memory.mb=8G
mapreduce.map.java.opts=-Xmx3G
mapreduce.map.output.compress=true
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec
--executor-memory 8G
--executor-cores 4
--num-executors 10
spark.memory.fraction=0.6
hdfs dfsadmin -report
yarn node -list
top / iostat -x 1
如果你愿意,可以告诉我:
我可以直接给你一套可落地的配置示例。