0%

性能调优

Hadoop 性能调优:从操作系统到组件参数,一步一步来

Hadoop 集群跑得慢,原因可能出在任何一层——操作系统限制、JVM 参数、HDFS 配置、MapReduce 参数。盲目调参不如系统性地排查。

调优的原则是:先调操作系统,再调 Hadoop 参数。 底层不稳,上层再怎么调也是白搭。

操作系统层:必做项

这部分配置是 Hadoop 跑得稳的基础,不管什么场景都建议做。

1. 增大文件打开限制

Hadoop 在运行时会打开大量文件——HDFS 的数据块文件、MapReduce 的中间结果、日志文件。默认的 1024 不够用,会报 too many open files

1
2
3
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

改完重启或重新登录生效,用 ulimit -n 确认。

2. 关闭 swap 分区

Hadoop 对内存延迟敏感,swap 是磁盘 IO,比内存慢 10 万倍。一旦内存不够开始 swap,NameNode 或者 ResourceManager 的响应时间会急剧增加,整个集群跟着抖。

1
2
# /etc/sysctl.conf
vm.swappiness = 0

改完执行 sysctl -p 生效。如果服务器内存本身就小(比如 < 16GB),优先加内存,别指望 swap 兜底。

3. 调整网络连接队列

集群节点之间通信频繁,TCP 连接队列默认太小会丢包、重传,影响 Shuffle 性能。

1
2
3
# /etc/sysctl.conf
net.core.somaxconn = 65535 # 最大TCP连接队列长度,默认128
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列长度,默认1024

改完 sysctl -p 生效。

4. 设置磁盘预读缓冲区

Hadoop 处理大文件是顺序读,预读缓冲区提前把数据从磁盘读到内存,减少寻道时间。默认 128KB 偏小,大文件场景建议调到 2MB 或更大。

1
2
3
4
5
# 查看当前值(单位是 512 字节扇区)
blockdev --getra /dev/sda

# 设置为 2MB(4096 × 512 = 2MB)
blockdev --setra 4096 /dev/sda

永久生效需要写到 /etc/rc.local

HDFS 层:按数据特点调

1. 块大小(dfs.blocksize)

数据特点 建议块大小 原因
大文件(日志、视频) 256MB 或 512MB 减少块数量,降低 NameNode 元数据压力
小文件多 128MB(默认) 调大对小文件没帮助,问题在文件数量不在块大小

2. 副本数(dfs.replication)

默认 3 份。核心数据保持 3 份,临时数据降到 2 份能省存储空间。单节点测试必须设为 1。

3. DataNode 处理线程数(dfs.datanode.handler.count)

默认 10,高并发读写场景调到 20-30。设太高线程切换开销增加,不划算。

MapReduce 层:按任务特点调

1. Map/Reduce 并发数

mapreduce.tasktracker.map.tasks.maximumreduce.tasks.maximum 控制单节点同时跑多少个 Map/Reduce 任务。默认都是 2,对于现在的硬件来说偏保守。

节点配置 Map 并发数 Reduce 并发数
8 核 32GB 4-6 2-4
16 核 64GB 6-10 4-6

Reduce 任务通常比 Map 吃内存,并发数适当少一些。

2. 内存配置

  • Map 任务内存:mapreduce.map.memory.mb,默认 1024MB,大任务调到 2048-4096
  • Reduce 任务内存:mapreduce.reduce.memory.mb,默认 1024MB,聚合任务调到 4096-8192
  • JVM 堆内存:mapreduce.map.java.optsreduce.java.opts,设为总内存的 80% 左右

3. 容器内存粒度(YARN)

yarn.scheduler.minimum-allocation-mb 控制单个容器最小内存,默认 1024MB。如果集群里大量小任务(每个只需要 512MB),设 1024 会造成浪费;如果任务都很大(4GB+),设 1024 会导致申请 4GB 需要 4 个最小单元,调度效率低。

原则:让最小内存接近大多数任务的单容器需求,减少资源碎片。

YARN 层:按集群资源调

参数 默认值 说明
yarn.nodemanager.resource.memory-mb —(需手动设) 节点给 YARN 用的总内存,留 20% 给操作系统
yarn.nodemanager.resource.cpu-vcores —(需手动设) 节点给 YARN 用的 CPU 核数,留 20% 给系统
yarn.scheduler.minimum-allocation-mb 1024 单个容器最小内存,越小资源利用率越高,但调度开销也越大
yarn.scheduler.maximum-allocation-mb 8192 单个容器最大内存,设太大可能导致大任务占满节点

调优流程:先定位瓶颈,再动手

不要上来就改参数。正确的流程是:

  1. 看监控:Hadoop Web UI(HDFS 9870、YARN 8088)看集群状态,哪个组件资源满了
  2. 确认瓶颈类型:CPU 满 → 加并发/换 CPU;内存满 → 加内存/调参数;磁盘 IO 满 → 换 SSD/加磁盘;网络满 → 加带宽/开压缩
  3. 每次只改 1-2 个参数,改完跑测试,对比前后性能
  4. 改前备份配置文件,改崩了能回滚

不要一次改十几个参数,出问题不知道是谁导致的

欢迎关注我的其它发布渠道