Hadoop 性能调优:从操作系统到组件参数,一步一步来
Hadoop 集群跑得慢,原因可能出在任何一层——操作系统限制、JVM 参数、HDFS 配置、MapReduce 参数。盲目调参不如系统性地排查。
调优的原则是:先调操作系统,再调 Hadoop 参数。 底层不稳,上层再怎么调也是白搭。
操作系统层:必做项
这部分配置是 Hadoop 跑得稳的基础,不管什么场景都建议做。
1. 增大文件打开限制
Hadoop 在运行时会打开大量文件——HDFS 的数据块文件、MapReduce 的中间结果、日志文件。默认的 1024 不够用,会报 too many open files。
1 | # /etc/security/limits.conf |
改完重启或重新登录生效,用 ulimit -n 确认。
2. 关闭 swap 分区
Hadoop 对内存延迟敏感,swap 是磁盘 IO,比内存慢 10 万倍。一旦内存不够开始 swap,NameNode 或者 ResourceManager 的响应时间会急剧增加,整个集群跟着抖。
1 | # /etc/sysctl.conf |
改完执行 sysctl -p 生效。如果服务器内存本身就小(比如 < 16GB),优先加内存,别指望 swap 兜底。
3. 调整网络连接队列
集群节点之间通信频繁,TCP 连接队列默认太小会丢包、重传,影响 Shuffle 性能。
1 | # /etc/sysctl.conf |
改完 sysctl -p 生效。
4. 设置磁盘预读缓冲区
Hadoop 处理大文件是顺序读,预读缓冲区提前把数据从磁盘读到内存,减少寻道时间。默认 128KB 偏小,大文件场景建议调到 2MB 或更大。
1 | # 查看当前值(单位是 512 字节扇区) |
永久生效需要写到 /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.maximum 和 reduce.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.opts和reduce.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 | 单个容器最大内存,设太大可能导致大任务占满节点 |
调优流程:先定位瓶颈,再动手
不要上来就改参数。正确的流程是:
- 看监控:Hadoop Web UI(HDFS 9870、YARN 8088)看集群状态,哪个组件资源满了
- 确认瓶颈类型:CPU 满 → 加并发/换 CPU;内存满 → 加内存/调参数;磁盘 IO 满 → 换 SSD/加磁盘;网络满 → 加带宽/开压缩
- 每次只改 1-2 个参数,改完跑测试,对比前后性能
- 改前备份配置文件,改崩了能回滚
不要一次改十几个参数,出问题不知道是谁导致的